refactor(discord-cross): 使用模块专用日志记录器替换全局日志记录器
将各模块中的全局日志记录器替换为模块专用日志记录器,以提供更清晰的日志来源标识 同时在适配器中添加会话状态检查和重连机制,提升消息发送的可靠性
This commit is contained in:
@@ -188,7 +188,12 @@ class DiscordAdapter(discord.Client if DISCORD_AVAILABLE else object):
|
|||||||
self.logger.error(f"[DiscordAdapter] 未找到频道: {channel_id}")
|
self.logger.error(f"[DiscordAdapter] 未找到频道: {channel_id}")
|
||||||
return
|
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
|
embed = None
|
||||||
if embed_data:
|
if embed_data:
|
||||||
@@ -271,9 +276,20 @@ class DiscordAdapter(discord.Client if DISCORD_AVAILABLE else object):
|
|||||||
self.logger.error(f"[DiscordAdapter] 下载附件失败: {attachment_url}, 错误: {e}")
|
self.logger.error(f"[DiscordAdapter] 下载附件失败: {attachment_url}, 错误: {e}")
|
||||||
|
|
||||||
if content or files or embed:
|
if content or files or embed:
|
||||||
await channel.send(content=content, files=files if files else None, embed=embed)
|
try:
|
||||||
|
await channel.send(content=content, files=files if files else None, embed=embed)
|
||||||
self.logger.success(f"[DiscordAdapter] 消息已发送到频道 {channel_id}")
|
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:
|
except Exception as e:
|
||||||
self.logger.error(f"[DiscordAdapter] 发送消息失败: {e}")
|
self.logger.error(f"[DiscordAdapter] 发送消息失败: {e}")
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
实现原理:
|
实现原理:
|
||||||
1. 接收 Discord 消息 (`discord.Message`)。
|
1. 接收 Discord 消息 (`discord.Message`)。
|
||||||
2. 将其“伪装”成 OneBot 的 `GroupMessageEvent` 或 `PrivateMessageEvent`。
|
2. 将其"伪装"成 OneBot 的 `GroupMessageEvent` 或 `PrivateMessageEvent`。
|
||||||
3. 拦截插件调用的 `event.reply()` 方法。
|
3. 拦截插件调用的 `event.reply()` 方法。
|
||||||
4. 将插件返回的 OneBot `MessageSegment` 转换为 Discord 格式并发送。
|
4. 将插件返回的 OneBot `MessageSegment` 转换为 Discord 格式并发送。
|
||||||
"""
|
"""
|
||||||
@@ -227,8 +227,9 @@ class DiscordToOneBotConverter:
|
|||||||
Returns:
|
Returns:
|
||||||
伪装后的 OneBot 事件对象
|
伪装后的 OneBot 事件对象
|
||||||
"""
|
"""
|
||||||
# 在方法内部导入 logger,避免作用域问题
|
# 在静态方法内部创建模块专用日志记录器
|
||||||
from core.utils.logger import logger
|
from core.utils.logger import ModuleLogger
|
||||||
|
mod_logger = ModuleLogger("DiscordConverter")
|
||||||
|
|
||||||
# 1. 提取基础信息
|
# 1. 提取基础信息
|
||||||
user_id = discord_message.author.id
|
user_id = discord_message.author.id
|
||||||
@@ -289,36 +290,36 @@ class DiscordToOneBotConverter:
|
|||||||
|
|
||||||
# 添加附件信息
|
# 添加附件信息
|
||||||
if discord_message.attachments:
|
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:
|
for attachment in discord_message.attachments:
|
||||||
filename = attachment.filename.lower()
|
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')):
|
if filename.endswith(('.amr', '.silk', '.mp3', '.wav', '.ogg', '.m4a')):
|
||||||
seg = OneBotMessageSegment.record(attachment.url)
|
seg = OneBotMessageSegment.record(attachment.url)
|
||||||
seg.data["filename"] = attachment.filename
|
seg.data["filename"] = attachment.filename
|
||||||
message_list.append(seg)
|
message_list.append(seg)
|
||||||
raw_message += f"\n[语音: {attachment.filename}]"
|
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')):
|
elif filename.endswith(('.mp4', '.avi', '.mkv', '.mov', '.flv', '.wmv')):
|
||||||
seg = OneBotMessageSegment.video(attachment.url)
|
seg = OneBotMessageSegment.video(attachment.url)
|
||||||
seg.data["filename"] = attachment.filename
|
seg.data["filename"] = attachment.filename
|
||||||
message_list.append(seg)
|
message_list.append(seg)
|
||||||
raw_message += f"\n[视频: {attachment.filename}]"
|
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')):
|
elif filename.endswith(('.png', '.jpg', '.jpeg', '.gif', '.webp')):
|
||||||
image_type = "gif" if filename.endswith('.gif') else None
|
image_type = "gif" if filename.endswith('.gif') else None
|
||||||
seg = OneBotMessageSegment.image(attachment.url, image_type=image_type)
|
seg = OneBotMessageSegment.image(attachment.url, image_type=image_type)
|
||||||
seg.data["filename"] = attachment.filename
|
seg.data["filename"] = attachment.filename
|
||||||
message_list.append(seg)
|
message_list.append(seg)
|
||||||
raw_message += f"\n[图片: {attachment.filename}]"
|
raw_message += f"\n[图片: {attachment.filename}]"
|
||||||
logger.debug(f"[DiscordToOneBotConverter] 识别为图片文件: {attachment.filename}")
|
mod_logger.debug(f"[DiscordToOneBotConverter] 识别为图片文件: {attachment.filename}")
|
||||||
else:
|
else:
|
||||||
seg = OneBotMessageSegment.file(attachment.url)
|
seg = OneBotMessageSegment.file(attachment.url)
|
||||||
seg.data["filename"] = attachment.filename
|
seg.data["filename"] = attachment.filename
|
||||||
message_list.append(seg)
|
message_list.append(seg)
|
||||||
raw_message += f"\n[文件: {attachment.filename}]"
|
raw_message += f"\n[文件: {attachment.filename}]"
|
||||||
logger.success(f"[DiscordToOneBotConverter] 识别为普通文件: {attachment.filename}")
|
mod_logger.success(f"[DiscordToOneBotConverter] 识别为普通文件: {attachment.filename}")
|
||||||
|
|
||||||
# 添加贴纸 (Stickers) 信息
|
# 添加贴纸 (Stickers) 信息
|
||||||
if hasattr(discord_message, 'stickers') and discord_message.stickers:
|
if hasattr(discord_message, 'stickers') and discord_message.stickers:
|
||||||
|
|||||||
@@ -3,11 +3,14 @@
|
|||||||
跨平台消息互通插件入口
|
跨平台消息互通插件入口
|
||||||
"""
|
"""
|
||||||
import asyncio
|
import asyncio
|
||||||
from core.utils.logger import logger
|
from core.utils.logger import ModuleLogger
|
||||||
from .config import config
|
from .config import config
|
||||||
from .subscription import start_cross_platform_subscription, stop_cross_platform_subscription
|
from .subscription import start_cross_platform_subscription, stop_cross_platform_subscription
|
||||||
from .handlers import *
|
from .handlers import *
|
||||||
|
|
||||||
|
# 创建模块专用日志记录器
|
||||||
|
logger = ModuleLogger("CrossPlatform")
|
||||||
|
|
||||||
# 插件加载时自动启动和加载配置
|
# 插件加载时自动启动和加载配置
|
||||||
try:
|
try:
|
||||||
asyncio.create_task(config.reload())
|
asyncio.create_task(config.reload())
|
||||||
|
|||||||
@@ -4,7 +4,10 @@
|
|||||||
"""
|
"""
|
||||||
import os
|
import os
|
||||||
from typing import Dict, Any
|
from typing import Dict, Any
|
||||||
from core.utils.logger import logger
|
from core.utils.logger import ModuleLogger
|
||||||
|
|
||||||
|
# 创建模块专用日志记录器
|
||||||
|
logger = ModuleLogger("CrossPlatformConfig")
|
||||||
|
|
||||||
class CrossPlatformConfig:
|
class CrossPlatformConfig:
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
|
|||||||
@@ -9,11 +9,14 @@ from core.managers.command_manager import matcher
|
|||||||
from models.events.message import GroupMessageEvent, MessageEvent
|
from models.events.message import GroupMessageEvent, MessageEvent
|
||||||
from models.message import MessageSegment
|
from models.message import MessageSegment
|
||||||
from core.permission import Permission
|
from core.permission import Permission
|
||||||
from core.utils.logger import logger
|
from core.utils.logger import ModuleLogger
|
||||||
from .config import config
|
from .config import config
|
||||||
from .parser import parse_forward_nodes
|
from .parser import parse_forward_nodes
|
||||||
from .sender import forward_discord_to_qq, forward_qq_to_discord
|
from .sender import forward_discord_to_qq, forward_qq_to_discord
|
||||||
|
|
||||||
|
# 创建模块专用日志记录器
|
||||||
|
logger = ModuleLogger("CrossPlatform")
|
||||||
|
|
||||||
async def handle_discord_message(
|
async def handle_discord_message(
|
||||||
username: str,
|
username: str,
|
||||||
discriminator: str,
|
discriminator: str,
|
||||||
|
|||||||
@@ -7,9 +7,12 @@ import json
|
|||||||
import re
|
import re
|
||||||
from typing import Dict, List, Any
|
from typing import Dict, List, Any
|
||||||
from models.message import MessageSegment
|
from models.message import MessageSegment
|
||||||
from core.utils.logger import logger
|
from core.utils.logger import ModuleLogger
|
||||||
from .config import config
|
from .config import config
|
||||||
|
|
||||||
|
# 创建模块专用日志记录器
|
||||||
|
logger = ModuleLogger("CrossPlatformParser")
|
||||||
|
|
||||||
|
|
||||||
def extract_text_only(content: str) -> str:
|
def extract_text_only(content: str) -> str:
|
||||||
"""从消息内容中提取纯文本,过滤掉非文本标记"""
|
"""从消息内容中提取纯文本,过滤掉非文本标记"""
|
||||||
|
|||||||
@@ -4,12 +4,15 @@
|
|||||||
"""
|
"""
|
||||||
import json
|
import json
|
||||||
from typing import List
|
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 core.managers.redis_manager import redis_manager
|
||||||
from .config import config
|
from .config import config
|
||||||
from .translator import translate_with_deepseek
|
from .translator import translate_with_deepseek
|
||||||
from .parser import format_discord_to_qq_content, format_qq_to_discord_content, extract_text_only
|
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):
|
async def send_to_discord(channel_id: int, content: str, attachments: List[dict] = None, embed: dict = None):
|
||||||
"""发送消息到 Discord 频道"""
|
"""发送消息到 Discord 频道"""
|
||||||
try:
|
try:
|
||||||
|
|||||||
@@ -4,11 +4,14 @@
|
|||||||
"""
|
"""
|
||||||
import json
|
import json
|
||||||
import asyncio
|
import asyncio
|
||||||
from core.utils.logger import logger
|
from core.utils.logger import ModuleLogger
|
||||||
from core.managers.redis_manager import redis_manager
|
from core.managers.redis_manager import redis_manager
|
||||||
from .config import config
|
from .config import config
|
||||||
from .sender import forward_discord_to_qq, forward_qq_to_discord
|
from .sender import forward_discord_to_qq, forward_qq_to_discord
|
||||||
|
|
||||||
|
# 创建模块专用日志记录器
|
||||||
|
logger = ModuleLogger("CrossPlatformSubscription")
|
||||||
|
|
||||||
async def cross_platform_subscription_loop():
|
async def cross_platform_subscription_loop():
|
||||||
"""Redis 跨平台消息订阅循环"""
|
"""Redis 跨平台消息订阅循环"""
|
||||||
if redis_manager.redis is None:
|
if redis_manager.redis is None:
|
||||||
|
|||||||
@@ -3,9 +3,12 @@
|
|||||||
跨平台消息互通插件翻译模块
|
跨平台消息互通插件翻译模块
|
||||||
"""
|
"""
|
||||||
from typing import Dict, List
|
from typing import Dict, List
|
||||||
from core.utils.logger import logger
|
from core.utils.logger import ModuleLogger
|
||||||
from .config import config
|
from .config import config
|
||||||
|
|
||||||
|
# 创建模块专用日志记录器
|
||||||
|
logger = ModuleLogger("CrossPlatformTranslator")
|
||||||
|
|
||||||
# 翻译上下文缓存(每个通道15条消息)
|
# 翻译上下文缓存(每个通道15条消息)
|
||||||
TRANSLATION_CONTEXT_CACHE: Dict[str, List[Dict[str, str]]] = {}
|
TRANSLATION_CONTEXT_CACHE: Dict[str, List[Dict[str, str]]] = {}
|
||||||
MAX_CONTEXT_MESSAGES = 15
|
MAX_CONTEXT_MESSAGES = 15
|
||||||
|
|||||||
Reference in New Issue
Block a user