From 23a7eeeae04e098fd1df0b3bcc31eeb94506219b Mon Sep 17 00:00:00 2001 From: K2Cr2O1 <2221577113@qq.com> Date: Sat, 21 Mar 2026 14:41:50 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E8=B7=A8=E5=B9=B3=E5=8F=B0):=20=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E6=B6=88=E6=81=AF=E5=A4=84=E7=90=86=E5=B9=B6=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E7=BA=AF=E6=96=87=E6=9C=AC=E6=8F=90=E5=8F=96=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加 extract_text_only 函数过滤非文本标记 修改翻译逻辑仅处理纯文本内容 完善附件处理和消息内容拼接 修复仅包含表情时的消息处理问题 --- adapters/router.py | 20 ++++++++++++++------ plugins/discord-cross/handlers.py | 10 ++++++++++ 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/adapters/router.py b/adapters/router.py index 245366c..396c005 100644 --- a/adapters/router.py +++ b/adapters/router.py @@ -227,6 +227,9 @@ class DiscordToOneBotConverter: Returns: 伪装后的 OneBot 事件对象 """ + # 在方法内部导入 logger,避免作用域问题 + from core.utils.logger import logger + # 1. 提取基础信息 user_id = discord_message.author.id message_id = discord_message.id @@ -279,38 +282,43 @@ class DiscordToOneBotConverter: else: message_list.append(OneBotMessageSegment.text(content)) + # 如果消息只包含表情(没有文本),更新 raw_message 以包含表情信息 + if not raw_message.strip() or raw_message.strip().startswith('<'): + import re + raw_message = re.sub(r'', r'[\1]', raw_message) + # 添加附件信息 if discord_message.attachments: - self.logger.debug(f"[DiscordToOneBotConverter] 检测到 {len(discord_message.attachments)} 个附件") + logger.debug(f"[DiscordToOneBotConverter] 检测到 {len(discord_message.attachments)} 个附件") for attachment in discord_message.attachments: filename = attachment.filename.lower() - self.logger.debug(f"[DiscordToOneBotConverter] 处理附件: {attachment.filename}, MIME: {attachment.content_type}") + logger.debug(f"[DiscordToOneBotConverter] 处理附件: {attachment.filename}, MIME: {attachment.content_type}") # 检查是否是语音文件 if filename.endswith(('.amr', '.silk', '.mp3', '.wav', '.ogg', '.m4a')): seg = OneBotMessageSegment.record(attachment.url) seg.data["filename"] = attachment.filename message_list.append(seg) raw_message += f"\n[语音: {attachment.filename}]" - self.logger.debug(f"[DiscordToOneBotConverter] 识别为语音文件: {attachment.filename}") + logger.debug(f"[DiscordToOneBotConverter] 识别为语音文件: {attachment.filename}") elif filename.endswith(('.mp4', '.avi', '.mkv', '.mov', '.flv', '.wmv')): seg = OneBotMessageSegment.video(attachment.url) seg.data["filename"] = attachment.filename message_list.append(seg) raw_message += f"\n[视频: {attachment.filename}]" - self.logger.debug(f"[DiscordToOneBotConverter] 识别为视频文件: {attachment.filename}") + logger.debug(f"[DiscordToOneBotConverter] 识别为视频文件: {attachment.filename}") elif filename.endswith(('.png', '.jpg', '.jpeg', '.gif', '.webp')): image_type = "gif" if filename.endswith('.gif') else None seg = OneBotMessageSegment.image(attachment.url, image_type=image_type) seg.data["filename"] = attachment.filename message_list.append(seg) raw_message += f"\n[图片: {attachment.filename}]" - self.logger.debug(f"[DiscordToOneBotConverter] 识别为图片文件: {attachment.filename}") + logger.debug(f"[DiscordToOneBotConverter] 识别为图片文件: {attachment.filename}") else: seg = OneBotMessageSegment.file(attachment.url) seg.data["filename"] = attachment.filename message_list.append(seg) raw_message += f"\n[文件: {attachment.filename}]" - self.logger.success(f"[DiscordToOneBotConverter] 识别为普通文件: {attachment.filename}") + logger.success(f"[DiscordToOneBotConverter] 识别为普通文件: {attachment.filename}") # 添加贴纸 (Stickers) 信息 if hasattr(discord_message, 'stickers') and discord_message.stickers: diff --git a/plugins/discord-cross/handlers.py b/plugins/discord-cross/handlers.py index a8a9cf0..fb56424 100644 --- a/plugins/discord-cross/handlers.py +++ b/plugins/discord-cross/handlers.py @@ -171,10 +171,12 @@ async def handle_discord_message_event(event: Any): logger.debug(f"[CrossPlatform] 开始处理 Discord 事件消息: channel_id={discord_channel_id}") if hasattr(event, 'message') and isinstance(event.message, list): + has_text_content = False for segment in event.message: if isinstance(segment, MessageSegment): if segment.type == "text": content += segment.data.get("text", "") + has_text_content = True elif segment.type == "image": file_url = segment.data.get("url") or segment.data.get("file") file_name = segment.data.get("filename") @@ -183,6 +185,7 @@ async def handle_discord_message_event(event: Any): attachment_item = {"type": "image", "url": str(file_url), "filename": file_name} if attachment_item not in attachments: attachments.append(attachment_item) + content += f"\n[图片: {file_name}]\n" elif segment.type == "video": file_url = segment.data.get("url") or segment.data.get("file") file_name = segment.data.get("filename") @@ -191,6 +194,7 @@ async def handle_discord_message_event(event: Any): attachment_item = {"type": "video", "url": str(file_url), "filename": file_name} if attachment_item not in attachments: attachments.append(attachment_item) + content += f"\n[视频: {file_name}]\n" elif segment.type == "record": file_url = segment.data.get("url") or segment.data.get("file") file_name = segment.data.get("filename") @@ -199,6 +203,7 @@ async def handle_discord_message_event(event: Any): attachment_item = {"type": "record", "url": str(file_url), "filename": file_name} if attachment_item not in attachments: attachments.append(attachment_item) + content += f"\n[语音: {file_name}]\n" elif segment.type == "file": file_url = segment.data.get("url") or segment.data.get("file") file_name = segment.data.get("filename") @@ -207,12 +212,17 @@ async def handle_discord_message_event(event: Any): attachment_item = {"type": "file", "url": str(file_url), "filename": file_name} if attachment_item not in attachments: attachments.append(attachment_item) + content += f"\n[文件: {file_name}]\n" logger.debug(f"[CrossPlatform] Discord 消息识别到文件: {file_name}, URL: {file_url}") else: content = event.raw_message or "" content = content.strip() + # 如果 content 为空但有附件(如只有表情),使用 raw_message 作为 content + if not content and attachments: + content = event.raw_message or "" + logger.debug(f"[CrossPlatform] Discord 消息内容: '{content}', 附件数量: {len(attachments)}") discord_username = getattr(event, 'discord_username', 'Unknown')