from dataclasses import dataclass, field from enum import StrEnum from types import MappingProxyType class PeerKind(StrEnum): DIRECT = "direct" GROUP = "group" CHANNEL = "channel" _PEER_KIND_ALIASES: MappingProxyType[str, set[str]] = MappingProxyType({ "direct": {"direct", "dm"}, "group": {"group", "channel"}, "channel": {"channel", "group"}, }) @dataclass class PeerConstraint: kind: PeerKind peer_id: str | None = None class PeerConstraintState(StrEnum): VALID = "valid" WILDCARD = "wildcard" NONE = "none" INVALID = "invalid" @dataclass class NormalizedPeer: kind: PeerKind kind_lookup: set[str] peer_id: str @dataclass class BindingMatch: channel: str channel_config_id: str | None = None account_id: str | None = None peer: PeerConstraint | None = None guild_id: str | None = None team_id: str | None = None roles: list[str] = field(default_factory=list) @dataclass class RouteBinding: agent_config_id: int match: BindingMatch dm_scope: str = "per-channel-peer" priority: int = 0 session_dm_scope: str | None = None @dataclass class RouteResult: agent_config_id: int channel: str account_id: str session_key: str main_session_key: str matched_by: str matched_priority: int dm_scope: str = "per-channel-peer" last_route_policy: str = "session" @dataclass class EvaluatedBinding: agent_config_id: int dm_scope: str session_dm_scope: str | None normalized_peer: NormalizedPeer | None peer_state: PeerConstraintState guild_id: str | None roles: list[str] team_id: str | None account_id: str | None channel: str channel_config_id: str | None = None priority: int = 0