Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
99 changes: 78 additions & 21 deletions nonebot/adapters/qq/bot.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
Event,
FriendAddEvent,
GroupAddRobotEvent,
GroupAtMessageCreateEvent,
GroupMessageCreateEvent,
GuildMessageEvent,
InteractionCreateEvent,
Expand Down Expand Up @@ -115,36 +116,58 @@ async def _check_reply(
bot: Bot 对象
event: MessageEvent 对象
"""
if not isinstance(event, GuildMessageEvent) or event.message_reference is None:
return
try:
event.reply = await bot.get_message_of_id(
channel_id=event.channel_id,
message_id=event.message_reference.message_id,
)
if event.reply.author.id == bot.self_info.id:
if isinstance(event, GuildMessageEvent):
if event.message_reference is None:
return
try:
event.reply = await bot.get_message_of_id(
channel_id=event.channel_id,
message_id=event.message_reference.message_id,
)
if event.reply.author.id == bot.self_info.id:
event.to_me = True
except Exception as e:
log("WARNING", f"Error when getting message reply info: {e!r}", e)
else:
if not event.msg_elements:
return
event.reply = event.msg_elements[0]
if (
event.reply.author
and event.reply.author.bot
and event.reply.author.username == bot.self_info.username
):
event.to_me = True
except Exception as e:
log("WARNING", f"Error when getting message reply info: {e!r}", e)


def _check_at_me(
bot: "Bot",
event: GuildMessageEvent | QQMessageEvent,
):
message = event.get_message()
if not message:
message.append(MessageSegment.text(""))
if isinstance(event, GroupAtMessageCreateEvent):
event.original_message = message.copy()
event.original_message.insert(0, MessageSegment.mention_user(bot.self_info.id))
if message and message[0].type == "text":
message[0].data["text"] = message[0].data["text"].lstrip("\xa0").lstrip()
if not message[0].data["text"]:
del message[0]
return
if (
isinstance(event, GuildMessageEvent)
and event.mentions is not None
and bot.self_info.id in {user.id for user in event.mentions}
):
event.to_me = True

if (
isinstance(event, QQMessageEvent)
and event.mentions is not None
and any(user.is_you for user in event.mentions)
):
event.to_me = True
if isinstance(event, GroupMessageCreateEvent):
for seg in message:
if seg.type == "mention_user" and seg.data.get("is_bot", False):
seg.data["user_id"] = bot.self_info.id

event.original_message = message.copy()

def _is_at_me_seg(segment: MessageSegment) -> bool:
if segment.type == "mention_user":
Expand Down Expand Up @@ -319,7 +342,9 @@ def _prepare_message(message: str | Message | MessageSegment) -> Message:

@staticmethod
def _extract_send_message(
message: Message, escape_text: bool = True
message: Message,
msg_ref_id: str | None = None,
escape_text: bool = True,
) -> dict[str, Any]:
kwargs = {}
content = message.extract_content(escape_text) or None
Expand All @@ -332,6 +357,10 @@ def _extract_send_message(
kwargs["markdown"] = markdown[-1].data["markdown"]
if reference := (message["reference"] or None):
kwargs["message_reference"] = reference[-1].data["reference"]
if msg_ref_id and not reference[-1].data["reference"].message_id.startswith(
"REFIDX"
):
kwargs["message_reference"] = MessageReference(message_id=msg_ref_id)
if keyboard := (message["keyboard"] or None):
kwargs["keyboard"] = keyboard[-1].data["keyboard"]
if stream := (message["stream"] or None):
Expand Down Expand Up @@ -429,9 +458,12 @@ async def send_to_c2c(
msg_id: str | None = None,
msg_seq: int | None = None,
event_id: str | None = None,
msg_ref_id: str | None = None,
) -> PostC2CMessagesReturn | PostC2CFilesReturn:
message = self._prepare_message(message)
kwargs = self._extract_send_message(message=message, escape_text=False)
kwargs = self._extract_send_message(
message=message, msg_ref_id=msg_ref_id, escape_text=False
)
if kwargs.get("embed"):
msg_type = 4
elif kwargs.get("ark"):
Expand Down Expand Up @@ -489,9 +521,12 @@ async def send_to_group(
msg_id: str | None = None,
msg_seq: int | None = None,
event_id: str | None = None,
msg_ref_id: str | None = None,
) -> PostGroupMessagesReturn | PostGroupFilesReturn:
message = self._prepare_message(message)
kwargs = self._extract_send_message(message=message, escape_text=False)
kwargs = self._extract_send_message(
message=message, msg_ref_id=msg_ref_id, escape_text=False
)
if kwargs.get("embed"):
msg_type = 4
elif kwargs.get("ark"):
Expand Down Expand Up @@ -560,19 +595,41 @@ async def send(
)
elif isinstance(event, C2CMessageCreateEvent):
event._reply_seq += 1
ref_idx = None
if event.message_scene:
ref_idx = next(
(
ext.partition("=")[-1]
for ext in event.message_scene.ext
if ext.startswith("msg_idx=")
),
"",
)
return await self.send_to_c2c(
openid=event.author.id,
message=message,
msg_id=event.id,
msg_seq=event._reply_seq,
msg_ref_id=ref_idx,
)
elif isinstance(event, GroupMessageCreateEvent):
event._reply_seq += 1
ref_idx = None
if event.message_scene:
ref_idx = next(
(
ext.partition("=")[-1]
for ext in event.message_scene.ext
if ext.startswith("msg_idx=")
),
"",
)
return await self.send_to_group(
group_openid=event.group_openid,
message=message,
msg_id=event.id,
msg_seq=event._reply_seq,
msg_ref_id=ref_idx,
)
elif isinstance(event, InteractionCreateEvent):
if gid := event.group_openid:
Expand Down Expand Up @@ -1726,7 +1783,7 @@ async def post_c2c_messages(
ark: MessageArk | None = None,
embed: MessageEmbed | None = None,
image: None = None,
message_reference: None = None,
message_reference: MessageReference | None = None,
stream: MessageStream | None = None,
prompt_keyboard: MessagePromptKeyboard | None = None,
action_button: MessageActionButton | None = None,
Expand Down Expand Up @@ -1964,7 +2021,7 @@ async def post_group_messages(
ark: MessageArk | None = None,
embed: MessageEmbed | None = None,
image: None = None,
message_reference: None = None,
message_reference: MessageReference | None = None,
event_id: str | None = None,
msg_id: str | None = None,
msg_seq: int | None = None,
Expand Down
33 changes: 22 additions & 11 deletions nonebot/adapters/qq/event.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from datetime import datetime
from enum import Enum
from typing import TypeVar, cast
from typing import TYPE_CHECKING, TypeVar, cast
from typing_extensions import override

from nonebot.utils import escape_tag
Expand All @@ -23,6 +23,7 @@
MessageReaction,
Post,
QQMessage,
QQReplyMessage,
Reply,
RichText,
Thread,
Expand Down Expand Up @@ -270,6 +271,10 @@ class GuildMemberRemoveEvent(GuildMemberEvent):
class MessageEvent(Event):
to_me: bool = False

if TYPE_CHECKING:
message: Message
original_message: Message

@override
def get_type(self) -> str:
return "message"
Expand Down Expand Up @@ -306,9 +311,9 @@ def get_event_description(self) -> str:

@override
def get_message(self) -> Message:
if not hasattr(self, "_message"):
setattr(self, "_message", Message.from_guild_message(self))
return getattr(self, "_message")
if not hasattr(self, "message"):
self.message = Message.from_guild_message(self)
return self.message


@register_event_class
Expand Down Expand Up @@ -360,13 +365,18 @@ class DirectMessageDeleteEvent(MessageDeleteEvent):


class QQMessageEvent(MessageEvent, QQMessage):
reply: QQReplyMessage | None = None
_reply_seq: int = 0

@override
def get_message(self) -> Message:
if not hasattr(self, "_message"):
setattr(self, "_message", Message.from_qq_message(self))
return getattr(self, "_message")
if not hasattr(self, "message"):
self.message = Message.from_qq_message(self)
return self.message

def get_reply_message(self) -> Message | None:
if self.reply:
return Message.from_qq_message(self.reply)


@register_event_class
Expand Down Expand Up @@ -396,18 +406,18 @@ class GroupMessageCreateEvent(QQMessageEvent):
__type__ = EventType.GROUP_MESSAGE_CREATE

author: GroupMemberAuthor
group_openid: str
group_id: str
group_openid: str

@override
def get_message(self) -> Message:
# tmp fix to remove space before text due to at not in content
msg = Message.from_qq_message(self)
if msg and msg[0].type == "text":
msg[0].data["text"] = msg[0].data["text"].lstrip()
if not hasattr(self, "_message"):
setattr(self, "_message", msg)
return getattr(self, "_message")
if not hasattr(self, "message"):
self.message = msg
return self.message

@override
def get_user_id(self) -> str:
Expand Down Expand Up @@ -731,6 +741,7 @@ class GroupMsgReceiveEvent(GroupRobotEvent):
"GroupAddRobotEvent",
"GroupAtMessageCreateEvent",
"GroupDelRobotEvent",
"GroupMessageCreateEvent",
"GroupMsgReceiveEvent",
"GroupMsgRejectEvent",
"GroupRobotEvent",
Expand Down
Loading
Loading