from dataclasses import dataclass from typing import List, Optional, Dict, Any from .sender import Sender # 导入上面的 Sender @dataclass class MessageSegment: type: str data: Dict[str, Any] @property def text(self) -> str: """如果是文本段,返回文本内容,否则返回空字符串""" return self.data.get("text", "") if self.type == "text" else "" @property def image_url(self) -> str: """如果是图片段,返回图片 URL""" return self.data.get("url", "") if self.type == "image" else "" def is_at(self, user_id: int = None) -> bool: """判断是否是 @某人""" if self.type != "at": return False if user_id is None: return True return str(self.data.get("qq")) == str(user_id) def __repr__(self): return f"[MS:{self.type}:{self.data}]" @dataclass class Event: post_type: str message_type: str # group 或 private user_id: int self_id: int raw_message: str message: List[MessageSegment] sender: Sender time: int group_id: Optional[int] = None target_id: Optional[int] = None @classmethod def from_dict(cls, data: dict): raw_msg_array = data.get("message", []) segments = [ MessageSegment(type=seg["type"], data=seg["data"]) for seg in raw_msg_array ] data_copy = data.copy() data_copy["message"] = segments sender_data = data.get("sender", {}) sender_obj = Sender(**{k: v for k, v in sender_data.items() if k in Sender.__annotations__}) data_copy = data.copy() data_copy["message"] = segments data_copy["sender"] = sender_obj # 关键点:把对象塞进去 valid_data = {k: v for k, v in data_copy.items() if k in cls.__annotations__} return cls(**valid_data)