Skip to content

Commit ea3498d

Browse files
authored
feat: add system events for conferences (#493)
1 parent e2a3e66 commit ea3498d

16 files changed

+701
-21
lines changed

poetry.lock

Lines changed: 133 additions & 15 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pybotx/__init__.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@
9090
AttachmentTypes,
9191
ChatTypes,
9292
ClientPlatforms,
93+
ConferenceLinkTypes,
9394
MentionTypes,
9495
SmartappManifestWebLayoutChoices,
9596
SyncSourceTypes,
@@ -135,6 +136,9 @@
135136
from pybotx.models.system_events.added_to_chat import AddedToChatEvent
136137
from pybotx.models.system_events.chat_created import ChatCreatedEvent, ChatCreatedMember
137138
from pybotx.models.system_events.chat_deleted_by_user import ChatDeletedByUserEvent
139+
from pybotx.models.system_events.conference_changed import ConferenceChangedEvent
140+
from pybotx.models.system_events.conference_created import ConferenceCreatedEvent
141+
from pybotx.models.system_events.conference_deleted import ConferenceDeletedEvent
138142
from pybotx.models.system_events.cts_login import CTSLoginEvent
139143
from pybotx.models.system_events.cts_logout import CTSLogoutEvent
140144
from pybotx.models.system_events.deleted_from_chat import DeletedFromChatEvent
@@ -193,6 +197,10 @@
193197
"ChatNotFoundError",
194198
"ChatTypes",
195199
"ClientPlatforms",
200+
"ConferenceChangedEvent",
201+
"ConferenceCreatedEvent",
202+
"ConferenceDeletedEvent",
203+
"ConferenceLinkTypes",
196204
"DeletedFromChatEvent",
197205
"Document",
198206
"EditMessage",

pybotx/bot/handler.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@
99
from pybotx.models.system_events.added_to_chat import AddedToChatEvent
1010
from pybotx.models.system_events.chat_created import ChatCreatedEvent
1111
from pybotx.models.system_events.chat_deleted_by_user import ChatDeletedByUserEvent
12+
from pybotx.models.system_events.conference_changed import ConferenceChangedEvent
13+
from pybotx.models.system_events.conference_created import ConferenceCreatedEvent
14+
from pybotx.models.system_events.conference_deleted import ConferenceDeletedEvent
1215
from pybotx.models.system_events.cts_login import CTSLoginEvent
1316
from pybotx.models.system_events.cts_logout import CTSLogoutEvent
1417
from pybotx.models.system_events.deleted_from_chat import DeletedFromChatEvent
@@ -44,6 +47,9 @@
4447
HandlerFunc[SmartAppEvent],
4548
HandlerFunc[EventEdit],
4649
HandlerFunc[JoinToChatEvent],
50+
HandlerFunc[ConferenceChangedEvent],
51+
HandlerFunc[ConferenceCreatedEvent],
52+
HandlerFunc[ConferenceDeletedEvent],
4753
]
4854

4955
VisibleFunc = Callable[[StatusRecipient, "Bot"], Awaitable[bool]]

pybotx/bot/handler_collector.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,9 @@
4242
from pybotx.models.system_events.added_to_chat import AddedToChatEvent
4343
from pybotx.models.system_events.chat_created import ChatCreatedEvent
4444
from pybotx.models.system_events.chat_deleted_by_user import ChatDeletedByUserEvent
45+
from pybotx.models.system_events.conference_changed import ConferenceChangedEvent
46+
from pybotx.models.system_events.conference_created import ConferenceCreatedEvent
47+
from pybotx.models.system_events.conference_deleted import ConferenceDeletedEvent
4548
from pybotx.models.system_events.cts_login import CTSLoginEvent
4649
from pybotx.models.system_events.cts_logout import CTSLogoutEvent
4750
from pybotx.models.system_events.deleted_from_chat import DeletedFromChatEvent
@@ -310,6 +313,30 @@ def event_edit(
310313
self._system_event(EventEdit, handler_func)
311314
return handler_func
312315

316+
def conference_changed(
317+
self,
318+
handler_func: HandlerFunc[ConferenceChangedEvent],
319+
) -> HandlerFunc[ConferenceChangedEvent]:
320+
"""Decorate `conference changed` event handler."""
321+
self._system_event(ConferenceChangedEvent, handler_func)
322+
return handler_func
323+
324+
def conference_created(
325+
self,
326+
handler_func: HandlerFunc[ConferenceCreatedEvent],
327+
) -> HandlerFunc[ConferenceCreatedEvent]:
328+
"""Decorate `conference created` event handler."""
329+
self._system_event(ConferenceCreatedEvent, handler_func)
330+
return handler_func
331+
332+
def conference_deleted(
333+
self,
334+
handler_func: HandlerFunc[ConferenceDeletedEvent],
335+
) -> HandlerFunc[ConferenceDeletedEvent]:
336+
"""Decorate `conference deleted` event handler."""
337+
self._system_event(ConferenceDeletedEvent, handler_func)
338+
return handler_func
339+
313340
def smartapp_event(
314341
self,
315342
handler_func: HandlerFunc[SmartAppEvent],

pybotx/models/commands.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,18 @@
1313
BotAPIChatDeletedByUser,
1414
ChatDeletedByUserEvent,
1515
)
16+
from pybotx.models.system_events.conference_changed import (
17+
BotAPIConferenceChanged,
18+
ConferenceChangedEvent,
19+
)
20+
from pybotx.models.system_events.conference_created import (
21+
BotAPIConferenceCreated,
22+
ConferenceCreatedEvent,
23+
)
24+
from pybotx.models.system_events.conference_deleted import (
25+
BotAPIConferenceDeleted,
26+
ConferenceDeletedEvent,
27+
)
1628
from pybotx.models.system_events.cts_login import BotAPICTSLogin, CTSLoginEvent
1729
from pybotx.models.system_events.cts_logout import BotAPICTSLogout, CTSLogoutEvent
1830
from pybotx.models.system_events.deleted_from_chat import (
@@ -50,6 +62,9 @@
5062
BotAPICTSLogout,
5163
BotAPIEventEdit,
5264
BotAPIJoinToChat,
65+
BotAPIConferenceChanged,
66+
BotAPIConferenceCreated,
67+
BotAPIConferenceDeleted,
5368
]
5469
BotAPICommand = Union[BotAPIIncomingMessage, BotAPISystemEvent]
5570

@@ -66,5 +81,8 @@
6681
CTSLogoutEvent,
6782
EventEdit,
6883
JoinToChatEvent,
84+
ConferenceChangedEvent,
85+
ConferenceCreatedEvent,
86+
ConferenceDeletedEvent,
6987
]
7088
BotCommand = Union[IncomingMessage, SystemEvent]

pybotx/models/enums.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,13 @@ class SyncSourceTypes(AutoName):
6969
BOTX = auto()
7070

7171

72+
class ConferenceLinkTypes(AutoName):
73+
PUBLIC = auto()
74+
TRUSTS = auto()
75+
CORPORATE = auto()
76+
SERVER = auto()
77+
78+
7279
UNSUPPORTED = Literal["UNSUPPORTED"]
7380
IncomingChatTypes = Union[ChatTypes, UNSUPPORTED]
7481
IncomingSyncSourceTypes = Union[SyncSourceTypes, UNSUPPORTED]
@@ -104,6 +111,9 @@ class BotAPISystemEventTypes(StrEnum):
104111
SMARTAPP_EVENT = "system:smartapp_event"
105112
EVENT_EDIT = "system:event_edit"
106113
JOIN_TO_CHAT = "system:user_joined_to_chat"
114+
CONFERENCE_CHANGED = "system:conference_changed"
115+
CONFERENCE_CREATED = "system:conference_created"
116+
CONFERENCE_DELETED = "system:conference_deleted"
107117

