🐛 fix(command): 修复 Event 对象无 reply 方法
- events() 返回的是 Event(data=GroupMessageEvent) 包装对象 - 改用 event.data(消息事件实体)构建回复 - 手动构建 MessageArray + add_reply 实现引用回复 - 群聊默认 @发送者,at_sender=false 可关闭
This commit is contained in:
@@ -76,17 +76,38 @@ async def send_command_callback(data: dict, event, api, logger) -> None:
|
|||||||
if not isinstance(result, dict):
|
if not isinstance(result, dict):
|
||||||
return
|
return
|
||||||
|
|
||||||
await _handle_reply(result, event, api, logger)
|
await _handle_reply(result, event.data, api, logger)
|
||||||
|
|
||||||
except Exception as exc:
|
except Exception as exc:
|
||||||
logger.error("命令回调异常: url=%s error=%s", COMMAND_CALLBACK_URL, exc)
|
logger.error("命令回调异常: url=%s error=%s", COMMAND_CALLBACK_URL, exc)
|
||||||
|
|
||||||
|
|
||||||
async def _handle_reply(result: dict, event, api, logger) -> None:
|
async def _handle_reply(result: dict, msg_event, api, logger) -> None:
|
||||||
"""处理回调响应,引用原消息自动回复。"""
|
"""处理回调响应,引用原消息自动回复。msg_event 是 GroupMessageEvent / PrivateMessageEvent。"""
|
||||||
at_sender = result.get("at_sender", True)
|
at_sender = result.get("at_sender", True)
|
||||||
messages = result.get("messages")
|
messages = result.get("messages")
|
||||||
reply = result.get("reply")
|
reply = result.get("reply")
|
||||||
|
group_id = getattr(msg_event, "group_id", None)
|
||||||
|
user_id = msg_event.user_id
|
||||||
|
message_id = msg_event.message_id
|
||||||
|
|
||||||
|
# 构造引用消息段
|
||||||
|
from ncatbot.types import MessageArray, Reply
|
||||||
|
|
||||||
|
def build_reply_msg(text=None, image=None, video=None) -> MessageArray:
|
||||||
|
"""构建带引用的消息段。"""
|
||||||
|
msg = MessageArray()
|
||||||
|
msg.add_reply(message_id)
|
||||||
|
if group_id and at_sender:
|
||||||
|
msg.add_at(user_id)
|
||||||
|
msg.add_text(" ")
|
||||||
|
if text is not None:
|
||||||
|
msg.add_text(text)
|
||||||
|
if image is not None:
|
||||||
|
msg.add_image(image)
|
||||||
|
if video is not None:
|
||||||
|
msg.add_video(video)
|
||||||
|
return msg
|
||||||
|
|
||||||
# 批量回复:引用 + 批量消息段
|
# 批量回复:引用 + 批量消息段
|
||||||
if messages and isinstance(messages, list):
|
if messages and isinstance(messages, list):
|
||||||
@@ -107,20 +128,23 @@ async def _handle_reply(result: dict, event, api, logger) -> None:
|
|||||||
file_msgs.append(msg)
|
file_msgs.append(msg)
|
||||||
|
|
||||||
text = "\n".join(text_parts) if text_parts else None
|
text = "\n".join(text_parts) if text_parts else None
|
||||||
group_id = getattr(event.data, "group_id", None)
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
# 组合消息用 event.reply 引用原消息
|
# 组合消息(带引用)
|
||||||
if text or image_url or video_url:
|
if text or image_url or video_url:
|
||||||
await event.reply(text=text, image=image_url, video=video_url, at_sender=at_sender)
|
reply_msg = build_reply_msg(text=text, image=image_url, video=video_url)
|
||||||
# 文件单独发(file 是独占段)
|
if group_id:
|
||||||
|
await api.qq.post_group_array_msg(group_id=group_id, msg=reply_msg)
|
||||||
|
else:
|
||||||
|
await api.qq.post_private_array_msg(user_id=user_id, msg=reply_msg)
|
||||||
|
# 文件单独发
|
||||||
for fm in file_msgs:
|
for fm in file_msgs:
|
||||||
url = fm.get("url", "")
|
url = fm.get("url", "")
|
||||||
filename = url.split("/")[-1]
|
filename = url.split("/")[-1]
|
||||||
if group_id:
|
if group_id:
|
||||||
await api.qq.send_group_file(group_id=group_id, file=url, name=filename)
|
await api.qq.send_group_file(group_id=group_id, file=url, name=filename)
|
||||||
else:
|
else:
|
||||||
await api.qq.send_private_file(user_id=event.data.user_id, file=url, name=filename)
|
await api.qq.send_private_file(user_id=user_id, file=url, name=filename)
|
||||||
except Exception as exc:
|
except Exception as exc:
|
||||||
logger.error("命令回复失败: %s", exc)
|
logger.error("命令回复失败: %s", exc)
|
||||||
return
|
return
|
||||||
@@ -128,6 +152,10 @@ async def _handle_reply(result: dict, event, api, logger) -> None:
|
|||||||
# 纯文本回复:引用原消息
|
# 纯文本回复:引用原消息
|
||||||
if reply and isinstance(reply, str):
|
if reply and isinstance(reply, str):
|
||||||
try:
|
try:
|
||||||
await event.reply(text=reply, at_sender=at_sender)
|
reply_msg = build_reply_msg(text=reply)
|
||||||
|
if group_id:
|
||||||
|
await api.qq.post_group_array_msg(group_id=group_id, msg=reply_msg)
|
||||||
|
else:
|
||||||
|
await api.qq.post_private_array_msg(user_id=user_id, msg=reply_msg)
|
||||||
except Exception as exc:
|
except Exception as exc:
|
||||||
logger.error("命令回复失败: %s", exc)
|
logger.error("命令回复失败: %s", exc)
|
||||||
|
|||||||
Reference in New Issue
Block a user