feat(跨平台): 优化消息处理并添加纯文本提取功能

添加 extract_text_only 函数过滤非文本标记
修改翻译逻辑仅处理纯文本内容
完善附件处理和消息内容拼接
修复仅包含表情时的消息处理问题
This commit is contained in:
2026-03-21 14:41:50 +08:00
committed by 镀铬酸钾
parent f6d431cb5f
commit 1c874e6da0
2 changed files with 24 additions and 6 deletions

View File

@@ -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'<a?:([^:]+):(\d+)>', 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:

View File

@@ -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')