feat:初版
This commit is contained in:
88
utils/message_hook.py
Normal file
88
utils/message_hook.py
Normal file
@@ -0,0 +1,88 @@
|
||||
"""
|
||||
消息发送钩子工具
|
||||
|
||||
用于自动记录机器人发送的消息到 MessageLogger
|
||||
"""
|
||||
|
||||
from loguru import logger
|
||||
|
||||
|
||||
async def log_bot_message(to_wxid: str, content: str, msg_type: str = "text", media_url: str = ""):
|
||||
"""
|
||||
记录机器人发送的消息到 MessageLogger
|
||||
|
||||
Args:
|
||||
to_wxid: 接收者微信ID
|
||||
content: 消息内容
|
||||
msg_type: 消息类型 (text/image/video/file等)
|
||||
media_url: 媒体文件URL (可选)
|
||||
"""
|
||||
try:
|
||||
logger.info(f"message_hook: 开始记录机器人消息")
|
||||
|
||||
# 动态导入避免循环依赖
|
||||
from plugins.MessageLogger.main import MessageLogger
|
||||
logger.info(f"message_hook: MessageLogger 导入成功")
|
||||
|
||||
# 获取 MessageLogger 实例
|
||||
message_logger = MessageLogger.get_instance()
|
||||
logger.info(f"message_hook: MessageLogger 实例: {message_logger}")
|
||||
|
||||
if message_logger:
|
||||
logger.info(f"message_hook: 调用 save_bot_message")
|
||||
await message_logger.save_bot_message(to_wxid, content, msg_type, media_url)
|
||||
logger.info(f"message_hook: save_bot_message 调用完成")
|
||||
else:
|
||||
logger.warning("MessageLogger 实例未找到,跳过消息记录")
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"记录机器人消息失败: {e}")
|
||||
import traceback
|
||||
logger.error(f"详细错误: {traceback.format_exc()}")
|
||||
|
||||
|
||||
def create_message_hook(original_method):
|
||||
"""
|
||||
创建消息发送钩子装饰器
|
||||
|
||||
Args:
|
||||
original_method: 原始的发送消息方法
|
||||
|
||||
Returns:
|
||||
包装后的方法
|
||||
"""
|
||||
async def wrapper(self, to_wxid: str, content: str, *args, **kwargs):
|
||||
# 调用原始方法
|
||||
result = await original_method(self, to_wxid, content, *args, **kwargs)
|
||||
|
||||
# 记录消息
|
||||
await log_bot_message(to_wxid, content, "text")
|
||||
|
||||
return result
|
||||
|
||||
return wrapper
|
||||
|
||||
|
||||
def create_file_message_hook(original_method, msg_type: str):
|
||||
"""
|
||||
创建文件消息发送钩子装饰器
|
||||
|
||||
Args:
|
||||
original_method: 原始的发送文件方法
|
||||
msg_type: 消息类型
|
||||
|
||||
Returns:
|
||||
包装后的方法
|
||||
"""
|
||||
async def wrapper(self, to_wxid: str, file_path: str, *args, **kwargs):
|
||||
# 调用原始方法
|
||||
result = await original_method(self, to_wxid, file_path, *args, **kwargs)
|
||||
|
||||
# 记录消息
|
||||
import os
|
||||
filename = os.path.basename(file_path)
|
||||
await log_bot_message(to_wxid, f"[{msg_type}] {filename}", msg_type, file_path)
|
||||
|
||||
return result
|
||||
|
||||
return wrapper
|
||||
Reference in New Issue
Block a user