fix(chat): 修复消息处理中的潜在空指针和类型错误

为多个关键步骤增加了健壮性检查,以防止在处理消息时因意外的空值或类型不匹配而导致程序崩溃。

主要修复包括:
- 在记录消息日志前,检查 `user_info` 是否存在。
- 在判断事件是否中断前,检查事件处理结果 `result` 是否为 None。
- 在获取消息时间戳前,使用 `hasattr` 确认 `time` 属性的存在。
- 在检查群组静默状态时,将 `group_id` 转换为字符串以匹配配置列表。
This commit is contained in:
tt-P607
2025-10-23 01:08:33 +08:00
parent e8b7841f5a
commit e0c896920b

View File

@@ -12,7 +12,7 @@ from src.chat.message_manager import message_manager
from src.chat.message_receive.chat_stream import ChatStream, get_chat_manager
from src.chat.message_receive.message import MessageRecv, MessageRecvS4U
from src.chat.message_receive.storage import MessageStorage
from src.chat.utils.prompt import Prompt, global_prompt_manager
from src.chat.utils.prompt import Prompt, global_prompt_manager, create_prompt_async
from src.chat.utils.utils import is_mentioned_bot_in_message
from src.common.logger import get_logger
from src.config.config import global_config
@@ -461,9 +461,10 @@ class ChatBot:
# 在这里打印[所见]日志,确保在所有处理和过滤之前记录
chat_name = chat.group_info.group_name if chat.group_info else "私聊"
logger.info(
f"[{chat_name}]{message.message_info.user_info.user_nickname}:{message.processed_plain_text}\u001b[0m"
)
if message.message_info.user_info:
logger.info(
f"[{chat_name}]{message.message_info.user_info.user_nickname}:{message.processed_plain_text}\u001b[0m"
)
# 处理notice消息
notice_handled = await self.handle_notice_message(message)
@@ -594,7 +595,7 @@ class ChatBot:
return
result = await event_manager.trigger_event(EventType.ON_MESSAGE, permission_group="SYSTEM", message=message)
if not result.all_continue_process():
if result and not result.all_continue_process():
raise UserWarning(f"插件{result.get_summary().get('stopped_handlers', '')}于消息到达时取消了消息处理")
# TODO:暂不可用
@@ -605,13 +606,14 @@ class ChatBot:
async with global_prompt_manager.async_message_scope(template_group_name):
if isinstance(template_items, dict):
for k in template_items.keys():
await Prompt.create_async(template_items[k], k)
await create_prompt_async(template_items[k], k)
logger.debug(f"注册{template_items[k]},{k}")
else:
template_group_name = None
async def preprocess():
from src.common.data_models.database_data_model import DatabaseMessages
import time
message_info = message.message_info
msg_user_info = getattr(message_info, "user_info", None)
@@ -619,7 +621,7 @@ class ChatBot:
group_info = getattr(message.chat_stream, "group_info", None)
message_id = message_info.message_id or ""
message_time = message_info.time if message_info.time is not None else time.time()
message_time = message_info.time if hasattr(message_info, "time") and message_info.time is not None else time.time()
is_mentioned = None
if isinstance(message.is_mentioned, bool):
is_mentioned = message.is_mentioned
@@ -696,7 +698,7 @@ class ChatBot:
try:
# 在将消息添加到管理器之前进行最终的静默检查
should_process_in_manager = True
if group_info and group_info.group_id in global_config.message_receive.mute_group_list:
if group_info and str(group_info.group_id) in global_config.message_receive.mute_group_list:
if not message.is_mentioned:
logger.debug(f"群组 {group_info.group_id} 在静默列表中,且消息不是@或回复,跳过消息管理器处理")
should_process_in_manager = False