1- from typing import TYPE_CHECKING , Union
1+ from typing import TYPE_CHECKING , Any , Union , Sequence
22
3+ from nonechat .model import DIRECT
34from nonebot .adapters import Bot , Event
45from nonebot .adapters .console import Bot as ConsoleBot
5- from nonebot .adapters .console .event import MessageEvent
66from nonebot .adapters .console .message import Message , MessageSegment
7+ from nonebot .adapters .console .event import MessageEvent , MessageResponse
78
9+ from nonebot_plugin_alconna import Segment
810from nonebot_plugin_alconna .uniseg .segment import Text , Emoji
911from nonebot_plugin_alconna .uniseg .constraint import SupportScope
1012from nonebot_plugin_alconna .uniseg .exporter import Target , SupportAdapter , MessageExporter , export
@@ -19,17 +21,26 @@ def get_adapter(cls) -> SupportAdapter:
1921 return SupportAdapter .console
2022
2123 def get_target (self , event : Event , bot : Union [Bot , None ] = None ) -> Target :
24+ assert isinstance (event , MessageEvent )
25+ if event .channel .id == DIRECT .id or event .channel .id .startswith ("private:" ):
26+ # If the event is a direct message, we can use the user ID as the target ID
27+ return Target (
28+ event .user .id ,
29+ private = True ,
30+ adapter = self .get_adapter (),
31+ self_id = bot .self_id if bot else None ,
32+ scope = SupportScope .console ,
33+ )
2234 return Target (
23- event .get_user_id (),
24- private = True ,
35+ event .channel .id ,
2536 adapter = self .get_adapter (),
2637 self_id = bot .self_id if bot else None ,
2738 scope = SupportScope .console ,
2839 )
2940
3041 def get_message_id (self , event : Event ) -> str :
3142 assert isinstance (event , MessageEvent )
32- return str ( event .self_id )
43+ return event .message_id
3344
3445 @export
3546 async def text (self , seg : Text , bot : Union [Bot , None ]) -> "MessageSegment" :
@@ -54,4 +65,37 @@ async def send_to(self, target: Union[Target, Event], bot: Bot, message: Message
5465 assert isinstance (message , Message )
5566 if isinstance (target , Event ):
5667 return await bot .send (target , message , ** kwargs ) # type: ignore
57- return await bot .send_msg (user_id = target .id , message = message , ** kwargs )
68+ if target .private :
69+ return await bot .send_private_message (user_id = target .id , message = message )
70+ return await bot .send_message (channel_id = target .id , message = message )
71+
72+ async def recall (self , mid : Any , bot : Bot , context : Union [Target , Event ]):
73+ assert isinstance (bot , ConsoleBot )
74+ if isinstance (mid , str ):
75+ if isinstance (context , Event ):
76+ assert isinstance (context , MessageEvent )
77+ await bot .recall_message (message_id = mid , channel_id = context .channel .id )
78+ else :
79+ if context .private :
80+ channel_id = (await bot .create_dm (context .id )).id
81+ else :
82+ channel_id = context .id
83+ await bot .recall_message (message_id = mid , channel_id = channel_id )
84+ elif isinstance (mid , MessageResponse ):
85+ await bot .recall_message (mid .message_id , channel_id = mid .channel_id )
86+
87+ async def edit (self , new : Sequence [Segment ], mid : Any , bot : Bot , context : Union [Target , Event ]):
88+ assert isinstance (bot , ConsoleBot )
89+ new_msg = await self .export (new , bot , True )
90+ if isinstance (mid , str ):
91+ if isinstance (context , Event ):
92+ assert isinstance (context , MessageEvent )
93+ await bot .edit_message (message_id = mid , channel_id = context .channel .id , content = new_msg )
94+ else :
95+ if context .private :
96+ channel_id = (await bot .create_dm (context .id )).id
97+ else :
98+ channel_id = context .id
99+ await bot .edit_message (message_id = mid , channel_id = channel_id , content = new_msg )
100+ elif isinstance (mid , MessageResponse ):
101+ await bot .edit_message (mid .message_id , mid .channel_id , new_msg )
0 commit comments