From cc16548e5f9453c0ba9d6cc470db51e931f59869 Mon Sep 17 00:00:00 2001 From: anka <1350989414@qq.com> Date: Mon, 21 Apr 2025 11:56:12 +0800 Subject: [PATCH 1/8] =?UTF-8?q?feat:=20=F0=9F=98=BD=E5=AF=B9reset=E5=9C=A8?= =?UTF-8?q?=E4=B8=8D=E5=90=8C=E6=83=85=E5=86=B5=E4=B8=8B=E7=9A=84=E6=9D=83?= =?UTF-8?q?=E9=99=90=E7=89=B9=E6=AE=8A=E5=A4=84=E7=90=86,=20=E4=BD=BF?= =?UTF-8?q?=E5=85=B6=E5=85=BC=E5=AE=B9alter=5Fcmd?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/astrbot/main.py | 111 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 105 insertions(+), 6 deletions(-) diff --git a/packages/astrbot/main.py b/packages/astrbot/main.py index 17ce50bd1..4d1563194 100644 --- a/packages/astrbot/main.py +++ b/packages/astrbot/main.py @@ -479,14 +479,45 @@ UID: {user_id} 此 ID 可用于设置管理员。 @filter.command("reset") async def reset(self, message: AstrMessageEvent): """重置 LLM 会话""" + + # ============================== + # 读取当前情况和配置 + # ============================== is_unique_session = self.context.get_config()["platform_settings"][ "unique_session" ] - if message.get_group_id() and not is_unique_session and message.role != "admin": - # 群聊,没开独立会话,发送人不是管理员 + is_group = bool(message.get_group_id()) + + scene_key = "" + if is_group: + if is_unique_session: + scene_key = "group_unique_on" + else: + scene_key = "group_unique_off" + else: + scene_key = "private" + + alter_cmd_cfg = sp.get("alter_cmd", {}) + plugin_config = alter_cmd_cfg.get("astrbot", {}) + reset_cfg = plugin_config.get("reset", {}) + + required_perm = reset_cfg.get( + scene_key, "admin" if is_group and not is_unique_session else "member" + ) + + if required_perm == "admin" and message.role != "admin": + scene_names = { + "group_unique_on": "群聊+会话隔离开启", + "group_unique_off": "群聊+会话隔离关闭", + "private": "私聊", + } + message.set_result( MessageEventResult().message( - f"会话处于群聊,并且未开启独立会话,并且您 (ID {message.get_sender_id()}) 不是管理员,因此没有权限重置当前对话。" + f""" + 在{scene_names[scene_key]}场景下,reset命令需要管理员权限, + 您 (ID {message.get_sender_id()}) 不是管理员,无法执行此操作。 + """ ) ) return @@ -882,7 +913,9 @@ UID: {user_id} 此 ID 可用于设置管理员。 assert isinstance(provider, ProviderDify) dify_cid = provider.conversation_ids.pop(message.unified_msg_origin, None) if dify_cid: - await provider.api_client.delete_chat_conv(message.unified_msg_origin, dify_cid) + await provider.api_client.delete_chat_conv( + message.unified_msg_origin, dify_cid + ) message.set_result( MessageEventResult().message( "删除当前对话成功。不再处于对话状态,使用 /switch 序号 切换到其他对话或 /new 创建。" @@ -1233,7 +1266,9 @@ UID: {user_id} 此 ID 可用于设置管理员。 if mood_dialogs := persona["_mood_imitation_dialogs_processed"]: req.system_prompt += "\nHere are few shots of dialogs, you need to imitate the tone of 'B' in the following dialogs to respond:\n" req.system_prompt += mood_dialogs - if (begin_dialogs := persona["_begin_dialogs_processed"]) and not req.contexts: + if ( + begin_dialogs := persona["_begin_dialogs_processed"] + ) and not req.contexts: req.contexts[:0] = begin_dialogs if quote and quote.message_str: @@ -1265,13 +1300,77 @@ UID: {user_id} 此 ID 可用于设置管理员。 token = self.parse_commands(event.message_str) if token.len < 2: yield event.plain_result( - "可设置所有其他指令是否需要管理员权限。\n格式: /alter_cmd \n 例如: /alter_cmd provider admin 将 provider 设置为管理员指令" + "可设置所有其他指令是否需要管理员权限。\n格式: /alter_cmd \n 例如: /alter_cmd provider admin 将 provider 设置为管理员指令\n /alter_cmd reset config 打开reset权限配置" ) return cmd_name = token.get(1) cmd_type = token.get(2) + # ============================ + # 对reset权限进行特殊处理 + # ============================ + if cmd_name == "reset" and cmd_type == "config": + alter_cmd_cfg = sp.get("alter_cmd", {}) + plugin_ = alter_cmd_cfg.get("astrbot", {}) + reset_cfg = plugin_.get("reset", {}) + + group_unique_on = reset_cfg.get("group_unique_on", "admin") + group_unique_off = reset_cfg.get("group_unique_off", "admin") + private = reset_cfg.get("private", "member") + + config_menu = f"""reset命令权限细粒度配置 + 当前配置: + 1. 群聊+会话隔离开: {group_unique_on} + 2. 群聊+会话隔离关: {group_unique_off} + 3. 私聊: {private} + 修改指令格式: + /alter_cmd reset scene <场景编号> + 例如: /alter_cmd reset scene 2 member""" + yield event.plain_result(config_menu) + return + + if cmd_name == "reset" and cmd_type == "scene" and token.len >= 4: + scene_num = token.get(3) + perm_type = token.get(4) + + if not scene_num.isdigit() or int(scene_num) < 1 or int(scene_num) > 4: + yield event.plain_result("场景编号必须是1-3之间的数字") + return + + if perm_type not in ["admin", "member"]: + yield event.plain_result("权限类型错误,只能是admin或member") + return + + scene_num = int(scene_num) + scene_map = { + 1: "group_unique_on", + 2: "group_unique_off", + 3: "private", + } + + scene_key = scene_map[scene_num] + + alter_cmd_cfg = sp.get("alter_cmd", {}) + plugin_ = alter_cmd_cfg.get("astrbot", {}) + reset_cfg = plugin_.get("reset", {}) + + reset_cfg[scene_key] = perm_type + plugin_["reset"] = reset_cfg + alter_cmd_cfg["astrbot"] = plugin_ + sp.put("alter_cmd", alter_cmd_cfg) + + scene_names = { + 1: "群聊+会话隔离开启", + 2: "群聊+会话隔离关闭", + 3: "私聊", + } + + yield event.plain_result( + f"已将 reset 命令在{scene_names[scene_num]}场景下的权限设为{perm_type}" + ) + return + if cmd_type not in ["admin", "member"]: yield event.plain_result("指令类型错误,可选类型有 admin, member") return From c5b24b47645f167c09d57594e051ea8d171e1ee6 Mon Sep 17 00:00:00 2001 From: anka <1350989414@qq.com> Date: Mon, 21 Apr 2025 12:06:20 +0800 Subject: [PATCH 2/8] =?UTF-8?q?feat:=20=F0=9F=A4=A0=E4=B8=BAnew=E6=8C=87?= =?UTF-8?q?=E4=BB=A4=E5=A2=9E=E5=8A=A0=E6=B8=85=E7=90=86=E4=B8=8A=E4=B8=8B?= =?UTF-8?q?=E6=96=87=E9=80=89=E9=A1=B9,=20=E9=BB=98=E8=AE=A4=E4=B8=BA?= =?UTF-8?q?=E6=B8=85=E7=90=86,=20=E6=9B=B4=E7=AC=A6=E5=90=88=E7=9B=B4?= =?UTF-8?q?=E8=A7=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/astrbot/main.py | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/packages/astrbot/main.py b/packages/astrbot/main.py index 4d1563194..58047d7df 100644 --- a/packages/astrbot/main.py +++ b/packages/astrbot/main.py @@ -763,8 +763,13 @@ UID: {user_id} 此 ID 可用于设置管理员。 return @filter.command("new") - async def new_conv(self, message: AstrMessageEvent): - """创建新对话""" + async def new_conv(self, message: AstrMessageEvent, clean: bool = True): + """ + 创建新对话 + + Args: + clean(bool): 是否清理当前对话的上下文, 默认为 True. + """ provider = self.context.get_using_provider() if provider and provider.meta().type == "dify": assert isinstance(provider, ProviderDify) @@ -777,6 +782,20 @@ UID: {user_id} 此 ID 可用于设置管理员。 cid = await self.context.conversation_manager.new_conversation( message.unified_msg_origin ) + + # 判断是否清理上下文 + if clean: + await self.context.conversation_manager.update_conversation( + message.unified_msg_origin, cid, [] + ) + + # 长期记忆 + if self.ltm: + try: + await self.ltm.remove_session(event=message) + except BaseException as e: + logger.error(f"清理聊天增强记录失败: {e}") + message.set_result( MessageEventResult().message(f"切换到新对话: 新对话({cid[:4]})。") ) From 05daac12ed3dce95270af8ee4257125947f73587 Mon Sep 17 00:00:00 2001 From: anka <1350989414@qq.com> Date: Mon, 21 Apr 2025 12:35:08 +0800 Subject: [PATCH 3/8] =?UTF-8?q?refactor:=20=F0=9F=8D=94=E9=99=8D=E4=BD=8E?= =?UTF-8?q?=E5=A4=8D=E6=9D=82=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/astrbot/main.py | 78 +++++++++++++++++++--------------------- 1 file changed, 37 insertions(+), 41 deletions(-) diff --git a/packages/astrbot/main.py b/packages/astrbot/main.py index 58047d7df..d319b997c 100644 --- a/packages/astrbot/main.py +++ b/packages/astrbot/main.py @@ -33,6 +33,10 @@ from typing import Union version="4.0.0", ) class Main(star.Star): + + SCENE_MAP = {1: "group_unique_on", 2: "group_unique_off", 3: "private"} + SCENE_NAMES = {1: "群聊+会话隔离开启", 2: "群聊+会话隔离关闭", 3: "私聊"} + def __init__(self, context: star.Context) -> None: self.context = context cfg = context.get_config() @@ -488,14 +492,7 @@ UID: {user_id} 此 ID 可用于设置管理员。 ] is_group = bool(message.get_group_id()) - scene_key = "" - if is_group: - if is_unique_session: - scene_key = "group_unique_on" - else: - scene_key = "group_unique_off" - else: - scene_key = "private" + scene_key = self.get_scene_key(is_group, is_unique_session) alter_cmd_cfg = sp.get("alter_cmd", {}) plugin_config = alter_cmd_cfg.get("astrbot", {}) @@ -506,18 +503,10 @@ UID: {user_id} 此 ID 可用于设置管理员。 ) if required_perm == "admin" and message.role != "admin": - scene_names = { - "group_unique_on": "群聊+会话隔离开启", - "group_unique_off": "群聊+会话隔离关闭", - "private": "私聊", - } - message.set_result( MessageEventResult().message( - f""" - 在{scene_names[scene_key]}场景下,reset命令需要管理员权限, - 您 (ID {message.get_sender_id()}) 不是管理员,无法执行此操作。 - """ + f"在{self.SCENE_NAMES.get(scene_key, scene_key)}场景下,reset命令需要管理员权限," + f"您 (ID {message.get_sender_id()}) 不是管理员,无法执行此操作。" ) ) return @@ -1353,7 +1342,7 @@ UID: {user_id} 此 ID 可用于设置管理员。 scene_num = token.get(3) perm_type = token.get(4) - if not scene_num.isdigit() or int(scene_num) < 1 or int(scene_num) > 4: + if not scene_num.isdigit() or int(scene_num) < 1 or int(scene_num) > 3: yield event.plain_result("场景编号必须是1-3之间的数字") return @@ -1362,31 +1351,12 @@ UID: {user_id} 此 ID 可用于设置管理员。 return scene_num = int(scene_num) - scene_map = { - 1: "group_unique_on", - 2: "group_unique_off", - 3: "private", - } + scene_key = self.SCENE_MAP[scene_num] - scene_key = scene_map[scene_num] - - alter_cmd_cfg = sp.get("alter_cmd", {}) - plugin_ = alter_cmd_cfg.get("astrbot", {}) - reset_cfg = plugin_.get("reset", {}) - - reset_cfg[scene_key] = perm_type - plugin_["reset"] = reset_cfg - alter_cmd_cfg["astrbot"] = plugin_ - sp.put("alter_cmd", alter_cmd_cfg) - - scene_names = { - 1: "群聊+会话隔离开启", - 2: "群聊+会话隔离关闭", - 3: "私聊", - } + self.update_reset_permission(scene_key, perm_type) yield event.plain_result( - f"已将 reset 命令在{scene_names[scene_num]}场景下的权限设为{perm_type}" + f"已将 reset 命令在{self.SCENE_NAMES[scene_num]}场景下的权限设为{perm_type}" ) return @@ -1444,3 +1414,29 @@ UID: {user_id} 此 ID 可用于设置管理员。 ) yield event.plain_result(f"已将 {cmd_name} 设置为 {cmd_type} 指令") + + def update_reset_permission(self, scene_key: str, perm_type: str): + """更新reset命令在特定场景下的权限设置 + + Args: + scene_key (str): 场景编号,1-3 + perm_type (str): 权限类型,admin或member + """ + alter_cmd_cfg = sp.get("alter_cmd", {}) + plugin_cfg = alter_cmd_cfg.get("astrbot", {}) + reset_cfg = plugin_cfg.get("reset", {}) + reset_cfg[scene_key] = perm_type + plugin_cfg["reset"] = reset_cfg + alter_cmd_cfg["astrbot"] = plugin_cfg + sp.put("alter_cmd", alter_cmd_cfg) + + def get_scene_key(self, is_group: bool, is_unique_session: bool) -> str: + """根据群聊状态和会话隔离状态获取对应的场景键 + + Args: + is_group (bool): 是否为群聊 + is_unique_session (bool): 是否开启会话隔离 + """ + if is_group: + return "group_unique_on" if is_unique_session else "group_unique_off" + return "private" From 9326e3f1b07617eeee0ba010ebc6224df49367ce Mon Sep 17 00:00:00 2001 From: anka <1350989414@qq.com> Date: Tue, 22 Apr 2025 10:55:32 +0800 Subject: [PATCH 4/8] =?UTF-8?q?refactor:=20=E4=BD=BF=E7=94=A8enum=E4=BB=A3?= =?UTF-8?q?=E6=9B=BF=E5=AD=97=E5=85=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: 渡鸦95676 --- packages/astrbot/main.py | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/packages/astrbot/main.py b/packages/astrbot/main.py index d319b997c..1b1f7d4dc 100644 --- a/packages/astrbot/main.py +++ b/packages/astrbot/main.py @@ -35,7 +35,29 @@ from typing import Union class Main(star.Star): SCENE_MAP = {1: "group_unique_on", 2: "group_unique_off", 3: "private"} - SCENE_NAMES = {1: "群聊+会话隔离开启", 2: "群聊+会话隔离关闭", 3: "私聊"} +class RstScene(Enum): + GROUP_UNIQUE_ON = ("group_unique_on", "群聊+会话隔离开启") + GROUP_UNIQUE_OFF = ("group_unique_off", "群聊+会话隔离关闭") + PRIVATE = ("private", "私聊") + + @property + def key(self) -> str: + return self.value[0] + + @property + def name(self) -> str: + return self.value[1] + + @classmethod + def from_index(cls, index: int) -> "RstScene": + mapping = {1: cls.GROUP_UNIQUE_ON, 2: cls.GROUP_UNIQUE_OFF, 3: cls.PRIVATE} + return mapping[index] + + @classmethod + def get_scene(cls, is_group: bool, is_unique_session: bool) -> "RstScene": + if is_group: + return cls.GROUP_UNIQUE_ON if is_unique_session else cls.GROUP_UNIQUE_OFF + return cls.PRIVATE def __init__(self, context: star.Context) -> None: self.context = context From 40d6e779647ae783b122eb55fdbcecf75679c6e0 Mon Sep 17 00:00:00 2001 From: anka <1350989414@qq.com> Date: Tue, 22 Apr 2025 11:16:24 +0800 Subject: [PATCH 5/8] =?UTF-8?q?fix:=20=F0=9F=AB=93=E4=BD=BF=E7=94=A8enum?= =?UTF-8?q?=E4=BB=A3=E6=9B=BF=E5=AD=97=E5=85=B8=E5=90=8E=E7=9A=84=E4=B8=80?= =?UTF-8?q?=E4=BA=9B=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/astrbot/main.py | 41 ++++++++++++++++------------------------ 1 file changed, 16 insertions(+), 25 deletions(-) diff --git a/packages/astrbot/main.py b/packages/astrbot/main.py index 1b1f7d4dc..6a423925f 100644 --- a/packages/astrbot/main.py +++ b/packages/astrbot/main.py @@ -24,17 +24,9 @@ from .long_term_memory import LongTermMemory from astrbot.core import logger from astrbot.api.message_components import Plain, Image, Reply from typing import Union +from enum import Enum -@star.register( - name="astrbot", - desc="AstrBot 基础指令结合 + 拓展功能", - author="Soulter", - version="4.0.0", -) -class Main(star.Star): - - SCENE_MAP = {1: "group_unique_on", 2: "group_unique_off", 3: "private"} class RstScene(Enum): GROUP_UNIQUE_ON = ("group_unique_on", "群聊+会话隔离开启") GROUP_UNIQUE_OFF = ("group_unique_off", "群聊+会话隔离关闭") @@ -59,6 +51,15 @@ class RstScene(Enum): return cls.GROUP_UNIQUE_ON if is_unique_session else cls.GROUP_UNIQUE_OFF return cls.PRIVATE + +@star.register( + name="astrbot", + desc="AstrBot 基础指令结合 + 拓展功能", + author="Soulter", + version="4.0.0", +) +class Main(star.Star): + def __init__(self, context: star.Context) -> None: self.context = context cfg = context.get_config() @@ -514,20 +515,20 @@ UID: {user_id} 此 ID 可用于设置管理员。 ] is_group = bool(message.get_group_id()) - scene_key = self.get_scene_key(is_group, is_unique_session) + scene = RstScene.get_scene(is_group, is_unique_session) alter_cmd_cfg = sp.get("alter_cmd", {}) plugin_config = alter_cmd_cfg.get("astrbot", {}) reset_cfg = plugin_config.get("reset", {}) required_perm = reset_cfg.get( - scene_key, "admin" if is_group and not is_unique_session else "member" + scene.key, "admin" if is_group and not is_unique_session else "member" ) if required_perm == "admin" and message.role != "admin": message.set_result( MessageEventResult().message( - f"在{self.SCENE_NAMES.get(scene_key, scene_key)}场景下,reset命令需要管理员权限," + f"在{scene.name}场景下,reset命令需要管理员权限," f"您 (ID {message.get_sender_id()}) 不是管理员,无法执行此操作。" ) ) @@ -1373,12 +1374,13 @@ UID: {user_id} 此 ID 可用于设置管理员。 return scene_num = int(scene_num) - scene_key = self.SCENE_MAP[scene_num] + scene = RstScene.from_index(scene_num) + scene_key = scene.key self.update_reset_permission(scene_key, perm_type) yield event.plain_result( - f"已将 reset 命令在{self.SCENE_NAMES[scene_num]}场景下的权限设为{perm_type}" + f"已将 reset 命令在{scene.name}场景下的权限设为{perm_type}" ) return @@ -1451,14 +1453,3 @@ UID: {user_id} 此 ID 可用于设置管理员。 plugin_cfg["reset"] = reset_cfg alter_cmd_cfg["astrbot"] = plugin_cfg sp.put("alter_cmd", alter_cmd_cfg) - - def get_scene_key(self, is_group: bool, is_unique_session: bool) -> str: - """根据群聊状态和会话隔离状态获取对应的场景键 - - Args: - is_group (bool): 是否为群聊 - is_unique_session (bool): 是否开启会话隔离 - """ - if is_group: - return "group_unique_on" if is_unique_session else "group_unique_off" - return "private" From 70446be108e804c4d6916247d633b375f8be0431 Mon Sep 17 00:00:00 2001 From: Soulter <37870767+Soulter@users.noreply.github.com> Date: Wed, 23 Apr 2025 00:08:03 +0800 Subject: [PATCH 6/8] perf: catching a more specific exception type instead Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- packages/astrbot/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/astrbot/main.py b/packages/astrbot/main.py index 6a423925f..7569e742e 100644 --- a/packages/astrbot/main.py +++ b/packages/astrbot/main.py @@ -805,7 +805,7 @@ UID: {user_id} 此 ID 可用于设置管理员。 if self.ltm: try: await self.ltm.remove_session(event=message) - except BaseException as e: + except Exception as e: logger.error(f"清理聊天增强记录失败: {e}") message.set_result( From 15a5fc0cae517854f08deb3f9a04e97d198b9156 Mon Sep 17 00:00:00 2001 From: anka <1350989414@qq.com> Date: Wed, 23 Apr 2025 09:56:48 +0800 Subject: [PATCH 7/8] =?UTF-8?q?fix:=20=F0=9F=A7=A9revert=20logic=20of=20ne?= =?UTF-8?q?w=20func?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/astrbot/main.py | 18 +----------------- 1 file changed, 1 insertion(+), 17 deletions(-) diff --git a/packages/astrbot/main.py b/packages/astrbot/main.py index 7569e742e..578edb956 100644 --- a/packages/astrbot/main.py +++ b/packages/astrbot/main.py @@ -775,12 +775,9 @@ UID: {user_id} 此 ID 可用于设置管理员。 return @filter.command("new") - async def new_conv(self, message: AstrMessageEvent, clean: bool = True): + async def new_conv(self, message: AstrMessageEvent): """ 创建新对话 - - Args: - clean(bool): 是否清理当前对话的上下文, 默认为 True. """ provider = self.context.get_using_provider() if provider and provider.meta().type == "dify": @@ -795,19 +792,6 @@ UID: {user_id} 此 ID 可用于设置管理员。 message.unified_msg_origin ) - # 判断是否清理上下文 - if clean: - await self.context.conversation_manager.update_conversation( - message.unified_msg_origin, cid, [] - ) - - # 长期记忆 - if self.ltm: - try: - await self.ltm.remove_session(event=message) - except Exception as e: - logger.error(f"清理聊天增强记录失败: {e}") - message.set_result( MessageEventResult().message(f"切换到新对话: 新对话({cid[:4]})。") ) From 74c1e7f69e4568170a4e05b8b121c5337500c2ba Mon Sep 17 00:00:00 2001 From: anka <1350989414@qq.com> Date: Wed, 23 Apr 2025 11:24:17 +0800 Subject: [PATCH 8/8] =?UTF-8?q?fix:=20=E2=9A=92=EF=B8=8F=20=E4=BB=8D?= =?UTF-8?q?=E7=84=B6=E6=B8=85=E9=99=A4=E8=81=8A=E5=A4=A9=E5=A2=9E=E5=BC=BA?= =?UTF-8?q?=E8=AE=B0=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/astrbot/main.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/packages/astrbot/main.py b/packages/astrbot/main.py index 578edb956..9dcd4a688 100644 --- a/packages/astrbot/main.py +++ b/packages/astrbot/main.py @@ -792,6 +792,13 @@ UID: {user_id} 此 ID 可用于设置管理员。 message.unified_msg_origin ) + # 长期记忆 + if self.ltm: + try: + await self.ltm.remove_session(event=message) + except Exception as e: + logger.error(f"清理聊天增强记录失败: {e}") + message.set_result( MessageEventResult().message(f"切换到新对话: 新对话({cid[:4]})。") )