diff --git a/adapters/discord_adapter.py b/adapters/discord_adapter.py index b9565e5..7ba627f 100644 --- a/adapters/discord_adapter.py +++ b/adapters/discord_adapter.py @@ -188,7 +188,12 @@ class DiscordAdapter(discord.Client if DISCORD_AVAILABLE else object): self.logger.error(f"[DiscordAdapter] 未找到频道: {channel_id}") return - self.logger.info(f"[DiscordAdapter] 正在发送消息到频道 {channel_id}") + # 检查会话状态 + if not self.is_closed(): + self.logger.info(f"[DiscordAdapter] 正在发送消息到频道 {channel_id}") + else: + self.logger.error(f"[DiscordAdapter] 会话已关闭,无法发送消息到频道 {channel_id}") + return embed = None if embed_data: @@ -271,9 +276,20 @@ class DiscordAdapter(discord.Client if DISCORD_AVAILABLE else object): self.logger.error(f"[DiscordAdapter] 下载附件失败: {attachment_url}, 错误: {e}") if content or files or embed: - await channel.send(content=content, files=files if files else None, embed=embed) - - self.logger.success(f"[DiscordAdapter] 消息已发送到频道 {channel_id}") + try: + await channel.send(content=content, files=files if files else None, embed=embed) + self.logger.success(f"[DiscordAdapter] 消息已发送到频道 {channel_id}") + except Exception as send_error: + self.logger.error(f"[DiscordAdapter] 发送消息失败 (channel.send): {send_error}") + # 如果发送失败,尝试检查会话状态 + if self.is_closed(): + self.logger.warning(f"[DiscordAdapter] 会话已关闭,将触发重连") + await self.close() + # 重新启动客户端 + asyncio.create_task(self.start_client()) + raise + else: + self.logger.debug(f"[DiscordAdapter] 没有内容需要发送到频道 {channel_id}") except Exception as e: self.logger.error(f"[DiscordAdapter] 发送消息失败: {e}") diff --git a/adapters/router.py b/adapters/router.py index 396c005..46a5844 100644 --- a/adapters/router.py +++ b/adapters/router.py @@ -7,7 +7,7 @@ 实现原理: 1. 接收 Discord 消息 (`discord.Message`)。 -2. 将其“伪装”成 OneBot 的 `GroupMessageEvent` 或 `PrivateMessageEvent`。 +2. 将其"伪装"成 OneBot 的 `GroupMessageEvent` 或 `PrivateMessageEvent`。 3. 拦截插件调用的 `event.reply()` 方法。 4. 将插件返回的 OneBot `MessageSegment` 转换为 Discord 格式并发送。 """ @@ -227,8 +227,9 @@ class DiscordToOneBotConverter: Returns: 伪装后的 OneBot 事件对象 """ - # 在方法内部导入 logger,避免作用域问题 - from core.utils.logger import logger + # 在静态方法内部创建模块专用日志记录器 + from core.utils.logger import ModuleLogger + mod_logger = ModuleLogger("DiscordConverter") # 1. 提取基础信息 user_id = discord_message.author.id @@ -289,36 +290,36 @@ class DiscordToOneBotConverter: # 添加附件信息 if discord_message.attachments: - logger.debug(f"[DiscordToOneBotConverter] 检测到 {len(discord_message.attachments)} 个附件") + mod_logger.debug(f"[DiscordToOneBotConverter] 检测到 {len(discord_message.attachments)} 个附件") for attachment in discord_message.attachments: filename = attachment.filename.lower() - logger.debug(f"[DiscordToOneBotConverter] 处理附件: {attachment.filename}, MIME: {attachment.content_type}") + mod_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}]" - logger.debug(f"[DiscordToOneBotConverter] 识别为语音文件: {attachment.filename}") + mod_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}]" - logger.debug(f"[DiscordToOneBotConverter] 识别为视频文件: {attachment.filename}") + mod_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}]" - logger.debug(f"[DiscordToOneBotConverter] 识别为图片文件: {attachment.filename}") + mod_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}]" - logger.success(f"[DiscordToOneBotConverter] 识别为普通文件: {attachment.filename}") + mod_logger.success(f"[DiscordToOneBotConverter] 识别为普通文件: {attachment.filename}") # 添加贴纸 (Stickers) 信息 if hasattr(discord_message, 'stickers') and discord_message.stickers: diff --git a/plugins/discord-cross/__init__.py b/plugins/discord-cross/__init__.py index c132d9c..2e0956b 100644 --- a/plugins/discord-cross/__init__.py +++ b/plugins/discord-cross/__init__.py @@ -3,11 +3,14 @@ 跨平台消息互通插件入口 """ import asyncio -from core.utils.logger import logger +from core.utils.logger import ModuleLogger from .config import config from .subscription import start_cross_platform_subscription, stop_cross_platform_subscription from .handlers import * +# 创建模块专用日志记录器 +logger = ModuleLogger("CrossPlatform") + # 插件加载时自动启动和加载配置 try: asyncio.create_task(config.reload()) diff --git a/plugins/discord-cross/config.py b/plugins/discord-cross/config.py index 739fc33..28ab030 100644 --- a/plugins/discord-cross/config.py +++ b/plugins/discord-cross/config.py @@ -4,7 +4,10 @@ """ import os from typing import Dict, Any -from core.utils.logger import logger +from core.utils.logger import ModuleLogger + +# 创建模块专用日志记录器 +logger = ModuleLogger("CrossPlatformConfig") class CrossPlatformConfig: def __init__(self): diff --git a/plugins/discord-cross/handlers.py b/plugins/discord-cross/handlers.py index fb56424..fe2efff 100644 --- a/plugins/discord-cross/handlers.py +++ b/plugins/discord-cross/handlers.py @@ -9,11 +9,14 @@ from core.managers.command_manager import matcher from models.events.message import GroupMessageEvent, MessageEvent from models.message import MessageSegment from core.permission import Permission -from core.utils.logger import logger +from core.utils.logger import ModuleLogger from .config import config from .parser import parse_forward_nodes from .sender import forward_discord_to_qq, forward_qq_to_discord +# 创建模块专用日志记录器 +logger = ModuleLogger("CrossPlatform") + async def handle_discord_message( username: str, discriminator: str, diff --git a/plugins/discord-cross/parser.py b/plugins/discord-cross/parser.py index b49fffa..d85a372 100644 --- a/plugins/discord-cross/parser.py +++ b/plugins/discord-cross/parser.py @@ -7,9 +7,12 @@ import json import re from typing import Dict, List, Any from models.message import MessageSegment -from core.utils.logger import logger +from core.utils.logger import ModuleLogger from .config import config +# 创建模块专用日志记录器 +logger = ModuleLogger("CrossPlatformParser") + def extract_text_only(content: str) -> str: """从消息内容中提取纯文本,过滤掉非文本标记""" diff --git a/plugins/discord-cross/sender.py b/plugins/discord-cross/sender.py index 0e650c4..139f904 100644 --- a/plugins/discord-cross/sender.py +++ b/plugins/discord-cross/sender.py @@ -4,12 +4,15 @@ """ import json from typing import List -from core.utils.logger import logger +from core.utils.logger import ModuleLogger from core.managers.redis_manager import redis_manager from .config import config from .translator import translate_with_deepseek from .parser import format_discord_to_qq_content, format_qq_to_discord_content, extract_text_only +# 创建模块专用日志记录器 +logger = ModuleLogger("CrossPlatformSender") + async def send_to_discord(channel_id: int, content: str, attachments: List[dict] = None, embed: dict = None): """发送消息到 Discord 频道""" try: diff --git a/plugins/discord-cross/subscription.py b/plugins/discord-cross/subscription.py index 32a3e5a..e3708e3 100644 --- a/plugins/discord-cross/subscription.py +++ b/plugins/discord-cross/subscription.py @@ -4,11 +4,14 @@ """ import json import asyncio -from core.utils.logger import logger +from core.utils.logger import ModuleLogger from core.managers.redis_manager import redis_manager from .config import config from .sender import forward_discord_to_qq, forward_qq_to_discord +# 创建模块专用日志记录器 +logger = ModuleLogger("CrossPlatformSubscription") + async def cross_platform_subscription_loop(): """Redis 跨平台消息订阅循环""" if redis_manager.redis is None: diff --git a/plugins/discord-cross/translator.py b/plugins/discord-cross/translator.py index efc7233..472c7bf 100644 --- a/plugins/discord-cross/translator.py +++ b/plugins/discord-cross/translator.py @@ -3,9 +3,12 @@ 跨平台消息互通插件翻译模块 """ from typing import Dict, List -from core.utils.logger import logger +from core.utils.logger import ModuleLogger from .config import config +# 创建模块专用日志记录器 +logger = ModuleLogger("CrossPlatformTranslator") + # 翻译上下文缓存(每个通道15条消息) TRANSLATION_CONTEXT_CACHE: Dict[str, List[Dict[str, str]]] = {} MAX_CONTEXT_MESSAGES = 15