From ea0466947cb23813cfdc20eb99cd1f32884f5e29 Mon Sep 17 00:00:00 2001 From: ddaodan <731882332@qq.com> Date: Tue, 27 Aug 2024 17:24:14 +0800 Subject: [PATCH] =?UTF-8?q?2.6=20-=20=E6=B7=BB=E5=8A=A0=E8=A7=92=E8=89=B2?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=20-=20=E7=A7=BB=E9=99=A4prompt=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 2 +- changelog.md | 3 ++ readme.md | 4 +- .../ddaodan/MineChatGPT/CommandHandler.java | 33 +++++++++++-- .../ddaodan/MineChatGPT/ConfigManager.java | 46 +++++++++++++++---- .../MineChatGPT/MineChatGPTTabCompleter.java | 11 +++-- src/main/resources/config.yml | 26 +++++++---- src/main/resources/config_zh.yml | 22 ++++++--- src/main/resources/plugin.yml | 3 ++ 9 files changed, 115 insertions(+), 35 deletions(-) diff --git a/build.gradle b/build.gradle index ceb29c6..3cd8e83 100644 --- a/build.gradle +++ b/build.gradle @@ -4,7 +4,7 @@ plugins { } group = 'com' -version = '2.5' +version = '2.6' repositories { mavenCentral() diff --git a/changelog.md b/changelog.md index cfc0952..5bf56f4 100644 --- a/changelog.md +++ b/changelog.md @@ -1,4 +1,7 @@ # 更新日志 +## 2.6 +- 添加角色功能 +- 移除prompt功能 ## 2.5 - 允许插件在Folia加载 - 修复 #4:[BUG]部分情况下回复乱码 diff --git a/readme.md b/readme.md index 4da6fce..378e85e 100644 --- a/readme.md +++ b/readme.md @@ -1,6 +1,6 @@ # MineChatGPT -![minechatgpt](https://socialify.git.ci/ddaodan/minechatgpt/image?description=1&descriptionEditable=%E5%9C%A8Minecraft%E4%B8%AD%E4%B8%8EChatGPT%E4%BA%A4%E6%B5%81&font=Inter&issues=1&language=1&name=1&pattern=Solid&stargazers=1&theme=Auto) -![modrinth-gallery](https://cdn.jsdelivr.net/npm/@intergrav/devins-badges@3/assets/cozy-minimal/documentation/modrinth-gallery_vector.svg) ![spigot](https://cdn.jsdelivr.net/npm/@intergrav/devins-badges@3/assets/cozy-minimal/supported/spigot_vector.svg) ![paper](https://cdn.jsdelivr.net/npm/@intergrav/devins-badges@3/assets/cozy-minimal/supported/paper_vector.svg) ![java8](https://cdn.jsdelivr.net/npm/@intergrav/devins-badges@3/assets/cozy-minimal/built-with/java8_vector.svg) +![minechatgpt](https://socialify.git.ci/ddaodan/minechatgpt/image?description=1&descriptionEditable=%E5%9C%A8Minecraft%E4%B8%AD%E4%B8%8EChatGPT%E4%BA%A4%E6%B5%81&font=Inter&issues=1&language=1&name=1&pattern=Solid&stargazers=1&theme=Auto) +![modrinth-gallery](https://cdn.jsdelivr.net/npm/@intergrav/devins-badges@3/assets/cozy-minimal/documentation/modrinth-gallery_vector.svg) ![spigot](https://cdn.jsdelivr.net/npm/@intergrav/devins-badges@3/assets/cozy-minimal/supported/spigot_vector.svg) ![paper](https://cdn.jsdelivr.net/npm/@intergrav/devins-badges@3/assets/cozy-minimal/supported/paper_vector.svg) ![java8](https://cdn.jsdelivr.net/npm/@intergrav/devins-badges@3/assets/cozy-minimal/built-with/java8_vector.svg) ![GitHub Release](https://img.shields.io/github/v/release/ddaodan/minechatgpt?label=version) ![bStats Servers](https://img.shields.io/bstats/servers/22635) ![bStats Players](https://img.shields.io/bstats/players/22635) ![Modrinth Downloads](https://img.shields.io/modrinth/dt/Op2X2eDG?logo=modrinth) ![Spiget Downloads](https://img.shields.io/spiget/downloads/118963?logo=spigotmc) 在Minecraft中与ChatGPT交流 diff --git a/src/main/java/com/ddaodan/MineChatGPT/CommandHandler.java b/src/main/java/com/ddaodan/MineChatGPT/CommandHandler.java index 23f0843..0ebc35b 100644 --- a/src/main/java/com/ddaodan/MineChatGPT/CommandHandler.java +++ b/src/main/java/com/ddaodan/MineChatGPT/CommandHandler.java @@ -100,6 +100,27 @@ public class CommandHandler implements CommandExecutor { conversationContext.clearHistory(); sender.sendMessage(configManager.getClearMessage()); return true; + } else if (subCommand.equalsIgnoreCase("character")) { + if (!sender.hasPermission("minechatgpt.character")) { + sender.sendMessage(configManager.getNoPermissionMessage().replace("%s", "minechatgpt.character")); + return true; + } + Map characters = configManager.getCharacters(); + if (args.length < 2) { + sender.sendMessage(configManager.getAvailableCharactersMessage()); + for (String character : characters.keySet()) { + sender.sendMessage("- " + character); + } + return true; + } + String character = args[1]; + if (characters.containsKey(character)) { + configManager.setCurrentCharacter(userId, character); + sender.sendMessage(configManager.getCharacterSwitchedMessage().replace("%s", character)); + } else { + sender.sendMessage(configManager.getInvalidCharacterMessage()); + } + return true; } else { if (!sender.hasPermission("minechatgpt.use")) { sender.sendMessage(configManager.getNoPermissionMessage().replace("%s", "minechatgpt.use")); @@ -110,21 +131,22 @@ public class CommandHandler implements CommandExecutor { conversationContext.addMessage(question); } sender.sendMessage(configManager.getQuestionMessage().replace("%s", question)); - askChatGPT(sender, question, conversationContext, contextEnabled); + askChatGPT(sender, question, conversationContext, contextEnabled, userId); return true; } } return false; } - private void askChatGPT(CommandSender sender, String question, ConversationContext conversationContext, boolean contextEnabled) { + private void askChatGPT(CommandSender sender, String question, ConversationContext conversationContext, boolean contextEnabled, String userId) { String utf8Question = convertToUTF8(question); JSONObject json = new JSONObject(); json.put("model", configManager.getDefaultModel()); JSONArray messages = new JSONArray(); // 添加自定义 prompt - String customPrompt = configManager.getCustomPrompt(); - if (!customPrompt.isEmpty()) { + String currentCharacter = configManager.getCurrentCharacter(userId); + String customPrompt = configManager.getCharacters().get(currentCharacter); + if (customPrompt != null && !customPrompt.isEmpty()) { JSONObject promptMessage = new JSONObject(); promptMessage.put("role", "system"); promptMessage.put("content", customPrompt); @@ -169,7 +191,7 @@ public class CommandHandler implements CommandExecutor { String utf8ResponseBody = new String(responseBody.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8); JSONObject jsonResponse = new JSONObject(utf8ResponseBody); String answer = jsonResponse.getJSONArray("choices").getJSONObject(0).getJSONObject("message").getString("content"); - sender.sendMessage(configManager.getChatGPTResponseMessage().replace("%s", answer)); + sender.sendMessage(configManager.getChatGPTResponseMessage().replaceFirst("%s", currentCharacter).replaceFirst("%s", answer)); if (contextEnabled) { conversationContext.addMessage(answer); // 仅在启用上下文时添加AI响应到历史记录 } @@ -204,5 +226,6 @@ public class CommandHandler implements CommandExecutor { sender.sendMessage(configManager.getHelpModelListMessage()); sender.sendMessage(configManager.getHelpContextMessage()); sender.sendMessage(configManager.getHelpClearMessage()); + sender.sendMessage(configManager.getHelpCharacterMessage()); } } \ No newline at end of file diff --git a/src/main/java/com/ddaodan/MineChatGPT/ConfigManager.java b/src/main/java/com/ddaodan/MineChatGPT/ConfigManager.java index 3ea3270..8891774 100644 --- a/src/main/java/com/ddaodan/MineChatGPT/ConfigManager.java +++ b/src/main/java/com/ddaodan/MineChatGPT/ConfigManager.java @@ -2,7 +2,10 @@ package com.ddaodan.MineChatGPT; import org.bukkit.ChatColor; import org.bukkit.configuration.file.FileConfiguration; + +import java.util.HashMap; import java.util.List; +import java.util.Map; public class ConfigManager { private final Main plugin; @@ -46,9 +49,6 @@ public class ConfigManager { public List getModels() { return config.getStringList("models"); } - public String getCustomPrompt() { - return config.getString("prompt", "You are a helpful assistant."); - } public String getHelpMessage() { return translateColorCodes(config.getString("messages.help")); } @@ -65,10 +65,13 @@ public class ConfigManager { return translateColorCodes(config.getString("messages.help_modellist")); } public String getHelpContextMessage() { - return translateColorCodes(config.getString("messages.help_context", "/chatgpt context - Toggle context mode.")); + return translateColorCodes(config.getString("messages.help_context", "&e/chatgpt context - Toggle context mode.")); } public String getHelpClearMessage() { - return translateColorCodes(config.getString("messages.help_clear", "/chatgpt clear - Clear conversation history.")); + return translateColorCodes(config.getString("messages.help_clear", "&e/chatgpt clear - Clear conversation history.")); + } + public String getHelpCharacterMessage() { + return translateColorCodes(config.getString("messages.help_character", "&e/chatgpt character [character_name] - List or switch to a character.")); } public String getModelSwitchMessage() { return translateColorCodes(config.getString("messages.model_switch")); @@ -77,7 +80,7 @@ public class ConfigManager { return translateColorCodes(config.getString("messages.chatgpt_error")); } public String getChatGPTResponseMessage() { - return translateColorCodes(config.getString("messages.chatgpt_response")); + return translateColorCodes(config.getString("messages.chatgpt_response", "&b%s: %s")); } public String getQuestionMessage() { return translateColorCodes(config.getString("messages.question")); @@ -101,15 +104,38 @@ public class ConfigManager { return config.getBoolean("conversation.context_enabled", false); } public String getContextToggleMessage() { - return translateColorCodes(config.getString("messages.context_toggle", "Context is now %s.")); + return translateColorCodes(config.getString("messages.context_toggle", "&eContext is now %s.")); } public String getContextToggleEnabledMessage() { - return translateColorCodes(config.getString("messages.context_toggle_enabled", "enabled")); + return translateColorCodes(config.getString("messages.context_toggle_enabled", "&aenabled")); } public String getContextToggleDisabledMessage() { - return translateColorCodes(config.getString("messages.context_toggle_disabled", "disabled")); + return translateColorCodes(config.getString("messages.context_toggle_disabled", "&edisabled")); } public String getClearMessage() { - return translateColorCodes(config.getString("messages.clear", "Conversation history has been cleared.")); + return translateColorCodes(config.getString("messages.clear", "&aConversation history has been cleared.")); + } + public String getCharacterSwitchedMessage() { + return translateColorCodes(config.getString("messages.character_switched", "&aSwitched to character: %s")); + } + public String getAvailableCharactersMessage() { + return translateColorCodes(config.getString("messages.available_characters", "&eAvailable characters:")); + } + public String getInvalidCharacterMessage() { + return translateColorCodes(config.getString("messages.invalid_character", "&cInvalid character. Use /chatgpt character to list available characters.")); + } + public Map getCharacters() { + Map characters = new HashMap<>(); + config.getConfigurationSection("characters").getKeys(false).forEach(key -> { + characters.put(key, config.getString("characters." + key)); + }); + return characters; + } + public String getCurrentCharacter(String userId) { + return config.getString("users." + userId + ".character", "ChatGPT"); + } + public void setCurrentCharacter(String userId, String character) { + config.set("users." + userId + ".character", character); + plugin.saveConfig(); } } \ No newline at end of file diff --git a/src/main/java/com/ddaodan/MineChatGPT/MineChatGPTTabCompleter.java b/src/main/java/com/ddaodan/MineChatGPT/MineChatGPTTabCompleter.java index ce5b0f7..f3c875b 100644 --- a/src/main/java/com/ddaodan/MineChatGPT/MineChatGPTTabCompleter.java +++ b/src/main/java/com/ddaodan/MineChatGPT/MineChatGPTTabCompleter.java @@ -25,9 +25,14 @@ public class MineChatGPTTabCompleter implements TabCompleter { completions.add("modellist"); completions.add("context"); completions.add("clear"); - } else if (args.length == 2 && args[0].equalsIgnoreCase("model")) { - // 补全模型名称 - completions.addAll(configManager.getModels()); + completions.add("character"); + } else if (args.length == 2) { + String subCommand = args[0]; + if (subCommand.equalsIgnoreCase("model")) { + completions.addAll(configManager.getModels()); + } else if (subCommand.equalsIgnoreCase("character")) { + completions.addAll(configManager.getCharacters().keySet()); + } } // 过滤补全列表以匹配输入 diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 63e052d..b7b77d1 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -24,30 +24,40 @@ models: # And more... # The default model to use default_model: "gpt-3.5-turbo" +# Conversation setting conversation: # Continuous conversation switch context_enabled: false + # Maximum number of historical records retained max_history_size: 10 -prompt: "You are a helpful assistant." +# Characters setting +characters: + # Format: + # Character Name: "Character Prompt" + ChatGPT: "You are a helpful assistant." # Message settings messages: reload: "&aConfiguration reloaded successfully!" - clear: "Conversation history has been cleared!" + clear: "&aConversation history has been cleared!" help: "&e===== MineChatGPT Help =====" help_ask: "&e/chatgpt - Ask ChatGPT a question." help_reload: "&e/chatgpt reload - Reload the configuration file." help_model: "&e/chatgpt model - Switch to a different model." help_modellist: "&e/chatgpt modellist - List available models." - help_context: "/chatgpt context - Toggle context mode." - help_clear: "/chatgpt clear - Clear conversation history." - context_toggle: "Context is now %s." - context_toggle_enabled: "enabled" - context_toggle_disabled: "disabled" + help_context: "&e/chatgpt context - Toggle context mode." + help_clear: "&e/chatgpt clear - Clear conversation history." + help_character: "&e/chatgpt character [character_name] - List or switch to a character." + context_toggle: "&eContext is now %s." + context_toggle_enabled: "&aenabled" + context_toggle_disabled: "&cdisabled" current_model_info: "&eCurrent model: %s. Use /chatgpt model to switch models." model_switch: "&aModel switched to %s" chatgpt_error: "&cFailed to contact ChatGPT." - chatgpt_response: "&bChatGPT: %s" + chatgpt_response: "&b%s: %s" question: "&bYou: %s" + character_switched: "&aSwitched to character: %s" + available_characters: "&eAvailable characters:" + invalid_character: "&cInvalid character. Use /chatgpt character to list available characters." invalid_model: "&cInvalid model. Use /chatgpt modellist to see available models." available_models: "&eAvailable models:" no_permission: "&cYou do not have permission to use this command. Required permission: %s" diff --git a/src/main/resources/config_zh.yml b/src/main/resources/config_zh.yml index bb41851..666d686 100644 --- a/src/main/resources/config_zh.yml +++ b/src/main/resources/config_zh.yml @@ -24,11 +24,17 @@ models: # 以及更多... # 默认使用的模型 default_model: "gpt-3.5-turbo" +# 连续对话设置 conversation: # 连续对话开关 context_enabled: false + # 最大历史记录保留数量 max_history_size: 10 -prompt: "You are a helpful assistant.use Chinese." +# 角色设置 +characters: + # 格式: + # 角色名称: "角色提示词" + ChatGPT: "You are a helpful assistant." # 消息相关设置 messages: reload: "&a已重新加载配置文件!" @@ -39,15 +45,19 @@ messages: help_model: "&e/chatgpt model - 切换至其他模型" help_modellist: "&e/chatgpt modellist - 可用的模型列表" help_context: "&e/chatgpt context - 切换连续对话模式" - help_clear: "/chatgpt clear - 清空对话历史" - context_toggle: "&a连续对话模式已%s。" - context_toggle_enabled: "开启" - context_toggle_disabled: "关闭" + help_clear: "&e/chatgpt clear - 清空对话历史" + help_character: "&e/chatgpt character [character_name] - 列出或切换角色" + context_toggle: "&e连续对话模式已%s。" + context_toggle_enabled: "&a开启" + context_toggle_disabled: "&c关闭" current_model_info: "&e当前模型:%s,输入 /chatgpt model 来切换模型。" model_switch: "&a已切换至模型 %s" chatgpt_error: "&c无法联系ChatGPT。" - chatgpt_response: "&bChatGPT: %s" + chatgpt_response: "&b%s: %s" question: "&b你: %s" + character_switched: "&a已切换至角色: %s" + available_characters: "&e可用的角色列表:" + invalid_character: "&c无效的角色。使用 /chatgpt character 查看所有可用的角色。" invalid_model: "&c模型无效。使用 /chatgpt modellist 查看可用模型。" available_models: "&e可用模型列表:" no_permission: "&c你没有权限使用这个指令。需要的权限:%s" diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index db5fc22..b6137c3 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -27,4 +27,7 @@ permissions: default: true minechatgpt.clear: description: Allows clearing conversation history + default: true + minechatgpt.character: + description: Allows switching characters default: true \ No newline at end of file