From f1c600d9b5db681ac725e21daaf468c3b5c96847 Mon Sep 17 00:00:00 2001 From: tt-P607 <68868379+tt-P607@users.noreply.github.com> Date: Wed, 29 Oct 2025 16:58:50 +0800 Subject: [PATCH] =?UTF-8?q?feat(chat):=20=E5=A2=9E=E5=BC=BA=E5=9B=9E?= =?UTF-8?q?=E5=A4=8D=E5=8A=9F=E8=83=BD=EF=BC=8C=E6=94=AF=E6=8C=81=E9=80=9A?= =?UTF-8?q?=E8=BF=87=E5=AD=97=E7=AC=A6=E4=B8=B2=E6=8C=87=E5=AE=9A=E5=B9=B6?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E7=94=A8=E6=88=B7ID?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 为了让插件能更灵活地构造回复消息,而无需依赖完整的原始消息对象,本次提交引入了新的回复机制。 - `send_api` 新增 `reply_to` 参数,允许使用 `昵称(ID)` 格式的字符串直接指定回复目标。 - 统一更新了回复消息的显示格式,在回复引文中一并展示用户昵称和ID,避免因昵称重复造成混淆。 --- src/chat/message_receive/message.py | 2 +- src/plugin_system/apis/send_api.py | 32 ++++++++++++++++--- .../src/recv_handler/message_handler.py | 6 +++- 3 files changed, 33 insertions(+), 7 deletions(-) diff --git a/src/chat/message_receive/message.py b/src/chat/message_receive/message.py index 90805ee12..facdef97a 100644 --- a/src/chat/message_receive/message.py +++ b/src/chat/message_receive/message.py @@ -590,7 +590,7 @@ class MessageProcessBase(Message): if self.reply and hasattr(self.reply, "processed_plain_text"): # print(f"self.reply.processed_plain_text: {self.reply.processed_plain_text}") # print(f"reply: {self.reply}") - return f"[回复<{self.reply.message_info.user_info.user_nickname}> 的消息:{self.reply.processed_plain_text}]" # type: ignore + return f"[回复<{self.reply.message_info.user_info.user_nickname}({self.reply.message_info.user_info.user_id})> 的消息:{self.reply.processed_plain_text}]" # type: ignore return None else: return f"[{seg.type}:{seg.data!s}]" diff --git a/src/plugin_system/apis/send_api.py b/src/plugin_system/apis/send_api.py index 527fb3333..e946286bc 100644 --- a/src/plugin_system/apis/send_api.py +++ b/src/plugin_system/apis/send_api.py @@ -272,12 +272,34 @@ async def _send_to_target( message_segment = Seg(type=message_type, data=content) # type: ignore # 处理回复消息 - if reply_to_message: + if reply_to: + # 优先使用 reply_to 字符串构建 anchor_message + # 解析 "发送者(ID)" 格式 + import re + match = re.match(r"(.+)\((\d+)\)", reply_to) + if match: + sender_name, sender_id = match.groups() + temp_message_dict = { + "user_nickname": sender_name, + "user_id": sender_id, + "chat_info_platform": target_stream.platform, + "message_id": "temp_reply_id", # 临时ID + "time": time.time() + } + anchor_message = message_dict_to_message_recv(message_dict=temp_message_dict) + else: + anchor_message = None + reply_to_platform_id = f"{target_stream.platform}:{sender_id}" if anchor_message else None + + elif reply_to_message: anchor_message = message_dict_to_message_recv(message_dict=reply_to_message) - anchor_message.update_chat_stream(target_stream) - reply_to_platform_id = ( - f"{anchor_message.message_info.platform}:{anchor_message.message_info.user_info.user_id}" - ) + if anchor_message: + anchor_message.update_chat_stream(target_stream) + reply_to_platform_id = ( + f"{anchor_message.message_info.platform}:{anchor_message.message_info.user_info.user_id}" + ) + else: + reply_to_platform_id = None else: anchor_message = None reply_to_platform_id = None diff --git a/src/plugins/built_in/napcat_adapter_plugin/src/recv_handler/message_handler.py b/src/plugins/built_in/napcat_adapter_plugin/src/recv_handler/message_handler.py index dad3698f1..2eb4cdd2e 100644 --- a/src/plugins/built_in/napcat_adapter_plugin/src/recv_handler/message_handler.py +++ b/src/plugins/built_in/napcat_adapter_plugin/src/recv_handler/message_handler.py @@ -715,12 +715,16 @@ class MessageHandler: reply_message = [Seg(type="text", data="(获取发言内容失败)")] sender_info: dict = message_detail.get("sender") sender_nickname: str = sender_info.get("nickname") + sender_id = sender_info.get("user_id") seg_message: List[Seg] = [] if not sender_nickname: logger.warning("无法获取被引用的人的昵称,返回默认值") seg_message.append(Seg(type="text", data="[回复 未知用户:")) else: - seg_message.append(Seg(type="text", data=f"[回复<{sender_nickname}>:")) + if sender_id: + seg_message.append(Seg(type="text", data=f"[回复<{sender_nickname}({sender_id})>:")) + else: + seg_message.append(Seg(type="text", data=f"[回复<{sender_nickname}>:")) seg_message += reply_message seg_message.append(Seg(type="text", data="],说:")) return seg_message