diff --git a/astrbot/core/platform/sources/aiocqhttp/aiocqhttp_platform_adapter.py b/astrbot/core/platform/sources/aiocqhttp/aiocqhttp_platform_adapter.py index 198946b1a..0dd7912e2 100644 --- a/astrbot/core/platform/sources/aiocqhttp/aiocqhttp_platform_adapter.py +++ b/astrbot/core/platform/sources/aiocqhttp/aiocqhttp_platform_adapter.py @@ -3,6 +3,7 @@ import time import asyncio import logging import uuid +import itertools from typing import Awaitable, Any from aiocqhttp import CQHttp, Event from astrbot.api.platform import ( @@ -202,82 +203,85 @@ class AiocqhttpAdapter(Platform): return # 按消息段类型类型适配 - for m in event.message: - t = m["type"] + for t, m_group in itertools.groupby(event.message, key=lambda x: x["type"]): a = None if t == "text": - message_str += m["data"]["text"].strip() - a = ComponentTypes[t](**m["data"]) # noqa: F405 + # 合并相邻文本段 + message_str = "".join(m["data"]["text"] for m in m_group).strip() + a = ComponentTypes[t](text=message_str) # noqa: F405 abm.message.append(a) elif t == "file": - if m["data"].get("url") and m["data"].get("url").startswith("http"): - # Lagrange - logger.info("guessing lagrange") + for m in m_group: + if m["data"].get("url") and m["data"].get("url").startswith("http"): + # Lagrange + logger.info("guessing lagrange") - file_name = m["data"].get("file_name", "file") - path = os.path.join("data/temp", file_name) - await download_file(m["data"]["url"], path) + file_name = m["data"].get("file_name", "file") + path = os.path.join("data/temp", file_name) + await download_file(m["data"]["url"], path) - m["data"] = {"file": path, "name": file_name} - a = ComponentTypes[t](**m["data"]) # noqa: F405 - abm.message.append(a) - - else: - try: - # Napcat, LLBot - ret = await self.bot.call_action( - action="get_file", - file_id=event.message[0]["data"]["file_id"], - ) - if not ret.get("file", None): - raise ValueError(f"无法解析文件响应: {ret}") - if not os.path.exists(ret["file"]): - raise FileNotFoundError( - f"文件不存在或者权限问题: {ret['file']}。如果您使用 Docker 部署了 AstrBot 或者消息协议端(Napcat等),请先映射路径。如果路径在 /root 目录下,请用 sudo 打开 AstrBot" - ) - - m["data"] = {"file": ret["file"], "name": ret["file_name"]} + m["data"] = {"file": path, "name": file_name} a = ComponentTypes[t](**m["data"]) # noqa: F405 abm.message.append(a) - except ActionFailed as e: - logger.error(f"获取文件失败: {e},此消息段将被忽略。") - except BaseException as e: - logger.error(f"获取文件失败: {e},此消息段将被忽略。") + + else: + try: + # Napcat, LLBot + ret = await self.bot.call_action( + action="get_file", + file_id=event.message[0]["data"]["file_id"], + ) + if not ret.get("file", None): + raise ValueError(f"无法解析文件响应: {ret}") + if not os.path.exists(ret["file"]): + raise FileNotFoundError( + f"文件不存在或者权限问题: {ret['file']}。如果您使用 Docker 部署了 AstrBot 或者消息协议端(Napcat等),请先映射路径。如果路径在 /root 目录下,请用 sudo 打开 AstrBot" + ) + + m["data"] = {"file": ret["file"], "name": ret["file_name"]} + a = ComponentTypes[t](**m["data"]) # noqa: F405 + abm.message.append(a) + except ActionFailed as e: + logger.error(f"获取文件失败: {e},此消息段将被忽略。") + except BaseException as e: + logger.error(f"获取文件失败: {e},此消息段将被忽略。") elif t == "reply": - if not get_reply: - a = ComponentTypes[t](**m["data"]) # noqa: F405 - abm.message.append(a) - else: - try: - reply_event_data = await self.bot.call_action( - action="get_msg", - message_id=int(m["data"]["id"]), - ) - abm_reply = await self._convert_handle_message_event( - Event.from_payload(reply_event_data), get_reply=False - ) - - reply_seg = Reply( - id=abm_reply.message_id, - chain=abm_reply.message, - sender_id=abm_reply.sender.user_id, - sender_nickname=abm_reply.sender.nickname, - time=abm_reply.timestamp, - message_str=abm_reply.message_str, - text=abm_reply.message_str, # for compatibility - qq=abm_reply.sender.user_id, # for compatibility - ) - - abm.message.append(reply_seg) - except BaseException as e: - logger.error(f"获取引用消息失败: {e}。") + for m in m_group: + if not get_reply: a = ComponentTypes[t](**m["data"]) # noqa: F405 abm.message.append(a) + else: + try: + reply_event_data = await self.bot.call_action( + action="get_msg", + message_id=int(m["data"]["id"]), + ) + abm_reply = await self._convert_handle_message_event( + Event.from_payload(reply_event_data), get_reply=False + ) + + reply_seg = Reply( + id=abm_reply.message_id, + chain=abm_reply.message, + sender_id=abm_reply.sender.user_id, + sender_nickname=abm_reply.sender.nickname, + time=abm_reply.timestamp, + message_str=abm_reply.message_str, + text=abm_reply.message_str, # for compatibility + qq=abm_reply.sender.user_id, # for compatibility + ) + + abm.message.append(reply_seg) + except BaseException as e: + logger.error(f"获取引用消息失败: {e}。") + a = ComponentTypes[t](**m["data"]) # noqa: F405 + abm.message.append(a) else: - a = ComponentTypes[t](**m["data"]) # noqa: F405 - abm.message.append(a) + for m in m_group: + a = ComponentTypes[t](**m["data"]) # noqa: F405 + abm.message.append(a) abm.timestamp = int(time.time()) abm.message_str = message_str