diff --git a/astrbot/core/message/components.py b/astrbot/core/message/components.py index 44caa2075..389f0088a 100644 --- a/astrbot/core/message/components.py +++ b/astrbot/core/message/components.py @@ -311,10 +311,24 @@ class Image(BaseMessageComponent): class Reply(BaseMessageComponent): type: ComponentType = "Reply" id: T.Union[str, int] - text: T.Optional[str] = "" - qq: T.Optional[int] = 0 + """所引用的消息 ID""" + chain: T.Optional[T.List["BaseMessageComponent"]] = [] + """引用的消息段列表""" + sender_id: T.Optional[int] | T.Optional[str] = 0 + """引用的消息发送者 ID""" + sender_nickname: T.Optional[str] = "" + """引用的消息发送者昵称""" time: T.Optional[int] = 0 + """引用的消息发送时间""" + message_str: T.Optional[str] = "" + """解析后的纯文本消息字符串""" + + text: T.Optional[str] = "" + """deprecated""" + qq: T.Optional[int] = 0 + """deprecated""" seq: T.Optional[int] = 0 + """deprecated""" def __init__(self, **_): super().__init__(**_) diff --git a/astrbot/core/platform/astr_message_event.py b/astrbot/core/platform/astr_message_event.py index 72e4414b6..9ae3c99f7 100644 --- a/astrbot/core/platform/astr_message_event.py +++ b/astrbot/core/platform/astr_message_event.py @@ -14,6 +14,7 @@ from astrbot.core.message.components import ( At, AtAll, Forward, + Reply ) from astrbot.core.utils.metrics import Metric from astrbot.core.provider.entites import ProviderRequest @@ -101,8 +102,15 @@ class AstrMessageEvent(abc.ABC): elif isinstance(i, Forward): # 转发消息 outline += "[转发消息]" + elif isinstance(i, Reply): + # 引用回复 + if i.message_str: + outline += f"[引用消息({i.sender_nickname}: {i.message_str})]" + else: + outline += "[引用消息]" else: outline += f"[{i.type}]" + outline += " " return outline def get_message_outline(self) -> str: diff --git a/astrbot/core/platform/sources/aiocqhttp/aiocqhttp_platform_adapter.py b/astrbot/core/platform/sources/aiocqhttp/aiocqhttp_platform_adapter.py index 0a2e8d430..e81e7153f 100644 --- a/astrbot/core/platform/sources/aiocqhttp/aiocqhttp_platform_adapter.py +++ b/astrbot/core/platform/sources/aiocqhttp/aiocqhttp_platform_adapter.py @@ -160,8 +160,14 @@ class AiocqhttpAdapter(Platform): return abm - async def _convert_handle_message_event(self, event: Event) -> AstrBotMessage: - """OneBot V11 消息类事件""" + async def _convert_handle_message_event( + self, event: Event, get_reply=True + ) -> AstrBotMessage: + """OneBot V11 消息类事件 + + @param event: 事件对象 + @param get_reply: 是否获取回复消息。这个参数是为了防止多个回复嵌套。 + """ abm = AstrBotMessage() abm.self_id = str(event.self_id) abm.sender = MessageMember( @@ -240,6 +246,34 @@ class AiocqhttpAdapter(Platform): except BaseException as e: logger.error(f"获取文件失败: {e},此消息段将被忽略。") + elif t == "reply": + if not get_reply: + a = ComponentTypes[t](**m["data"]) # noqa: F405 + abm.message.append(a) + else: + try: + reply_event_data = await self.bot.call_action( + action="get_msg", + message_id=int(m["data"]["id"]), + ) + abm_reply = await self._convert_handle_message_event( + Event.from_payload(reply_event_data), get_reply=False + ) + + reply_seg = Reply( + id=abm_reply.message_id, + chain=abm_reply.message, + sender_id=abm_reply.sender.user_id, + sender_nickname=abm_reply.sender.nickname, + time=abm_reply.timestamp, + message_str=abm_reply.message_str, + text=abm_reply.message_str, # for compatibility + qq=abm_reply.sender.user_id, # for compatibility + ) + + abm.message.append(reply_seg) + except BaseException as e: + logger.error(f"获取消息失败: {e},此消息段将被忽略。") else: a = ComponentTypes[t](**m["data"]) # noqa: F405 abm.message.append(a)