feat: 史上最好的消息流重构和图片管理
This commit is contained in:
@@ -2,7 +2,7 @@ from dataclasses import dataclass, asdict
|
||||
from typing import List, Optional, Union, Any, Dict
|
||||
|
||||
@dataclass
|
||||
class Seg(dict):
|
||||
class Seg:
|
||||
"""消息片段类,用于表示消息的不同部分
|
||||
|
||||
Attributes:
|
||||
@@ -15,47 +15,25 @@ class Seg(dict):
|
||||
"""
|
||||
type: str
|
||||
data: Union[str, List['Seg']]
|
||||
translated_data: Optional[str] = None
|
||||
|
||||
|
||||
def __init__(self, type: str, data: Union[str, List['Seg']], translated_data: Optional[str] = None):
|
||||
"""初始化实例,确保字典和属性同步"""
|
||||
# 先初始化字典
|
||||
super().__init__(type=type, data=data)
|
||||
if translated_data is not None:
|
||||
self['translated_data'] = translated_data
|
||||
|
||||
# 再初始化属性
|
||||
object.__setattr__(self, 'type', type)
|
||||
object.__setattr__(self, 'data', data)
|
||||
object.__setattr__(self, 'translated_data', translated_data)
|
||||
# def __init__(self, type: str, data: Union[str, List['Seg']],):
|
||||
# """初始化实例,确保字典和属性同步"""
|
||||
# # 先初始化字典
|
||||
# self.type = type
|
||||
# self.data = data
|
||||
|
||||
# 验证数据类型
|
||||
self._validate_data()
|
||||
|
||||
def _validate_data(self) -> None:
|
||||
"""验证数据类型的正确性"""
|
||||
if self.type == 'seglist' and not isinstance(self.data, list):
|
||||
raise ValueError("seglist类型的data必须是列表")
|
||||
elif self.type == 'text' and not isinstance(self.data, str):
|
||||
raise ValueError("text类型的data必须是字符串")
|
||||
elif self.type == 'image' and not isinstance(self.data, str):
|
||||
raise ValueError("image类型的data必须是字符串")
|
||||
|
||||
def __setattr__(self, name: str, value: Any) -> None:
|
||||
"""重写属性设置,同时更新字典值"""
|
||||
# 更新属性
|
||||
object.__setattr__(self, name, value)
|
||||
# 同步更新字典
|
||||
if name in ['type', 'data', 'translated_data']:
|
||||
self[name] = value
|
||||
|
||||
def __setitem__(self, key: str, value: Any) -> None:
|
||||
"""重写字典值设置,同时更新属性"""
|
||||
# 更新字典
|
||||
super().__setitem__(key, value)
|
||||
# 同步更新属性
|
||||
if key in ['type', 'data', 'translated_data']:
|
||||
object.__setattr__(self, key, value)
|
||||
@classmethod
|
||||
def from_dict(cls, data: Dict) -> 'Seg':
|
||||
"""从字典创建Seg实例"""
|
||||
type=data.get('type')
|
||||
data=data.get('data')
|
||||
if type == 'seglist':
|
||||
data = [Seg.from_dict(seg) for seg in data]
|
||||
return cls(
|
||||
type=type,
|
||||
data=data
|
||||
)
|
||||
|
||||
def to_dict(self) -> Dict:
|
||||
"""转换为字典格式"""
|
||||
@@ -64,8 +42,6 @@ class Seg(dict):
|
||||
result['data'] = [seg.to_dict() for seg in self.data]
|
||||
else:
|
||||
result['data'] = self.data
|
||||
if self.translated_data is not None:
|
||||
result['translated_data'] = self.translated_data
|
||||
return result
|
||||
|
||||
@dataclass
|
||||
@@ -79,6 +55,7 @@ class GroupInfo:
|
||||
"""转换为字典格式"""
|
||||
return {k: v for k, v in asdict(self).items() if v is not None}
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, data: Dict) -> 'GroupInfo':
|
||||
"""从字典创建GroupInfo实例
|
||||
|
||||
@@ -106,6 +83,7 @@ class UserInfo:
|
||||
"""转换为字典格式"""
|
||||
return {k: v for k, v in asdict(self).items() if v is not None}
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, data: Dict) -> 'UserInfo':
|
||||
"""从字典创建UserInfo实例
|
||||
|
||||
@@ -126,7 +104,7 @@ class UserInfo:
|
||||
class BaseMessageInfo:
|
||||
"""消息信息类"""
|
||||
platform: Optional[str] = None
|
||||
message_id: Optional[int,str] = None
|
||||
message_id: Union[str,int,None] = None
|
||||
time: Optional[int] = None
|
||||
group_info: Optional[GroupInfo] = None
|
||||
user_info: Optional[UserInfo] = None
|
||||
@@ -141,6 +119,25 @@ class BaseMessageInfo:
|
||||
else:
|
||||
result[field] = value
|
||||
return result
|
||||
@classmethod
|
||||
def from_dict(cls, data: Dict) -> 'BaseMessageInfo':
|
||||
"""从字典创建BaseMessageInfo实例
|
||||
|
||||
Args:
|
||||
data: 包含必要字段的字典
|
||||
|
||||
Returns:
|
||||
BaseMessageInfo: 新的实例
|
||||
"""
|
||||
group_info = GroupInfo(**data.get('group_info', {}))
|
||||
user_info = UserInfo(**data.get('user_info', {}))
|
||||
return cls(
|
||||
platform=data.get('platform'),
|
||||
message_id=data.get('message_id'),
|
||||
time=data.get('time'),
|
||||
group_info=group_info,
|
||||
user_info=user_info
|
||||
)
|
||||
|
||||
@dataclass
|
||||
class MessageBase:
|
||||
|
||||
Reference in New Issue
Block a user