feat(chat): 增强回复功能,支持通过字符串指定并显示用户ID
为了让插件能更灵活地构造回复消息,而无需依赖完整的原始消息对象,本次提交引入了新的回复机制。 - `send_api` 新增 `reply_to` 参数,允许使用 `昵称(ID)` 格式的字符串直接指定回复目标。 - 统一更新了回复消息的显示格式,在回复引文中一并展示用户昵称和ID,避免因昵称重复造成混淆。
This commit is contained in:
@@ -590,7 +590,7 @@ class MessageProcessBase(Message):
|
|||||||
if self.reply and hasattr(self.reply, "processed_plain_text"):
|
if self.reply and hasattr(self.reply, "processed_plain_text"):
|
||||||
# print(f"self.reply.processed_plain_text: {self.reply.processed_plain_text}")
|
# print(f"self.reply.processed_plain_text: {self.reply.processed_plain_text}")
|
||||||
# print(f"reply: {self.reply}")
|
# 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
|
return None
|
||||||
else:
|
else:
|
||||||
return f"[{seg.type}:{seg.data!s}]"
|
return f"[{seg.type}:{seg.data!s}]"
|
||||||
|
|||||||
@@ -272,12 +272,34 @@ async def _send_to_target(
|
|||||||
message_segment = Seg(type=message_type, data=content) # type: ignore
|
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 = message_dict_to_message_recv(message_dict=reply_to_message)
|
||||||
|
if anchor_message:
|
||||||
anchor_message.update_chat_stream(target_stream)
|
anchor_message.update_chat_stream(target_stream)
|
||||||
reply_to_platform_id = (
|
reply_to_platform_id = (
|
||||||
f"{anchor_message.message_info.platform}:{anchor_message.message_info.user_info.user_id}"
|
f"{anchor_message.message_info.platform}:{anchor_message.message_info.user_info.user_id}"
|
||||||
)
|
)
|
||||||
|
else:
|
||||||
|
reply_to_platform_id = None
|
||||||
else:
|
else:
|
||||||
anchor_message = None
|
anchor_message = None
|
||||||
reply_to_platform_id = None
|
reply_to_platform_id = None
|
||||||
|
|||||||
@@ -715,10 +715,14 @@ class MessageHandler:
|
|||||||
reply_message = [Seg(type="text", data="(获取发言内容失败)")]
|
reply_message = [Seg(type="text", data="(获取发言内容失败)")]
|
||||||
sender_info: dict = message_detail.get("sender")
|
sender_info: dict = message_detail.get("sender")
|
||||||
sender_nickname: str = sender_info.get("nickname")
|
sender_nickname: str = sender_info.get("nickname")
|
||||||
|
sender_id = sender_info.get("user_id")
|
||||||
seg_message: List[Seg] = []
|
seg_message: List[Seg] = []
|
||||||
if not sender_nickname:
|
if not sender_nickname:
|
||||||
logger.warning("无法获取被引用的人的昵称,返回默认值")
|
logger.warning("无法获取被引用的人的昵称,返回默认值")
|
||||||
seg_message.append(Seg(type="text", data="[回复 未知用户:"))
|
seg_message.append(Seg(type="text", data="[回复 未知用户:"))
|
||||||
|
else:
|
||||||
|
if sender_id:
|
||||||
|
seg_message.append(Seg(type="text", data=f"[回复<{sender_nickname}({sender_id})>:"))
|
||||||
else:
|
else:
|
||||||
seg_message.append(Seg(type="text", data=f"[回复<{sender_nickname}>:"))
|
seg_message.append(Seg(type="text", data=f"[回复<{sender_nickname}>:"))
|
||||||
seg_message += reply_message
|
seg_message += reply_message
|
||||||
|
|||||||
Reference in New Issue
Block a user