mirror of https://github.com/Mai-with-u/MaiBot.git
124 lines
4.4 KiB
Python
124 lines
4.4 KiB
Python
import traceback
|
||
|
||
from maim_message import UserInfo
|
||
from src.config.config import global_config
|
||
from src.common.logger_manager import get_logger
|
||
from ..chat.chat_stream import chat_manager
|
||
from typing import Optional, Dict, Any
|
||
from .pfc_manager import PFCManager
|
||
from src.plugins.chat.message import MessageRecv
|
||
from src.plugins.storage.storage import MessageStorage
|
||
from datetime import datetime
|
||
|
||
|
||
logger = get_logger("pfc_processor")
|
||
|
||
|
||
async def _handle_error(error: Exception, context: str, message: Optional[MessageRecv] = None) -> None:
|
||
"""统一的错误处理函数
|
||
|
||
Args:
|
||
error: 捕获到的异常
|
||
context: 错误发生的上下文描述
|
||
message: 可选的消息对象,用于记录相关消息内容
|
||
"""
|
||
logger.error(f"{context}: {error}")
|
||
logger.error(traceback.format_exc())
|
||
if message and hasattr(message, "raw_message"):
|
||
logger.error(f"相关消息原始内容: {message.raw_message}")
|
||
|
||
|
||
class PFCProcessor:
|
||
"""PFC 处理器,负责处理接收到的信息并计数"""
|
||
|
||
def __init__(self):
|
||
"""初始化 PFC 处理器,创建消息存储实例"""
|
||
self.storage = MessageStorage()
|
||
self.pfc_manager = PFCManager.get_instance()
|
||
|
||
async def process_message(self, message_data: Dict[str, Any]) -> None:
|
||
"""处理接收到的原始消息数据
|
||
|
||
主要流程:
|
||
1. 消息解析与初始化
|
||
2. 过滤检查
|
||
3. 消息存储
|
||
4. 创建 PFC 流
|
||
5. 日志记录
|
||
|
||
Args:
|
||
message_data: 原始消息字符串
|
||
"""
|
||
message = None
|
||
try:
|
||
# 1. 消息解析与初始化
|
||
message = MessageRecv(message_data)
|
||
groupinfo = message.message_info.group_info
|
||
userinfo = message.message_info.user_info
|
||
messageinfo = message.message_info
|
||
|
||
logger.trace(f"准备为{userinfo.user_id}创建/获取聊天流")
|
||
chat = await chat_manager.get_or_create_stream(
|
||
platform=messageinfo.platform,
|
||
user_info=userinfo,
|
||
group_info=groupinfo,
|
||
)
|
||
message.update_chat_stream(chat)
|
||
|
||
# 2. 过滤检查
|
||
# 处理消息
|
||
await message.process()
|
||
# 过滤词/正则表达式过滤
|
||
if self._check_ban_words(message.processed_plain_text, userinfo) or self._check_ban_regex(
|
||
message.raw_message, userinfo
|
||
):
|
||
return
|
||
|
||
# 3. 消息存储
|
||
await self.storage.store_message(message, chat)
|
||
logger.trace(f"存储成功: {message.processed_plain_text}")
|
||
|
||
# 4. 创建 PFC 聊天流
|
||
await self._create_pfc_chat(message)
|
||
|
||
# 5. 日志记录
|
||
# 将时间戳转换为datetime对象
|
||
current_time = datetime.fromtimestamp(message.message_info.time).strftime("%H:%M:%S")
|
||
logger.info(
|
||
f"[{current_time}][私聊]{message.message_info.user_info.user_nickname}: {message.processed_plain_text}"
|
||
)
|
||
|
||
except Exception as e:
|
||
await _handle_error(e, "消息处理失败", message)
|
||
|
||
async def _create_pfc_chat(self, message: MessageRecv):
|
||
try:
|
||
chat_id = str(message.chat_stream.stream_id)
|
||
private_name = str(message.message_info.user_info.user_nickname)
|
||
|
||
if global_config.enable_pfc_chatting:
|
||
await self.pfc_manager.get_or_create_conversation(chat_id, private_name)
|
||
|
||
except Exception as e:
|
||
logger.error(f"创建PFC聊天失败: {e}")
|
||
|
||
@staticmethod
|
||
def _check_ban_words(text: str, userinfo: UserInfo) -> bool:
|
||
"""检查消息中是否包含过滤词"""
|
||
for word in global_config.ban_words:
|
||
if word in text:
|
||
logger.info(f"[私聊]{userinfo.user_nickname}:{text}")
|
||
logger.info(f"[过滤词识别]消息中含有{word},filtered")
|
||
return True
|
||
return False
|
||
|
||
@staticmethod
|
||
def _check_ban_regex(text: str, userinfo: UserInfo) -> bool:
|
||
"""检查消息是否匹配过滤正则表达式"""
|
||
for pattern in global_config.ban_msgs_regex:
|
||
if pattern.search(text):
|
||
logger.info(f"[私聊]{userinfo.user_nickname}:{text}")
|
||
logger.info(f"[正则表达式过滤]消息匹配到{pattern},filtered")
|
||
return True
|
||
return False
|