from dataclasses import dataclass, field from typing import Any, Dict, List, Optional from .sender import 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: 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 self_id: int time: int message_type: Optional[str] = None sub_type: Optional[str] = None message_id: Optional[int] = None user_id: Optional[int] = None raw_message: Optional[str] = None message: List[MessageSegment] = field(default_factory=list) sender: Optional[Sender] = None group_id: Optional[int] = None target_id: Optional[int] = None notice_type: Optional[str] = None operator_id: Optional[int] = None duration: Optional[int] = None honor_type: Optional[str] = None request_type: Optional[str] = None flag: Optional[str] = None comment: Optional[str] = None @classmethod def from_dict(cls, data: dict): raw_msg_array = data.get("message") segments = [] if isinstance(raw_msg_array, list): segments = [ MessageSegment(type=seg["type"], data=seg["data"]) for seg in raw_msg_array ] sender_data = data.get("sender") sender_obj = None if isinstance(sender_data, dict): sender_obj = Sender( **{k: v for k, v in sender_data.items() if k in Sender.__annotations__} ) # 数据整合 processed_data = data.copy() processed_data["message"] = segments processed_data["sender"] = sender_obj # 字段过滤:只提取 dataclass 中定义的字段 valid_data = { k: v for k, v in processed_data.items() if k in cls.__annotations__ } return cls(**valid_data) # --- 快捷判断工具 --- @property def is_message(self) -> bool: return self.post_type == "message" @property def is_notice(self) -> bool: return self.post_type == "notice" @property def is_request(self) -> bool: return self.post_type == "request"