fix: aiocqhttp优先使用session_id发送消息 (#2623)
* fix: aiocqhttp优先使用session_id发送消息 当前aiocqhttp依赖raw_message来发送消息,raw_message为空时也无法有效回退到用group_id或user_id来发送,更符合逻辑的应该:优先使用session_id(group_id or user_id),raw_message兜底 * Update aiocqhttp_message_event.py * fix: validate session_id as integer and improve send_message docstring --------- Co-authored-by: Soulter <905617992@qq.com>
This commit is contained in:
@@ -67,12 +67,19 @@ class AiocqhttpMessageEvent(AstrMessageEvent):
|
||||
session_id: str,
|
||||
messages: list[dict],
|
||||
):
|
||||
if event:
|
||||
await bot.send(event=event, message=messages)
|
||||
elif is_group:
|
||||
# session_id 必须是纯数字字符串
|
||||
session_id = int(session_id) if session_id.isdigit() else None
|
||||
|
||||
if is_group and isinstance(session_id, int):
|
||||
await bot.send_group_msg(group_id=session_id, message=messages)
|
||||
else:
|
||||
elif not is_group and isinstance(session_id, int):
|
||||
await bot.send_private_msg(user_id=session_id, message=messages)
|
||||
elif isinstance(event, Event): # 最后兜底
|
||||
await bot.send(event=event, message=messages)
|
||||
else:
|
||||
raise ValueError(
|
||||
f"无法发送消息:缺少有效的数字 session_id({session_id}) 或 event({event})"
|
||||
)
|
||||
|
||||
@classmethod
|
||||
async def send_message(
|
||||
@@ -83,7 +90,15 @@ class AiocqhttpMessageEvent(AstrMessageEvent):
|
||||
is_group: bool = False,
|
||||
session_id: str = None,
|
||||
):
|
||||
"""发送消息"""
|
||||
"""发送消息至 QQ 协议端(aiocqhttp)。
|
||||
|
||||
Args:
|
||||
bot (CQHttp): aiocqhttp 机器人实例
|
||||
message_chain (MessageChain): 要发送的消息链
|
||||
event (Event | None, optional): aiocqhttp 事件对象.
|
||||
is_group (bool, optional): 是否为群消息.
|
||||
session_id (str | None, optional): 会话 ID(群号或 QQ 号
|
||||
"""
|
||||
|
||||
# 转发消息、文件消息不能和普通消息混在一起发送
|
||||
send_one_by_one = any(
|
||||
@@ -122,18 +137,15 @@ class AiocqhttpMessageEvent(AstrMessageEvent):
|
||||
|
||||
async def send(self, message: MessageChain):
|
||||
"""发送消息"""
|
||||
event = self.message_obj.raw_message
|
||||
assert isinstance(event, Event), "Event must be an instance of aiocqhttp.Event"
|
||||
is_group = False
|
||||
if self.get_group_id():
|
||||
is_group = True
|
||||
session_id = self.get_group_id()
|
||||
else:
|
||||
session_id = self.get_sender_id()
|
||||
event = getattr(self.message_obj, "raw_message", None)
|
||||
|
||||
is_group = bool(self.get_group_id())
|
||||
session_id = self.get_group_id() if is_group else self.get_sender_id()
|
||||
|
||||
await self.send_message(
|
||||
bot=self.bot,
|
||||
message_chain=message,
|
||||
event=event,
|
||||
event=event, # 不强制要求一定是 Event
|
||||
is_group=is_group,
|
||||
session_id=session_id,
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user