fix(discord): 修复 WebSocket 连接检测并增强跨平台文件处理 (#73)

修复 Discord WebSocket 连接检测逻辑,使用正确的属性检查连接状态
为跨平台消息处理添加文件类型支持,并增加详细的调试日志
优化附件处理逻辑,确保所有文件类型都能正确识别和转发
This commit is contained in:
镀铬酸钾
2026-03-21 14:27:23 +08:00
committed by GitHub
parent 6c0afb81f9
commit bc18449300
5 changed files with 73 additions and 6 deletions

View File

@@ -327,7 +327,9 @@ class DiscordAdapter(discord.Client if DISCORD_AVAILABLE else object):
try:
await asyncio.sleep(interval)
if self.ws is not None and self.ws.closed:
# discord.py 的 ws 对象是 DiscordWebSocket它没有 closed 属性
# 我们可以通过检查 self.is_closed() 或者 ws.open 来判断
if self.ws is not None and not getattr(self.ws, 'open', True):
self.logger.warning("检测到 WebSocket 连接已关闭,触发重连...")
await self.close()
break

View File

@@ -281,24 +281,36 @@ class DiscordToOneBotConverter:
# 添加附件信息
if discord_message.attachments:
self.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}")
# 检查是否是语音文件
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}")
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}]"
else:
seg = OneBotMessageSegment.image(attachment.url)
self.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}")
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}")
# 添加贴纸 (Stickers) 信息
if hasattr(discord_message, 'stickers') and discord_message.stickers: