This commit is contained in:
2025-12-31 22:01:35 +08:00
commit 2cba589b2e
13 changed files with 465 additions and 0 deletions

63
models/event.py Normal file
View File

@@ -0,0 +1,63 @@
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)