88from nonebot .adapters import Event
99from nonebot .permission import User , Permission
1010from nonebot_plugin_waiter import Waiter , prompt
11+ from nonebot_plugin_alconna import SupportAdapter
1112from nonebot .matcher import Matcher , current_event , current_matcher
12- from nonebot_plugin_alconna .uniseg import UniMsg , UniMessage , get_message_id
13+ from nonebot_plugin_alconna .uniseg import UniMsg , UniMessage , get_target , get_message_id , message_reaction
1314
1415from .apis import API
1516from .log import tts_logger
@@ -46,6 +47,8 @@ async def handle(self, content: Optional[str]) -> None:
4647 if content :
4748 self .context .append ({"role" : "user" , "content" : content })
4849
50+ await self ._message_reaction ("thinking" )
51+
4952 if not self .is_contextual :
5053 await self ._handle_single_conversion ()
5154 else :
@@ -99,6 +102,20 @@ def _prompt_handler(self, msg: UniMsg) -> UniMsg:
99102 self .message_id = get_message_id ()
100103 return msg
101104
105+ async def _message_reaction (self , status : Literal ["fail" , "thinking" , "done" ]) -> None :
106+ emoji_map = {
107+ "fail" : ["10060" , "❌" ],
108+ "thinking" : ["424" , "👀" ],
109+ "done" : ["144" , "🎉" ],
110+ }
111+ target = get_target (self .event )
112+ if target .adapter == SupportAdapter .onebot11 :
113+ emoji = emoji_map [status ][0 ]
114+ else :
115+ emoji = emoji_map [status ][1 ]
116+
117+ await message_reaction (emoji , message_id = self .message_id )
118+
102119 async def _process_waiter_response (self , resp : Union [bool , str ]) -> None :
103120 timeout = ds_config .timeout if isinstance (ds_config .timeout , int ) else ds_config .timeout .user_input
104121
@@ -112,6 +129,8 @@ async def _process_waiter_response(self, resp: Union[bool, str]) -> None:
112129 await UniMessage .text ("等待超时" ).finish (reply_to = self .message_id )
113130 resp = self ._waiter_handler (_resp , skip = True )
114131
132+ await self ._message_reaction ("thinking" )
133+
115134 if resp is False :
116135 await UniMessage .text ("已结束对话" ).finish (reply_to = self .message_id )
117136 elif resp == "rollback" :
@@ -138,6 +157,7 @@ async def _handle_rollback(self, steps: int = 1, by_error: bool = False) -> None
138157 )
139158 elif by_error and len (self .context ) > 0 :
140159 self .context .clear ()
160+ await self ._message_reaction ("fail" )
141161 await UniMessage .text ("Oops! 连接异常,请重新输入" ).send (reply_to = self .message_id )
142162 else :
143163 await UniMessage .text ("无法回滚,当前对话记录为空" ).send (reply_to = self .message_id )
@@ -167,6 +187,7 @@ async def _get_response_message(self) -> Optional[Message]:
167187 return completion .choices [0 ].message
168188 except (httpx .ReadTimeout , httpx .RequestError ):
169189 if not self .is_contextual :
190+ await self ._message_reaction ("fail" )
170191 await UniMessage .text ("Oops! 网络超时,请稍后重试" ).finish (reply_to = self .message_id )
171192 await self ._handle_rollback (by_error = True )
172193 except RequestException as e :
@@ -199,6 +220,9 @@ def _format_output(self, message: Message, with_thinking: bool) -> str:
199220 async def _send_response (self , message : Message ) -> None :
200221 output = self ._format_output (message , ds_config .enable_send_thinking )
201222 message .reasoning_content = None
223+
224+ await self ._message_reaction ("done" )
225+
202226 if self .tts_model :
203227 try :
204228 output = self ._format_output (message , False )
0 commit comments