fix(discord): 修复 WebSocket 连接检测并增强跨平台文件处理 (#73)
修复 Discord WebSocket 连接检测逻辑,使用正确的属性检查连接状态 为跨平台消息处理添加文件类型支持,并增加详细的调试日志 优化附件处理逻辑,确保所有文件类型都能正确识别和转发
This commit is contained in:
@@ -27,6 +27,7 @@ async def handle_discord_message(
|
||||
return
|
||||
|
||||
logger.info(f"[CrossPlatform] 收到 Discord 消息: {username}#{discriminator} in {channel_id}")
|
||||
logger.debug(f"[CrossPlatform] 消息内容: '{content}', 附件: {attachments}")
|
||||
await forward_discord_to_qq(username, discriminator, content, channel_id, attachments)
|
||||
|
||||
async def handle_qq_message(
|
||||
@@ -100,6 +101,16 @@ async def handle_qq_group_message(event: GroupMessageEvent):
|
||||
file_name = os.path.basename(file_url.split('?')[0]) or f"record_{len(attachments)}.amr"
|
||||
attachments.append({"type": "record", "url": file_url, "filename": file_name})
|
||||
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")
|
||||
if file_url:
|
||||
file_url = html.unescape(str(file_url))
|
||||
if not file_name:
|
||||
file_name = os.path.basename(file_url.split('?')[0]) or f"file_{len(attachments)}"
|
||||
attachments.append({"type": "file", "url": file_url, "filename": file_name})
|
||||
content += f"\n[文件: {file_name}]\n"
|
||||
logger.debug(f"[CrossPlatform] QQ 消息识别到文件: {file_name}, URL: {file_url}")
|
||||
elif segment.type == "at":
|
||||
qq_id = segment.data.get("qq")
|
||||
if qq_id and qq_id != "all":
|
||||
@@ -143,16 +154,22 @@ async def handle_discord_message_event(event: Any):
|
||||
if not config.ENABLE_CROSS_PLATFORM:
|
||||
return
|
||||
|
||||
logger.debug(f"[CrossPlatform] handle_discord_message_event 触发: {event}")
|
||||
if not hasattr(event, '_is_discord_message'):
|
||||
logger.debug(f"[CrossPlatform] 事件没有 _is_discord_message 属性,跳过")
|
||||
return
|
||||
|
||||
logger.debug(f"[CrossPlatform] 检测到 Discord 事件")
|
||||
discord_channel_id = getattr(event, 'discord_channel_id', None)
|
||||
if discord_channel_id is None:
|
||||
logger.debug(f"[CrossPlatform] discord_channel_id 为 None")
|
||||
return
|
||||
|
||||
content = ""
|
||||
attachments = []
|
||||
|
||||
logger.debug(f"[CrossPlatform] 开始处理 Discord 事件消息: channel_id={discord_channel_id}")
|
||||
|
||||
if hasattr(event, 'message') and isinstance(event.message, list):
|
||||
for segment in event.message:
|
||||
if isinstance(segment, MessageSegment):
|
||||
@@ -182,14 +199,26 @@ 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)
|
||||
elif segment.type == "file":
|
||||
file_url = segment.data.get("url") or segment.data.get("file")
|
||||
file_name = segment.data.get("filename")
|
||||
if file_url:
|
||||
file_name = file_name or os.path.basename(str(file_url).split('?')[0]) or "file"
|
||||
attachment_item = {"type": "file", "url": str(file_url), "filename": file_name}
|
||||
if attachment_item not in attachments:
|
||||
attachments.append(attachment_item)
|
||||
logger.debug(f"[CrossPlatform] Discord 消息识别到文件: {file_name}, URL: {file_url}")
|
||||
else:
|
||||
content = event.raw_message or ""
|
||||
|
||||
content = content.strip()
|
||||
|
||||
logger.debug(f"[CrossPlatform] Discord 消息内容: '{content}', 附件数量: {len(attachments)}")
|
||||
|
||||
discord_username = getattr(event, 'discord_username', 'Unknown')
|
||||
discord_discriminator = getattr(event, 'discord_discriminator', '')
|
||||
|
||||
logger.debug(f"[CrossPlatform] 调用 handle_discord_message: username={discord_username}, channel_id={discord_channel_id}")
|
||||
await handle_discord_message(
|
||||
username=discord_username,
|
||||
discriminator=discord_discriminator,
|
||||
|
||||
Reference in New Issue
Block a user