From a5db4d4e473cc0a5728ed30223741e363a45373a Mon Sep 17 00:00:00 2001 From: Soulter <905617992@qq.com> Date: Sun, 18 Aug 2024 03:55:11 -0400 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=BC=82=E7=AB=AF?= =?UTF-8?q?=E6=83=85=E5=86=B5=E4=B8=8B=E4=B8=BB=E5=8A=A8=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E5=8F=91=E9=80=81=E5=B8=A6=E6=9C=89=E6=9C=AC=E5=9C=B0=E5=9B=BE?= =?UTF-8?q?=E7=89=87url=E7=9A=84=E6=B6=88=E6=81=AF=E6=97=B6=E6=8A=A5?= =?UTF-8?q?=E9=94=99=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- model/platform/qq_aiocqhttp.py | 45 ++++++++++++++++++++-------------- 1 file changed, 27 insertions(+), 18 deletions(-) diff --git a/model/platform/qq_aiocqhttp.py b/model/platform/qq_aiocqhttp.py index 49299201d..53e245845 100644 --- a/model/platform/qq_aiocqhttp.py +++ b/model/platform/qq_aiocqhttp.py @@ -80,7 +80,7 @@ class AIOCQHTTP(Platform): def run_aiocqhttp(self): if not self.host or not self.port: return - self.bot = CQHttp(use_ws_reverse=True, import_name='aiocqhttp') + self.bot = CQHttp(use_ws_reverse=True, import_name='aiocqhttp', api_timeout_sec=20) @self.bot.on_message('group') async def group(event: Event): abm = self.convert_message(event) @@ -176,9 +176,6 @@ class AIOCQHTTP(Platform): """ 回复用户唤醒机器人的消息。(被动回复) """ - logger.info( - f"{message.sender.user_id} <- {self.parse_message_outline(message)}") - res = result_message if isinstance(res, str): @@ -201,6 +198,13 @@ class AIOCQHTTP(Platform): await self.record_metrics() if isinstance(message_chain, str): message_chain = [Plain(text=message_chain), ] + + if isinstance(message, AstrBotMessage): + logger.info( + f"{message.sender.user_id} <- {self.parse_message_outline(message)}") + else: + logger.info(f"回复消息: {message_chain}") + ret = [] image_idx = [] for idx, segment in enumerate(message_chain): @@ -214,23 +218,13 @@ class AIOCQHTTP(Platform): logger.info(f"回复消息: {ret}") return try: - if isinstance(message, AstrBotMessage): - await self.bot.send(message.raw_message, ret) - if isinstance(message, dict): - if 'group_id' in message: - await self.bot.send_group_msg(group_id=message['group_id'], message=ret) - elif 'user_id' in message: - await self.bot.send_private_msg(user_id=message['user_id'], message=ret) - else: - raise Exception("aiocqhttp: 无法识别的消息来源。仅支持 group_id 和 user_id。") + await self._reply_wrapper(message, ret) except ActionFailed as e: - logger.error(traceback.format_exc()) - logger.error(f"回复消息失败: {e}") if e.retcode == 1200: # ENOENT if not image_idx: raise e - logger.info("检测到失败原因为文件未找到,猜测用户的协议端与 AstrBot 位于不同的文件系统上。尝试采用上传图片的方式发图。") + logger.warn("回复失败。检测到失败原因为文件未找到,猜测用户的协议端与 AstrBot 位于不同的文件系统上。尝试采用上传图片的方式发图。") for idx in image_idx: if ret[idx]['data']['file'].startswith('file://'): logger.info(f"正在上传图片: {ret[idx]['data']['path']}") @@ -238,8 +232,23 @@ class AIOCQHTTP(Platform): logger.info(f"上传成功。") ret[idx]['data']['file'] = image_url ret[idx]['data']['path'] = image_url - await self.bot.send(message.raw_message, ret) - + await self._reply_wrapper(message, ret) + else: + logger.error(traceback.format_exc()) + logger.error(f"回复消息失败: {e}") + raise e + + async def _reply_wrapper(self, message: Union[AstrBotMessage, Dict], ret: List): + if isinstance(message, AstrBotMessage): + await self.bot.send(message.raw_message, ret) + if isinstance(message, dict): + if 'group_id' in message: + await self.bot.send_group_msg(group_id=message['group_id'], message=ret) + elif 'user_id' in message: + await self.bot.send_private_msg(user_id=message['user_id'], message=ret) + else: + raise Exception("aiocqhttp: 无法识别的消息来源。仅支持 group_id 和 user_id。") + async def send_msg(self, target: Dict[str, int], result_message: CommandResult): ''' 以主动的方式给QQ用户、QQ群发送一条消息。