From 67095f97b15d7c51417127c3aa0730d20ae89ce6 Mon Sep 17 00:00:00 2001 From: Soulter <905617992@qq.com> Date: Fri, 14 Feb 2025 01:43:52 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9B=20fix:=20delete=20conversation=20?= =?UTF-8?q?=E2=9C=A8=20feat:=20supports=20active=20reply=20whitelist?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- astrbot/core/config/default.py | 8 ++++++++ astrbot/core/conversation_mgr.py | 1 + astrbot/core/db/sqlite.py | 4 ++++ packages/astrbot/long_term_memory.py | 7 +++++++ packages/astrbot/main.py | 4 +++- 5 files changed, 23 insertions(+), 1 deletion(-) diff --git a/astrbot/core/config/default.py b/astrbot/core/config/default.py index 3a3f64b0..507e5465 100644 --- a/astrbot/core/config/default.py +++ b/astrbot/core/config/default.py @@ -66,6 +66,7 @@ DEFAULT_CONFIG = { "method": "possibility_reply", "possibility_reply": 0.1, "prompt": "", + "whitelist": [] } }, "content_safety": { @@ -815,6 +816,13 @@ CONFIG_METADATA_2 = { "obvious_hint": True, "hint": "启用后,会根据触发概率主动回复群聊内的对话。QQ官方API(qq_official)不可用", }, + "whitelist": { + "description": "主动回复白名单", + "type": "list", + "items": {"type": "string"}, + "obvious_hint": True, + "hint": "启用后,只有在白名单内的群聊会被主动回复。为空时不启用白名单过滤。需要通过 /sid 获取 SID 添加到这里。", + }, "method": { "description": "回复方法", "type": "string", diff --git a/astrbot/core/conversation_mgr.py b/astrbot/core/conversation_mgr.py index 7aca8029..d905219a 100644 --- a/astrbot/core/conversation_mgr.py +++ b/astrbot/core/conversation_mgr.py @@ -50,6 +50,7 @@ class ConversationManager(): cid=conversation_id ) del self.session_conversations[unified_msg_origin] + sp.put("session_conversation", self.session_conversations) async def get_curr_conversation_id(self, unified_msg_origin: str) -> str: '''获取会话当前的对话 ID''' diff --git a/astrbot/core/db/sqlite.py b/astrbot/core/db/sqlite.py index b81aef77..fecd251d 100644 --- a/astrbot/core/db/sqlite.py +++ b/astrbot/core/db/sqlite.py @@ -247,6 +247,10 @@ class SQLiteDatabase(BaseDatabase): res = c.fetchone() c.close() + + if not res: + return + return Conversation(*res) def new_conversation(self, user_id: str, cid: str): diff --git a/packages/astrbot/long_term_memory.py b/packages/astrbot/long_term_memory.py index f1ec8b25..69c474bb 100644 --- a/packages/astrbot/long_term_memory.py +++ b/packages/astrbot/long_term_memory.py @@ -32,6 +32,7 @@ class LongTermMemory: self.ar_method = self.active_reply["method"] self.ar_possibility = self.active_reply["possibility_reply"] self.ar_prompt = self.active_reply.get("prompt", "") + self.ar_whitelist = self.active_reply.get("whitelist", []) # self.put_history_to_prompt = self.config["put_history_to_prompt"] @@ -67,6 +68,12 @@ class LongTermMemory: if event.is_at_or_wake_command: # if the message is a command, let it pass return False + + if self.ar_whitelist and ( + event.unified_msg_origin not in self.ar_whitelist + and (event.get_group_id() and event.get_group_id() not in self.ar_whitelist) + ): + return False match self.ar_method: case "possibility_reply": diff --git a/packages/astrbot/main.py b/packages/astrbot/main.py index 5d2c978f..6846fa5b 100644 --- a/packages/astrbot/main.py +++ b/packages/astrbot/main.py @@ -785,7 +785,9 @@ UID: {user_id} 此 ID 可用于设置管理员。/op 授权管理员, /deo event.unified_msg_origin, session_curr_cid ) - history = json.loads(conv.history) + history = [] + if conv: + history = json.loads(conv.history) prompt = self.ltm.ar_prompt if not prompt: