重构消息处理并用DatabaseMessages替换MessageRecv
-更新PlusCommand以使用DatabaseMessages而不是MessageRecv。 -将消息处理逻辑重构到一个新模块message_processor.py中,以处理消息段并从消息字典中创建DatabaseMessages。 -删除了已弃用的MessageRecv类及其相关逻辑。 -调整了各种插件以适应新的DatabaseMessages结构。 -增强了消息处理功能中的错误处理和日志记录。
This commit is contained in:
@@ -86,13 +86,16 @@ async def file_to_stream(
|
||||
import asyncio
|
||||
import time
|
||||
import traceback
|
||||
from typing import Any
|
||||
from typing import Any, TYPE_CHECKING
|
||||
|
||||
from maim_message import Seg, UserInfo
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from src.common.data_models.database_data_model import DatabaseMessages
|
||||
|
||||
# 导入依赖
|
||||
from src.chat.message_receive.chat_stream import ChatStream, get_chat_manager
|
||||
from src.chat.message_receive.message import MessageRecv, MessageSending
|
||||
from src.chat.message_receive.message import MessageSending
|
||||
from src.chat.message_receive.uni_message_sender import HeartFCSender
|
||||
from src.common.logger import get_logger
|
||||
from src.config.config import global_config
|
||||
@@ -104,84 +107,53 @@ logger = get_logger("send_api")
|
||||
_adapter_response_pool: dict[str, asyncio.Future] = {}
|
||||
|
||||
|
||||
def message_dict_to_message_recv(message_dict: dict[str, Any]) -> MessageRecv | None:
|
||||
"""查找要回复的消息
|
||||
def message_dict_to_db_message(message_dict: dict[str, Any]) -> "DatabaseMessages | None":
|
||||
"""从消息字典构建 DatabaseMessages 对象
|
||||
|
||||
Args:
|
||||
message_dict: 消息字典或 DatabaseMessages 对象
|
||||
|
||||
Returns:
|
||||
Optional[MessageRecv]: 找到的消息,如果没找到则返回None
|
||||
Optional[DatabaseMessages]: 构建的消息对象,如果构建失败则返回None
|
||||
"""
|
||||
# 兼容 DatabaseMessages 对象和字典
|
||||
if isinstance(message_dict, dict):
|
||||
user_platform = message_dict.get("user_platform", "")
|
||||
user_id = message_dict.get("user_id", "")
|
||||
user_nickname = message_dict.get("user_nickname", "")
|
||||
user_cardname = message_dict.get("user_cardname", "")
|
||||
chat_info_group_id = message_dict.get("chat_info_group_id")
|
||||
chat_info_group_platform = message_dict.get("chat_info_group_platform", "")
|
||||
chat_info_group_name = message_dict.get("chat_info_group_name", "")
|
||||
chat_info_platform = message_dict.get("chat_info_platform", "")
|
||||
message_id = message_dict.get("message_id") or message_dict.get("chat_info_message_id") or message_dict.get("id")
|
||||
time_val = message_dict.get("time")
|
||||
additional_config = message_dict.get("additional_config")
|
||||
processed_plain_text = message_dict.get("processed_plain_text")
|
||||
else:
|
||||
# DatabaseMessages 对象
|
||||
user_platform = getattr(message_dict, "user_platform", "")
|
||||
user_id = getattr(message_dict, "user_id", "")
|
||||
user_nickname = getattr(message_dict, "user_nickname", "")
|
||||
user_cardname = getattr(message_dict, "user_cardname", "")
|
||||
chat_info_group_id = getattr(message_dict, "chat_info_group_id", None)
|
||||
chat_info_group_platform = getattr(message_dict, "chat_info_group_platform", "")
|
||||
chat_info_group_name = getattr(message_dict, "chat_info_group_name", "")
|
||||
chat_info_platform = getattr(message_dict, "chat_info_platform", "")
|
||||
message_id = getattr(message_dict, "message_id", None)
|
||||
time_val = getattr(message_dict, "time", None)
|
||||
additional_config = getattr(message_dict, "additional_config", None)
|
||||
processed_plain_text = getattr(message_dict, "processed_plain_text", "")
|
||||
from src.common.data_models.database_data_model import DatabaseMessages
|
||||
|
||||
# 构建MessageRecv对象
|
||||
user_info = {
|
||||
"platform": user_platform,
|
||||
"user_id": user_id,
|
||||
"user_nickname": user_nickname,
|
||||
"user_cardname": user_cardname,
|
||||
}
|
||||
|
||||
group_info = {}
|
||||
if chat_info_group_id:
|
||||
group_info = {
|
||||
"platform": chat_info_group_platform,
|
||||
"group_id": chat_info_group_id,
|
||||
"group_name": chat_info_group_name,
|
||||
}
|
||||
|
||||
format_info = {"content_format": "", "accept_format": ""}
|
||||
template_info = {"template_items": {}}
|
||||
|
||||
message_info = {
|
||||
"platform": chat_info_platform,
|
||||
"message_id": message_id,
|
||||
"time": time_val,
|
||||
"group_info": group_info,
|
||||
"user_info": user_info,
|
||||
"additional_config": additional_config,
|
||||
"format_info": format_info,
|
||||
"template_info": template_info,
|
||||
}
|
||||
|
||||
new_message_dict = {
|
||||
"message_info": message_info,
|
||||
"raw_message": processed_plain_text,
|
||||
"processed_plain_text": processed_plain_text,
|
||||
}
|
||||
|
||||
message_recv = MessageRecv(new_message_dict)
|
||||
|
||||
logger.info(f"[SendAPI] 找到匹配的回复消息,发送者: {user_nickname}")
|
||||
return message_recv
|
||||
# 如果已经是 DatabaseMessages,直接返回
|
||||
if isinstance(message_dict, DatabaseMessages):
|
||||
return message_dict
|
||||
|
||||
# 从字典提取信息
|
||||
user_platform = message_dict.get("user_platform", "")
|
||||
user_id = message_dict.get("user_id", "")
|
||||
user_nickname = message_dict.get("user_nickname", "")
|
||||
user_cardname = message_dict.get("user_cardname", "")
|
||||
chat_info_group_id = message_dict.get("chat_info_group_id")
|
||||
chat_info_group_platform = message_dict.get("chat_info_group_platform", "")
|
||||
chat_info_group_name = message_dict.get("chat_info_group_name", "")
|
||||
chat_info_platform = message_dict.get("chat_info_platform", "")
|
||||
message_id = message_dict.get("message_id") or message_dict.get("chat_info_message_id") or message_dict.get("id")
|
||||
time_val = message_dict.get("time", time.time())
|
||||
additional_config = message_dict.get("additional_config")
|
||||
processed_plain_text = message_dict.get("processed_plain_text", "")
|
||||
|
||||
# DatabaseMessages 使用扁平参数构造
|
||||
db_message = DatabaseMessages(
|
||||
message_id=message_id or "temp_reply_id",
|
||||
time=time_val,
|
||||
user_id=user_id,
|
||||
user_nickname=user_nickname,
|
||||
user_cardname=user_cardname,
|
||||
user_platform=user_platform,
|
||||
chat_info_group_id=chat_info_group_id,
|
||||
chat_info_group_name=chat_info_group_name,
|
||||
chat_info_group_platform=chat_info_group_platform,
|
||||
chat_info_platform=chat_info_platform,
|
||||
processed_plain_text=processed_plain_text,
|
||||
additional_config=additional_config
|
||||
)
|
||||
|
||||
logger.info(f"[SendAPI] 构建回复消息对象,发送者: {user_nickname}")
|
||||
return db_message
|
||||
|
||||
|
||||
def put_adapter_response(request_id: str, response_data: dict) -> None:
|
||||
@@ -285,17 +257,17 @@ async def _send_to_target(
|
||||
"message_id": "temp_reply_id", # 临时ID
|
||||
"time": time.time()
|
||||
}
|
||||
anchor_message = message_dict_to_message_recv(message_dict=temp_message_dict)
|
||||
anchor_message = message_dict_to_db_message(message_dict=temp_message_dict)
|
||||
else:
|
||||
anchor_message = None
|
||||
reply_to_platform_id = f"{target_stream.platform}:{sender_id}" if anchor_message else None
|
||||
|
||||
elif reply_to_message:
|
||||
anchor_message = message_dict_to_message_recv(message_dict=reply_to_message)
|
||||
anchor_message = message_dict_to_db_message(message_dict=reply_to_message)
|
||||
if anchor_message:
|
||||
anchor_message.update_chat_stream(target_stream)
|
||||
# DatabaseMessages 不需要 update_chat_stream,它是纯数据对象
|
||||
reply_to_platform_id = (
|
||||
f"{anchor_message.message_info.platform}:{anchor_message.message_info.user_info.user_id}"
|
||||
f"{anchor_message.chat_info.platform}:{anchor_message.user_info.user_id}"
|
||||
)
|
||||
else:
|
||||
reply_to_platform_id = None
|
||||
|
||||
@@ -1,10 +1,14 @@
|
||||
from abc import ABC, abstractmethod
|
||||
from typing import TYPE_CHECKING
|
||||
|
||||
from src.chat.message_receive.message import MessageRecv
|
||||
from src.common.data_models.database_data_model import DatabaseMessages
|
||||
from src.common.logger import get_logger
|
||||
from src.plugin_system.apis import send_api
|
||||
from src.plugin_system.base.component_types import ChatType, CommandInfo, ComponentType
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from src.chat.message_receive.chat_stream import ChatStream
|
||||
|
||||
logger = get_logger("base_command")
|
||||
|
||||
|
||||
@@ -29,11 +33,11 @@ class BaseCommand(ABC):
|
||||
chat_type_allow: ChatType = ChatType.ALL
|
||||
"""允许的聊天类型,默认为所有类型"""
|
||||
|
||||
def __init__(self, message: MessageRecv, plugin_config: dict | None = None):
|
||||
def __init__(self, message: DatabaseMessages, plugin_config: dict | None = None):
|
||||
"""初始化Command组件
|
||||
|
||||
Args:
|
||||
message: 接收到的消息对象
|
||||
message: 接收到的消息对象(DatabaseMessages)
|
||||
plugin_config: 插件配置字典
|
||||
"""
|
||||
self.message = message
|
||||
@@ -41,6 +45,9 @@ class BaseCommand(ABC):
|
||||
self.plugin_config = plugin_config or {} # 直接存储插件配置字典
|
||||
|
||||
self.log_prefix = "[Command]"
|
||||
|
||||
# chat_stream 会在运行时被 bot.py 设置
|
||||
self.chat_stream: "ChatStream | None" = None
|
||||
|
||||
# 从类属性获取chat_type_allow设置
|
||||
self.chat_type_allow = getattr(self.__class__, "chat_type_allow", ChatType.ALL)
|
||||
@@ -49,7 +56,7 @@ class BaseCommand(ABC):
|
||||
|
||||
# 验证聊天类型限制
|
||||
if not self._validate_chat_type():
|
||||
is_group = hasattr(self.message, "is_group_message") and self.message.is_group_message
|
||||
is_group = message.group_info is not None
|
||||
logger.warning(
|
||||
f"{self.log_prefix} Command '{self.command_name}' 不支持当前聊天类型: "
|
||||
f"{'群聊' if is_group else '私聊'}, 允许类型: {self.chat_type_allow.value}"
|
||||
@@ -72,8 +79,8 @@ class BaseCommand(ABC):
|
||||
if self.chat_type_allow == ChatType.ALL:
|
||||
return True
|
||||
|
||||
# 检查是否为群聊消息
|
||||
is_group = self.message.message_info.group_info
|
||||
# 检查是否为群聊消息(DatabaseMessages使用group_info来判断)
|
||||
is_group = self.message.group_info is not None
|
||||
|
||||
if self.chat_type_allow == ChatType.GROUP and is_group:
|
||||
return True
|
||||
@@ -137,12 +144,11 @@ class BaseCommand(ABC):
|
||||
bool: 是否发送成功
|
||||
"""
|
||||
# 获取聊天流信息
|
||||
chat_stream = self.message.chat_stream
|
||||
if not chat_stream or not hasattr(chat_stream, "stream_id"):
|
||||
if not self.chat_stream or not hasattr(self.chat_stream, "stream_id"):
|
||||
logger.error(f"{self.log_prefix} 缺少聊天流或stream_id")
|
||||
return False
|
||||
|
||||
return await send_api.text_to_stream(text=content, stream_id=chat_stream.stream_id, reply_to=reply_to)
|
||||
return await send_api.text_to_stream(text=content, stream_id=self.chat_stream.stream_id, reply_to=reply_to)
|
||||
|
||||
async def send_type(
|
||||
self, message_type: str, content: str, display_message: str = "", typing: bool = False, reply_to: str = ""
|
||||
@@ -160,15 +166,14 @@ class BaseCommand(ABC):
|
||||
bool: 是否发送成功
|
||||
"""
|
||||
# 获取聊天流信息
|
||||
chat_stream = self.message.chat_stream
|
||||
if not chat_stream or not hasattr(chat_stream, "stream_id"):
|
||||
if not self.chat_stream or not hasattr(self.chat_stream, "stream_id"):
|
||||
logger.error(f"{self.log_prefix} 缺少聊天流或stream_id")
|
||||
return False
|
||||
|
||||
return await send_api.custom_to_stream(
|
||||
message_type=message_type,
|
||||
content=content,
|
||||
stream_id=chat_stream.stream_id,
|
||||
stream_id=self.chat_stream.stream_id,
|
||||
display_message=display_message,
|
||||
typing=typing,
|
||||
reply_to=reply_to,
|
||||
@@ -190,8 +195,7 @@ class BaseCommand(ABC):
|
||||
"""
|
||||
try:
|
||||
# 获取聊天流信息
|
||||
chat_stream = self.message.chat_stream
|
||||
if not chat_stream or not hasattr(chat_stream, "stream_id"):
|
||||
if not self.chat_stream or not hasattr(self.chat_stream, "stream_id"):
|
||||
logger.error(f"{self.log_prefix} 缺少聊天流或stream_id")
|
||||
return False
|
||||
|
||||
@@ -200,7 +204,7 @@ class BaseCommand(ABC):
|
||||
|
||||
success = await send_api.command_to_stream(
|
||||
command=command_data,
|
||||
stream_id=chat_stream.stream_id,
|
||||
stream_id=self.chat_stream.stream_id,
|
||||
storage_message=storage_message,
|
||||
display_message=display_message,
|
||||
)
|
||||
@@ -225,12 +229,11 @@ class BaseCommand(ABC):
|
||||
Returns:
|
||||
bool: 是否发送成功
|
||||
"""
|
||||
chat_stream = self.message.chat_stream
|
||||
if not chat_stream or not hasattr(chat_stream, "stream_id"):
|
||||
if not self.chat_stream or not hasattr(self.chat_stream, "stream_id"):
|
||||
logger.error(f"{self.log_prefix} 缺少聊天流或stream_id")
|
||||
return False
|
||||
|
||||
return await send_api.emoji_to_stream(emoji_base64, chat_stream.stream_id)
|
||||
return await send_api.emoji_to_stream(emoji_base64, self.chat_stream.stream_id)
|
||||
|
||||
async def send_image(self, image_base64: str) -> bool:
|
||||
"""发送图片
|
||||
@@ -241,12 +244,11 @@ class BaseCommand(ABC):
|
||||
Returns:
|
||||
bool: 是否发送成功
|
||||
"""
|
||||
chat_stream = self.message.chat_stream
|
||||
if not chat_stream or not hasattr(chat_stream, "stream_id"):
|
||||
if not self.chat_stream or not hasattr(self.chat_stream, "stream_id"):
|
||||
logger.error(f"{self.log_prefix} 缺少聊天流或stream_id")
|
||||
return False
|
||||
|
||||
return await send_api.image_to_stream(image_base64, chat_stream.stream_id)
|
||||
return await send_api.image_to_stream(image_base64, self.chat_stream.stream_id)
|
||||
|
||||
@classmethod
|
||||
def get_command_info(cls) -> "CommandInfo":
|
||||
|
||||
@@ -5,8 +5,9 @@
|
||||
|
||||
import re
|
||||
from abc import ABC, abstractmethod
|
||||
from typing import TYPE_CHECKING
|
||||
|
||||
from src.chat.message_receive.message import MessageRecv
|
||||
from src.common.data_models.database_data_model import DatabaseMessages
|
||||
from src.common.logger import get_logger
|
||||
from src.config.config import global_config
|
||||
from src.plugin_system.apis import send_api
|
||||
@@ -14,6 +15,9 @@ from src.plugin_system.base.base_command import BaseCommand
|
||||
from src.plugin_system.base.command_args import CommandArgs
|
||||
from src.plugin_system.base.component_types import ChatType, ComponentType, PlusCommandInfo
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from src.chat.message_receive.chat_stream import ChatStream
|
||||
|
||||
logger = get_logger("plus_command")
|
||||
|
||||
|
||||
@@ -50,23 +54,26 @@ class PlusCommand(ABC):
|
||||
intercept_message: bool = False
|
||||
"""是否拦截消息,不进行后续处理"""
|
||||
|
||||
def __init__(self, message: MessageRecv, plugin_config: dict | None = None):
|
||||
def __init__(self, message: DatabaseMessages, plugin_config: dict | None = None):
|
||||
"""初始化命令组件
|
||||
|
||||
Args:
|
||||
message: 接收到的消息对象
|
||||
message: 接收到的消息对象(DatabaseMessages)
|
||||
plugin_config: 插件配置字典
|
||||
"""
|
||||
self.message = message
|
||||
self.plugin_config = plugin_config or {}
|
||||
self.log_prefix = "[PlusCommand]"
|
||||
|
||||
# chat_stream 会在运行时被 bot.py 设置
|
||||
self.chat_stream: "ChatStream | None" = None
|
||||
|
||||
# 解析命令参数
|
||||
self._parse_command()
|
||||
|
||||
# 验证聊天类型限制
|
||||
if not self._validate_chat_type():
|
||||
is_group = self.message.message_info.group_info.group_id
|
||||
is_group = message.group_info is not None
|
||||
logger.warning(
|
||||
f"{self.log_prefix} 命令 '{self.command_name}' 不支持当前聊天类型: "
|
||||
f"{'群聊' if is_group else '私聊'}, 允许类型: {self.chat_type_allow.value}"
|
||||
@@ -124,8 +131,8 @@ class PlusCommand(ABC):
|
||||
if self.chat_type_allow == ChatType.ALL:
|
||||
return True
|
||||
|
||||
# 检查是否为群聊消息
|
||||
is_group = hasattr(self.message.message_info, "group_info") and self.message.message_info.group_info
|
||||
# 检查是否为群聊消息(DatabaseMessages使用group_info判断)
|
||||
is_group = self.message.group_info is not None
|
||||
|
||||
if self.chat_type_allow == ChatType.GROUP and is_group:
|
||||
return True
|
||||
@@ -152,7 +159,7 @@ class PlusCommand(ABC):
|
||||
|
||||
def _is_exact_command_call(self) -> bool:
|
||||
"""检查是否是精确的命令调用(无参数)"""
|
||||
if not hasattr(self.message, "plain_text") or not self.message.processed_plain_text:
|
||||
if not self.message.processed_plain_text:
|
||||
return False
|
||||
|
||||
plain_text = self.message.processed_plain_text.strip()
|
||||
@@ -218,12 +225,11 @@ class PlusCommand(ABC):
|
||||
bool: 是否发送成功
|
||||
"""
|
||||
# 获取聊天流信息
|
||||
chat_stream = self.message.chat_stream
|
||||
if not chat_stream or not hasattr(chat_stream, "stream_id"):
|
||||
if not self.chat_stream or not hasattr(self.chat_stream, "stream_id"):
|
||||
logger.error(f"{self.log_prefix} 缺少聊天流或stream_id")
|
||||
return False
|
||||
|
||||
return await send_api.text_to_stream(text=content, stream_id=chat_stream.stream_id, reply_to=reply_to)
|
||||
return await send_api.text_to_stream(text=content, stream_id=self.chat_stream.stream_id, reply_to=reply_to)
|
||||
|
||||
async def send_type(
|
||||
self, message_type: str, content: str, display_message: str = "", typing: bool = False, reply_to: str = ""
|
||||
@@ -241,15 +247,14 @@ class PlusCommand(ABC):
|
||||
bool: 是否发送成功
|
||||
"""
|
||||
# 获取聊天流信息
|
||||
chat_stream = self.message.chat_stream
|
||||
if not chat_stream or not hasattr(chat_stream, "stream_id"):
|
||||
if not self.chat_stream or not hasattr(self.chat_stream, "stream_id"):
|
||||
logger.error(f"{self.log_prefix} 缺少聊天流或stream_id")
|
||||
return False
|
||||
|
||||
return await send_api.custom_to_stream(
|
||||
message_type=message_type,
|
||||
content=content,
|
||||
stream_id=chat_stream.stream_id,
|
||||
stream_id=self.chat_stream.stream_id,
|
||||
display_message=display_message,
|
||||
typing=typing,
|
||||
reply_to=reply_to,
|
||||
@@ -264,12 +269,11 @@ class PlusCommand(ABC):
|
||||
Returns:
|
||||
bool: 是否发送成功
|
||||
"""
|
||||
chat_stream = self.message.chat_stream
|
||||
if not chat_stream or not hasattr(chat_stream, "stream_id"):
|
||||
if not self.chat_stream or not hasattr(self.chat_stream, "stream_id"):
|
||||
logger.error(f"{self.log_prefix} 缺少聊天流或stream_id")
|
||||
return False
|
||||
|
||||
return await send_api.emoji_to_stream(emoji_base64, chat_stream.stream_id)
|
||||
return await send_api.emoji_to_stream(emoji_base64, self.chat_stream.stream_id)
|
||||
|
||||
async def send_image(self, image_base64: str) -> bool:
|
||||
"""发送图片
|
||||
@@ -280,12 +284,11 @@ class PlusCommand(ABC):
|
||||
Returns:
|
||||
bool: 是否发送成功
|
||||
"""
|
||||
chat_stream = self.message.chat_stream
|
||||
if not chat_stream or not hasattr(chat_stream, "stream_id"):
|
||||
if not self.chat_stream or not hasattr(self.chat_stream, "stream_id"):
|
||||
logger.error(f"{self.log_prefix} 缺少聊天流或stream_id")
|
||||
return False
|
||||
|
||||
return await send_api.image_to_stream(image_base64, chat_stream.stream_id)
|
||||
return await send_api.image_to_stream(image_base64, self.chat_stream.stream_id)
|
||||
|
||||
@classmethod
|
||||
def get_plus_command_info(cls) -> "PlusCommandInfo":
|
||||
@@ -340,12 +343,12 @@ class PlusCommandAdapter(BaseCommand):
|
||||
将PlusCommand适配到现有的插件系统,继承BaseCommand
|
||||
"""
|
||||
|
||||
def __init__(self, plus_command_class, message: MessageRecv, plugin_config: dict | None = None):
|
||||
def __init__(self, plus_command_class, message: DatabaseMessages, plugin_config: dict | None = None):
|
||||
"""初始化适配器
|
||||
|
||||
Args:
|
||||
plus_command_class: PlusCommand子类
|
||||
message: 消息对象
|
||||
message: 消息对象(DatabaseMessages)
|
||||
plugin_config: 插件配置
|
||||
"""
|
||||
# 先设置必要的类属性
|
||||
@@ -400,7 +403,7 @@ def create_plus_command_adapter(plus_command_class):
|
||||
command_pattern = plus_command_class._generate_command_pattern()
|
||||
chat_type_allow = getattr(plus_command_class, "chat_type_allow", ChatType.ALL)
|
||||
|
||||
def __init__(self, message: MessageRecv, plugin_config: dict | None = None):
|
||||
def __init__(self, message: DatabaseMessages, plugin_config: dict | None = None):
|
||||
super().__init__(message, plugin_config)
|
||||
self.plus_command = plus_command_class(message, plugin_config)
|
||||
self.priority = getattr(plus_command_class, "priority", 0)
|
||||
|
||||
Reference in New Issue
Block a user