1111 DirectMessageCreateEvent ,
1212 ForumEvent ,
1313 FriendRobotEvent ,
14- GroupAtMessageCreateEvent ,
14+ GroupMessageCreateEvent ,
1515 GroupRobotEvent ,
1616 GuildEvent ,
1717 GuildMemberEvent ,
3333)
3434from nonebot .adapters .qq .models .common import Button as ButtonModel
3535from nonebot .adapters .qq .models .guild import Message as GuildMessage
36- from tarina import lang
36+ from tarina import LRU , lang
3737
3838from nonebot_plugin_alconna .uniseg .constraint import SupportScope
3939from nonebot_plugin_alconna .uniseg .exporter import MessageExporter , SerializeFailed , SupportAdapter , Target , export
5353)
5454
5555
56+ style_dict = {
57+ "grey" : 0 ,
58+ "secondary" : 0 ,
59+ "blue" : 1 ,
60+ "primary" : 1 ,
61+ "success" : 1 ,
62+ "info" : 2 ,
63+ "warning" : 3 ,
64+ "danger" : 3 ,
65+ "link" : 4 ,
66+ }
67+
68+
5669@dataclass
5770class ButtonSegment (MessageSegment ):
5871 @override
@@ -68,6 +81,10 @@ def __str__(self) -> str:
6881
6982
7083class QQMessageExporter (MessageExporter [Message ]):
84+ def __init__ (self ):
85+ super ().__init__ ()
86+ self .id_ref_cache = LRU (16 )
87+
7188 @classmethod
7289 def get_adapter (cls ) -> SupportAdapter :
7390 return SupportAdapter .qq
@@ -160,7 +177,7 @@ def get_target(self, event: Event, bot: Bot | None = None) -> Target:
160177 extra = {"qq.reply_seq" : event ._reply_seq },
161178 scope = SupportScope .qq_api ,
162179 )
163- if isinstance (event , GroupAtMessageCreateEvent ):
180+ if isinstance (event , GroupMessageCreateEvent ):
164181 return Target (
165182 event .group_openid ,
166183 source = str (event .id ),
@@ -217,7 +234,7 @@ def get_target(self, event: Event, bot: Bot | None = None) -> Target:
217234 def get_message_id (self , event : Event ) -> str :
218235 assert isinstance (
219236 event ,
220- (InteractionCreateEvent , GuildMessageEvent , C2CMessageCreateEvent , GroupAtMessageCreateEvent ),
237+ (InteractionCreateEvent , GuildMessageEvent , C2CMessageCreateEvent , GroupMessageCreateEvent ),
221238 )
222239 return str (event .id )
223240
@@ -296,17 +313,7 @@ def _button(self, seg: Button, bot: Bot | None):
296313 else :
297314 perm = Permission (type = 0 , specify_user_ids = [i .target for i in seg .permission ])
298315 label = str (seg .label )
299- style_dict = {
300- "grey" : 0 ,
301- "secondary" : 0 ,
302- "blue" : 1 ,
303- "primary" : 1 ,
304- "success" : 1 ,
305- "info" : 2 ,
306- "warning" : 3 ,
307- "danger" : 3 ,
308- "link" : 4 ,
309- }
316+
310317 return ButtonModel (
311318 id = seg .id or (label if seg .flag == "action" else None ),
312319 render_data = RenderData (
@@ -369,8 +376,18 @@ async def send_to(self, target: Target | Event, bot: Bot, message: Message, **kw
369376
370377 if isinstance (target , Event ):
371378 assert isinstance (target , QQEvent )
372- if isinstance (target , (C2CMessageCreateEvent , GroupAtMessageCreateEvent )):
373- message = message .exclude ("mention_channel" , "mention_user" , "mention_everyone" , "reference" )
379+ if isinstance (target , (C2CMessageCreateEvent , GroupMessageCreateEvent )) and target .message_scene :
380+ ref_idx = next (
381+ (
382+ ext .partition ("=" )[- 1 ]
383+ for ext in target .message_scene .ext
384+ if ext .startswith ("msg_idx=" )
385+ ),
386+ "" ,
387+ )
388+ self .id_ref_cache [target .id ] = ref_idx
389+ if isinstance (target , (C2CMessageCreateEvent , GroupMessageCreateEvent )):
390+ message = message .exclude ("mention_channel" )
374391 return await bot .send (event = target , message = message , ** kwargs )
375392
376393 if target .extra .get ("qq.reply_seq" ) is not None :
@@ -390,7 +407,7 @@ async def send_to(self, target: Target | Event, bot: Bot, message: Message, **kw
390407 ** kwargs , # type: ignore
391408 )
392409 return await bot .send_to_channel (channel_id = target .id , message = message , msg_id = target .source , ** kwargs )
393- message = message .exclude ("mention_channel" , "mention_user" , "mention_everyone" , "reference" )
410+ message = message .exclude ("mention_channel" )
394411 if target .private :
395412 res = await bot .send_to_c2c (
396413 openid = target .id ,
@@ -442,7 +459,7 @@ async def recall(self, mid: Any, bot: Bot, context: Target | Event):
442459 group_openid = context .id ,
443460 message_id = mid .id , # type: ignore
444461 )
445- elif isinstance (context , GroupAtMessageCreateEvent ):
462+ elif isinstance (context , GroupMessageCreateEvent ):
446463 await bot .delete_group_message (
447464 group_openid = context .group_openid ,
448465 message_id = mid .id , # type: ignore
@@ -470,7 +487,7 @@ async def recall(self, mid: Any, bot: Bot, context: Target | Event):
470487 openid = context .author .id ,
471488 message_id = mid ,
472489 )
473- elif isinstance (context , GroupAtMessageCreateEvent ):
490+ elif isinstance (context , GroupMessageCreateEvent ):
474491 await bot .delete_group_message (
475492 group_openid = context .group_openid ,
476493 message_id = mid ,
@@ -515,4 +532,10 @@ async def reaction(self, emoji: Emoji, mid: Any, bot: Bot, context: Target | Eve
515532 def get_reply (self , mid : Any ):
516533 if isinstance (mid , GuildMessage ):
517534 return Reply (mid .id )
535+ if isinstance (mid , (PostGroupMessagesReturn , PostC2CMessagesReturn )):
536+ ref_idx = self .id_ref_cache .get (mid .id ) if mid .id else None
537+ if ref_idx :
538+ return Reply (ref_idx )
539+ if isinstance (mid , str ):
540+ return Reply (self .id_ref_cache .get (mid , mid ))
518541 raise NotImplementedError
0 commit comments