86 lines
1.7 KiB
Python
86 lines
1.7 KiB
Python
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
|