PersonInfo相关提交,添加注释,重命名文件
This commit is contained in:
@@ -12,7 +12,7 @@ import json
|
||||
from datetime import datetime
|
||||
|
||||
from src.common.database.database_model import Messages
|
||||
from src.common.data_models.message_component_model import MessageSequence
|
||||
from src.common.data_models.message_component_data_model import MessageSequence
|
||||
from src.common.utils.utils_message import MessageUtils
|
||||
|
||||
from . import BaseDatabaseDataModel
|
||||
@@ -48,21 +48,30 @@ class MaiMessage(BaseDatabaseDataModel[Messages]):
|
||||
# 定义其他属性
|
||||
self.message_info: MessageInfo # 初始化后赋值
|
||||
self.is_mentioned: bool = False
|
||||
"""机器人被提及标记,若被at,则提及也被标记"""
|
||||
self.is_at: bool = False
|
||||
"""机器人被at标记"""
|
||||
self.is_emoji: bool = False
|
||||
"""消息为纯表情包,在计算打字时长时候会被特殊处理"""
|
||||
self.is_picture: bool = False
|
||||
"""消息为纯图片,在计算打字时长时候会被特殊处理"""
|
||||
self.is_command: bool = False
|
||||
"""消息为命令消息,打字时长必定为0"""
|
||||
self.is_notify: bool = False
|
||||
"""消息为通知消息"""
|
||||
|
||||
self.session_id: str
|
||||
self.reply_to: Optional[str] = None
|
||||
|
||||
self.processed_plain_text: Optional[str] = None
|
||||
"""处理过后的纯文本内容"""
|
||||
self.display_message: Optional[str] = None
|
||||
"""最后显示给大模型的消息内容"""
|
||||
self.raw_message: MessageSequence
|
||||
"""原始消息数据"""
|
||||
|
||||
@classmethod
|
||||
def from_db_instance(cls, db_record: "Messages") -> "MaiMessage":
|
||||
def from_db_instance(cls, db_record: "Messages"):
|
||||
obj = cls(message_id=db_record.message_id, timestamp=db_record.timestamp)
|
||||
|
||||
user_info = UserInfo(db_record.user_id, db_record.user_nickname, db_record.user_cardname)
|
||||
@@ -117,7 +126,7 @@ class MaiMessage(BaseDatabaseDataModel[Messages]):
|
||||
)
|
||||
|
||||
@classmethod
|
||||
def from_maim_message(cls, message: MessageBase) -> "MaiMessage":
|
||||
def from_maim_message(cls, message: MessageBase):
|
||||
"""从 maim_message.MessageBase 创建 MaiMessage 实例,解析消息内容并提取相关信息"""
|
||||
msg_info = message.message_info
|
||||
assert msg_info, "MessageBase 的 message_info 不能为空"
|
||||
|
||||
@@ -134,9 +134,18 @@ class AtComponent(BaseMessageComponentModel):
|
||||
def format_name(self) -> str:
|
||||
return "at"
|
||||
|
||||
def __init__(self, target_user_id: str) -> None:
|
||||
def __init__(
|
||||
self,
|
||||
target_user_id: str,
|
||||
target_user_nickname: Optional[str] = None,
|
||||
target_user_cardname: Optional[str] = None,
|
||||
) -> None:
|
||||
self.target_user_id = target_user_id
|
||||
"""目标用户ID"""
|
||||
self.target_user_nickname = target_user_nickname
|
||||
"""目标用户昵称"""
|
||||
self.target_user_cardname = target_user_cardname
|
||||
"""目标用户备注名"""
|
||||
assert isinstance(target_user_id, str), "AtComponent 的 target_user_id 必须是字符串类型"
|
||||
|
||||
async def to_seg(self) -> Seg:
|
||||
@@ -214,12 +223,15 @@ class ForwardComponent(BaseMessageComponentModel):
|
||||
def __init__(
|
||||
self,
|
||||
user_nickname: str,
|
||||
message_id: str,
|
||||
content: List[StandardMessageComponents],
|
||||
user_id: Optional[str] = None,
|
||||
user_cardname: Optional[str] = None,
|
||||
):
|
||||
self.user_nickname: str = user_nickname
|
||||
"""转发节点的发送者昵称"""
|
||||
self.message_id: str = message_id
|
||||
"""转发节点的消息ID"""
|
||||
self.content: List[StandardMessageComponents] = content
|
||||
"""消息内容"""
|
||||
self.user_id: Optional[str] = user_id
|
||||
@@ -277,7 +289,14 @@ class MessageSequence:
|
||||
raise RuntimeError("VoiceComponent content 未初始化")
|
||||
return {"type": "voice", "data": item.content, "hash": item.binary_hash}
|
||||
elif isinstance(item, AtComponent):
|
||||
return {"type": "at", "data": item.target_user_id}
|
||||
return {
|
||||
"type": "at",
|
||||
"data": {
|
||||
"target_user_id": item.target_user_id,
|
||||
"target_user_nickname": item.target_user_nickname,
|
||||
"target_user_cardname": item.target_user_cardname,
|
||||
},
|
||||
}
|
||||
elif isinstance(item, ReplyComponent):
|
||||
return {"type": "reply", "data": item.target_message_id}
|
||||
elif isinstance(item, ForwardNodeComponent):
|
||||
@@ -288,6 +307,7 @@ class MessageSequence:
|
||||
"user_id": comp.user_id,
|
||||
"user_nickname": comp.user_nickname,
|
||||
"user_cardname": comp.user_cardname,
|
||||
"message_id": comp.message_id,
|
||||
"content": [self._item_2_dict(c) for c in comp.content],
|
||||
}
|
||||
for comp in item.forward_components
|
||||
@@ -310,7 +330,11 @@ class MessageSequence:
|
||||
elif item_type == "voice":
|
||||
return VoiceComponent(binary_hash=item["hash"], content=item["data"])
|
||||
elif item_type == "at":
|
||||
return AtComponent(target_user_id=item["data"])
|
||||
return AtComponent(
|
||||
target_user_id=item["data"]["target_user_id"],
|
||||
target_user_nickname=item["data"].get("target_user_nickname"),
|
||||
target_user_cardname=item["data"].get("target_user_cardname"),
|
||||
)
|
||||
elif item_type == "reply":
|
||||
return ReplyComponent(target_message_id=item["data"])
|
||||
elif item_type == "forward":
|
||||
@@ -321,6 +345,7 @@ class MessageSequence:
|
||||
user_nickname=fc["user_nickname"],
|
||||
user_id=fc.get("user_id"),
|
||||
user_cardname=fc.get("user_cardname"),
|
||||
message_id=fc.get("message_id"),
|
||||
content=content,
|
||||
)
|
||||
forward_components.append(forward_component)
|
||||
94
src/common/data_models/person_info_data_model.py
Normal file
94
src/common/data_models/person_info_data_model.py
Normal file
@@ -0,0 +1,94 @@
|
||||
from dataclasses import dataclass
|
||||
from datetime import datetime
|
||||
from typing import Optional, List
|
||||
|
||||
import json
|
||||
|
||||
from src.common.database.database_model import PersonInfo
|
||||
|
||||
from . import BaseDatabaseDataModel
|
||||
|
||||
|
||||
@dataclass
|
||||
class GroupCardnameInfo:
|
||||
group_id: str
|
||||
group_cardname: str
|
||||
|
||||
|
||||
class MaiPersonInfo(BaseDatabaseDataModel[PersonInfo]):
|
||||
def __init__(
|
||||
self,
|
||||
*,
|
||||
is_known: bool,
|
||||
person_id: str,
|
||||
platform: str,
|
||||
user_id: str,
|
||||
user_nickname: str,
|
||||
know_counts: int,
|
||||
person_name: Optional[str] = None,
|
||||
name_reason: Optional[str] = None,
|
||||
group_cardname_list: Optional[List[GroupCardnameInfo]] = None,
|
||||
memory_points: Optional[List[str]] = None,
|
||||
first_known_time: Optional[datetime] = None,
|
||||
last_known_time: Optional[datetime] = None,
|
||||
):
|
||||
self.is_known = is_known
|
||||
"""标记是否为已知用户,已知用户指在数据库中存在记录的用户"""
|
||||
self.person_id: str = person_id
|
||||
"""用户专有ID"""
|
||||
self.person_name: Optional[str] = person_name
|
||||
"""用户名称"""
|
||||
self.name_reason: Optional[str] = name_reason
|
||||
"""用户名称的来源或变更原因说明"""
|
||||
self.platform: str = platform
|
||||
"""平台标识"""
|
||||
self.user_id: str = user_id
|
||||
"""用户在平台上的ID"""
|
||||
self.user_nickname: str = user_nickname
|
||||
"""用户在平台上的昵称"""
|
||||
self.group_cardname_list: Optional[List[GroupCardnameInfo]] = group_cardname_list
|
||||
"""用户在不同群中的昵称列表"""
|
||||
self.memory_points: Optional[List[str]] = memory_points
|
||||
"""与用户相关的记忆点列表"""
|
||||
self.know_counts: int = know_counts
|
||||
"""已知用户被认识的次数"""
|
||||
self.first_known_time: Optional[datetime] = first_known_time
|
||||
"""第一次被认识的时间"""
|
||||
self.last_known_time: Optional[datetime] = last_known_time
|
||||
"""最后一次被认识的时间"""
|
||||
|
||||
@classmethod
|
||||
def from_db_instance(cls, db_record: "PersonInfo"):
|
||||
nickname_json = json.loads(db_record.group_cardname) if db_record.group_cardname else None
|
||||
group_cardname_list = [GroupCardnameInfo(**item) for item in nickname_json] if nickname_json else None
|
||||
memory_points = json.loads(db_record.memory_points) if db_record.memory_points else None
|
||||
return cls(
|
||||
is_known=db_record.is_known,
|
||||
person_id=db_record.person_id,
|
||||
person_name=db_record.person_name,
|
||||
name_reason=db_record.name_reason,
|
||||
platform=db_record.platform,
|
||||
user_id=db_record.user_id,
|
||||
user_nickname=db_record.user_nickname,
|
||||
group_cardname_list=group_cardname_list,
|
||||
memory_points=memory_points,
|
||||
know_counts=db_record.know_counts,
|
||||
first_known_time=db_record.first_known_time,
|
||||
last_known_time=db_record.last_known_time,
|
||||
)
|
||||
|
||||
def to_db_instance(self) -> "PersonInfo":
|
||||
return PersonInfo(
|
||||
is_known=self.is_known,
|
||||
person_id=self.person_id,
|
||||
person_name=self.person_name,
|
||||
name_reason=self.name_reason,
|
||||
platform=self.platform,
|
||||
user_id=self.user_id,
|
||||
user_nickname=self.user_nickname,
|
||||
group_cardname=json.dumps([gn.__dict__ for gn in self.group_cardname_list]) if self.group_cardname_list else None,
|
||||
memory_points=json.dumps(self.memory_points) if self.memory_points else None,
|
||||
know_counts=self.know_counts,
|
||||
first_known_time=self.first_known_time,
|
||||
last_known_time=self.last_known_time,
|
||||
)
|
||||
Reference in New Issue
Block a user