Files
NeoBot/models/events/base.py

86 lines
2.4 KiB
Python

"""
基础事件模型模块
该模块定义了所有 OneBot v11 事件模型的基类 `OneBotEvent` 和
事件类型常量 `EventType`。所有具体的事件模型都应继承自 `OneBotEvent`。
"""
from dataclasses import dataclass, field
from typing import TYPE_CHECKING, Optional
from abc import ABC, abstractmethod
if TYPE_CHECKING:
from core.bot import Bot
class EventType:
"""
OneBot v11 事件类型常量。
用于标识不同种类的事件上报。
"""
META = 'meta_event'
"""元事件 (meta_event): 如心跳、生命周期等。"""
REQUEST = 'request'
"""请求事件 (request): 如加好友请求、加群请求等。"""
NOTICE = 'notice'
"""通知事件 (notice): 如群成员增加、文件上传等。"""
MESSAGE = 'message'
"""消息事件 (message): 如私聊消息、群消息等。"""
MESSAGE_SENT = 'message_sent'
"""消息发送事件 (message_sent): 机器人自己发送消息的上报。"""
@dataclass(slots=True)
class OneBotEvent(ABC):
"""
OneBot v11 事件的抽象基类。
所有具体的事件模型都必须继承此类,并实现 `post_type` 属性。
Attributes:
time (int): 事件发生的时间戳 (秒)。
self_id (int): 收到事件的机器人 QQ 号。
_bot (Optional[Bot]): 内部持有的 Bot 实例引用,用于快捷 API 调用。
"""
time: int
self_id: int
_bot: Optional["Bot"] = field(default=None, init=False)
@property
@abstractmethod
def post_type(self) -> str:
"""
抽象属性,代表事件的上报类型。
子类必须重写此属性,并返回对应的 `EventType` 常量值。
例如: `return EventType.MESSAGE`
"""
pass
@property
def bot(self) -> "Bot":
"""
获取与此事件关联的 `Bot` 实例,以便快捷调用 API。
Returns:
Bot: 当前事件所对应的 `Bot` 实例。
Raises:
ValueError: 如果 `Bot` 实例尚未被设置到事件对象中。
"""
if self._bot is None:
raise ValueError("Bot instance not set for this event")
return self._bot
@bot.setter
def bot(self, value: "Bot"):
"""
为事件对象设置关联的 `Bot` 实例。
Args:
value (Bot): 要设置的 `Bot` 实例。
"""
self._bot = value