Source code for iamai.event
"""Normalized event model shared across adapters and plugins."""
from __future__ import annotations
from dataclasses import dataclass, field
from typing import Any
from .message import Message
[docs]
@dataclass(slots=True)
class Event:
"""Adapter-agnostic event payload used by the dispatch pipeline."""
id: str
adapter: str
platform: str
type: str
detail_type: str | None = None
sub_type: str | None = None
user_id: str | None = None
channel_id: str | None = None
guild_id: str | None = None
self_id: str | None = None
message: Message = field(default_factory=Message)
raw: dict[str, Any] = field(default_factory=dict)
[docs]
@classmethod
def from_dict(cls, payload: dict[str, Any]) -> "Event":
"""Build an event from a normalized dictionary payload."""
return cls(
id=str(payload["id"]),
adapter=str(payload["adapter"]),
platform=str(payload["platform"]),
type=str(payload["type"]),
detail_type=payload.get("detail_type"),
sub_type=payload.get("sub_type"),
user_id=_maybe_str(payload.get("user_id")),
channel_id=_maybe_str(payload.get("channel_id")),
guild_id=_maybe_str(payload.get("guild_id")),
self_id=_maybe_str(payload.get("self_id")),
message=Message(payload.get("message", [])),
raw=dict(payload.get("raw", {})),
)
@property
def text(self) -> str:
"""Return the plain text representation of the event message."""
return self.message.plain_text()
[docs]
def to_dict(self) -> dict[str, Any]:
"""Serialize the event into a JSON-compatible dictionary."""
return {
"id": self.id,
"adapter": self.adapter,
"platform": self.platform,
"type": self.type,
"detail_type": self.detail_type,
"sub_type": self.sub_type,
"user_id": self.user_id,
"channel_id": self.channel_id,
"guild_id": self.guild_id,
"self_id": self.self_id,
"message": self.message.segments,
"raw": self.raw,
}
def _maybe_str(value: Any) -> str | None:
return None if value is None else str(value)