108118

109119
class BotAPIClientPlatforms(Enum):
@@ -128,6 +138,13 @@ class BotAPIMentionTypes(StrEnum):
128138
ALL = "all"
129139

130140

141+
class BotAPIConferenceLinkTypes(StrEnum):
142+
PUBLIC = "public"
143+
TRUSTS = "trusts"
144+
CORPORATE = "corporate"
145+
SERVER = "server"
146+
147+
131148
class APIUserKinds(Enum):
132149
USER = "user"
133150
CTS_USER = "cts_user"
@@ -234,6 +251,25 @@ def convert_attachment_type_to_domain(
234251
return converted_type
235252

236253

254+
def convert_conference_link_type_to_domain(
255+
conference_link_type: BotAPIConferenceLinkTypes,
256+
) -> ConferenceLinkTypes:
257+
conference_link_type_mapping = {
258+
BotAPIConferenceLinkTypes.PUBLIC: ConferenceLinkTypes.PUBLIC,
259+
BotAPIConferenceLinkTypes.TRUSTS: ConferenceLinkTypes.TRUSTS,
260+
BotAPIConferenceLinkTypes.CORPORATE: ConferenceLinkTypes.CORPORATE,
261+
BotAPIConferenceLinkTypes.SERVER: ConferenceLinkTypes.SERVER,
262+
}
263+
264+
converted_type = conference_link_type_mapping.get(conference_link_type)
265+
if converted_type is None:
266+
raise NotImplementedError(
267+
f"Unsupported conference link type: {conference_link_type}",
268+
)
269+
270+
return converted_type
271+
272+
237273
def convert_attachment_type_from_domain(
238274
attachment_type: AttachmentTypes,
239275
) -> APIAttachmentTypes:
Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
from dataclasses import dataclass
2+
from datetime import datetime
3+
from typing import Any, Dict, List, Literal, Optional
4+
from uuid import UUID
5+
6+
from pydantic import Field
7+
8+
from pybotx.models.api_base import VerifiedPayloadBaseModel
9+
from pybotx.models.base_command import (
10+
BaseBotAPIContext,
11+
BotAPIBaseCommand,
12+
BotAPIBaseSystemEventPayload,
13+
BotCommandBase,
14+
)
15+
from pybotx.models.bot_account import BotAccount
16+
from pybotx.models.enums import (
17+
BotAPIConferenceLinkTypes,
18+
BotAPISystemEventTypes,
19+
ConferenceLinkTypes,
20+
convert_conference_link_type_to_domain,
21+
)
22+
23+
24+
@dataclass
25+
class ConferenceChangedEvent(BotCommandBase):
26+
"""Event `system:conference_changed`.
27+
28+
Attributes:
29+
access_code: access code for conference.
30+
actor: who changes conference.
31+
added_users: added users to conference.
32+
admins: admins conference.
33+
call_id: id conference.
34+
deleted_users: deleted users to conference.
35+
end_at: end conference.
36+
link: conference link.
37+
link_id: conference link id.
38+
link_type: link type on conference (public|trusts|corporate|server).
39+
members: list members.
40+
name: name conference.
41+
operation: operation.
42+
sip_number: sip number conference.
43+
start_at: end conference.
44+
"""
45+
46+
access_code: Optional[str]
47+
actor: Optional[UUID]
48+
added_users: List[UUID]
49+
admins: List[UUID]
50+
call_id: UUID
51+
deleted_users: List[UUID]
52+
end_at: Optional[datetime]
53+
link: str
54+
link_id: UUID
55+
link_type: ConferenceLinkTypes
56+
members: List[UUID]
57+
name: str
58+
operation: str
59+
sip_number: int
60+
start_at: datetime
61+
62+
63+
class BotAPIConferenceChangedData(VerifiedPayloadBaseModel):
64+
access_code: Optional[str]
65+
actor: Optional[UUID]
66+
added_users: List[UUID]
67+
admins: List[UUID]
68+
call_id: UUID
69+
deleted_users: List[UUID]
70+
end_at: Optional[datetime]
71+
link: str
72+
link_id: UUID
73+
link_type: BotAPIConferenceLinkTypes
74+
members: List[UUID]
75+
name: str
76+
operation: str
77+
sip_number: int
78+
start_at: datetime
79+
80+
81+
class BotAPIConferenceChangedPayload(BotAPIBaseSystemEventPayload):
82+
body: Literal[BotAPISystemEventTypes.CONFERENCE_CHANGED]
83+
data: BotAPIConferenceChangedData
84+
85+
86+
class BotAPIConferenceChanged(BotAPIBaseCommand):
87+
payload: BotAPIConferenceChangedPayload = Field(..., alias="command")
88+
sender: BaseBotAPIContext = Field(..., alias="from")
89+
90+
def to_domain(self, raw_command: Dict[str, Any]) -> ConferenceChangedEvent:
91+
return ConferenceChangedEvent(
92+
bot=BotAccount(
93+
id=self.bot_id,
94+
host=self.sender.host,
95+
),
96+
raw_command=raw_command,
97+
access_code=self.payload.data.access_code,
98+
actor=self.payload.data.actor,
99+
added_users=self.payload.data.added_users,
100+
admins=self.payload.data.admins,
101+
call_id=self.payload.data.call_id,
102+
deleted_users=self.payload.data.deleted_users,
103+
end_at=self.payload.data.end_at,
104+
link=self.payload.data.link,
105+
link_id=self.payload.data.link_id,
106+
link_type=convert_conference_link_type_to_domain(
107+
self.payload.data.link_type,
108+
),
109+
members=self.payload.data.members,
110+
name=self.payload.data.name,
111+
operation=self.payload.data.operation,
112+
sip_number=self.payload.data.sip_number,
113+
start_at=self.payload.data.start_at,
114+
)
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
from dataclasses import dataclass
2+
from typing import Any, Dict, Literal
3+
from uuid import UUID
4+
5+
from pydantic import Field
6+
7+
from pybotx.models.api_base import VerifiedPayloadBaseModel
8+
from pybotx.models.base_command import (
9+
BaseBotAPIContext,
10+
BotAPIBaseCommand,
11+
BotAPIBaseSystemEventPayload,
12+
BotCommandBase,
13+
)
14+
from pybotx.models.bot_account import BotAccount
15+
from pybotx.models.enums import BotAPISystemEventTypes
16+
17+
18+
@dataclass
19+
class ConferenceCreatedEvent(BotCommandBase):
20+
"""Event `system:conference_created`.
21+
22+
Attributes:
23+
call_id: id conference.
24+
"""
25+
26+
call_id: UUID
27+
28+
29+
class BotAPIConferenceCreatedData(VerifiedPayloadBaseModel):
30+
call_id: UUID
31+
32+
33+
class BotAPIConferenceCreatedPayload(BotAPIBaseSystemEventPayload):
34+
body: Literal[BotAPISystemEventTypes.CONFERENCE_CREATED]
35+
data: BotAPIConferenceCreatedData
36+
37+
38+
class BotAPIConferenceCreated(BotAPIBaseCommand):
39+
payload: BotAPIConferenceCreatedPayload = Field(..., alias="command")
40+
sender: BaseBotAPIContext = Field(..., alias="from")
41+
42+
def to_domain(self, raw_command: Dict[str, Any]) -> ConferenceCreatedEvent:
43+
return ConferenceCreatedEvent(
44+
bot=BotAccount(
45+
id=self.bot_id,
46+
host=self.sender.host,
47+
),
48+
raw_command=raw_command,
49+
call_id=self.payload.data.call_id,
50+
)

0 commit comments

Comments
 (0)