Skip to content

Commit 85da324

Browse files
committed
Merge remote-tracking branch 'origin/master' into fix/docs-update-and-dropped-support-3.8
# Conflicts: # poetry.lock # pyproject.toml
2 parents 125f094 + ea3498d commit 85da324

18 files changed

+823
-13
lines changed

.github/workflows/publish-pypi.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ on:
55
- "*.*.*"
66
jobs:
77
build:
8-
runs-on: ubuntu-20.04
8+
runs-on: ubuntu-22.04
99
steps:
1010
- uses: actions/checkout@v1
1111
- name: Assert tag is from master

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: 8 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
@@ -18,6 +21,7 @@
1821
)
1922
from pybotx.models.system_events.left_from_chat import LeftFromChatEvent
2023
from pybotx.models.system_events.smartapp_event import SmartAppEvent
24+
from pybotx.models.system_events.user_joined_to_chat import JoinToChatEvent
2125

2226
if TYPE_CHECKING: # To avoid circular import
2327
from pybotx.bot.bot import Bot
@@ -42,6 +46,10 @@
4246
HandlerFunc[InternalBotNotificationEvent],
4347
HandlerFunc[SmartAppEvent],
4448
HandlerFunc[EventEdit],
49+
HandlerFunc[JoinToChatEvent],
50+
HandlerFunc[ConferenceChangedEvent],
51+
HandlerFunc[ConferenceCreatedEvent],
52+
HandlerFunc[ConferenceDeletedEvent],
4553
]
4654

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

pybotx/bot/handler_collector.py

Lines changed: 36 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
@@ -51,6 +54,7 @@
5154
)
5255
from pybotx.models.system_events.left_from_chat import LeftFromChatEvent
5356
from pybotx.models.system_events.smartapp_event import SmartAppEvent
57+
from pybotx.models.system_events.user_joined_to_chat import JoinToChatEvent
5458

5559
if TYPE_CHECKING: # To avoid circular import
5660
from pybotx.bot.bot import Bot
@@ -269,6 +273,14 @@ def left_from_chat(
269273
self._system_event(LeftFromChatEvent, handler_func)
270274
return handler_func
271275

276+
def user_joined_to_chat(
277+
self,
278+
handler_func: HandlerFunc[JoinToChatEvent],
279+
) -> HandlerFunc[JoinToChatEvent]:
280+
"""Decorate `user_joined_to_chat` event handler."""
281+
self._system_event(JoinToChatEvent, handler_func)
282+
return handler_func
283+
272284
def internal_bot_notification(
273285
self,
274286
handler_func: HandlerFunc[InternalBotNotificationEvent],
@@ -301,6 +313,30 @@ def event_edit(
301313
self._system_event(EventEdit, handler_func)
302314
return handler_func
303315

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+
304340
def smartapp_event(
305341
self,
306342
handler_func: HandlerFunc[SmartAppEvent],

pybotx/models/commands.py

Lines changed: 24 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 (
@@ -32,6 +44,10 @@
3244
BotAPISmartAppEvent,
3345
SmartAppEvent,
3446
)
47+
from pybotx.models.system_events.user_joined_to_chat import (
48+
BotAPIJoinToChat,
49+
JoinToChatEvent,
50+
)
3551

3652
# Sorted by frequency of occurrence to speedup validation
3753
BotAPISystemEvent = Union[
@@ -45,6 +61,10 @@
4561
BotAPICTSLogin,
4662
BotAPICTSLogout,
4763
BotAPIEventEdit,
64+
BotAPIJoinToChat,
65+
BotAPIConferenceChanged,
66+
BotAPIConferenceCreated,
67+
BotAPIConferenceDeleted,
4868
]
4969
BotAPICommand = Union[BotAPIIncomingMessage, BotAPISystemEvent]
5070

@@ -60,5 +80,9 @@
6080
CTSLoginEvent,
6181
CTSLogoutEvent,
6282
EventEdit,
83+
JoinToChatEvent,
84+
ConferenceChangedEvent,
85+
ConferenceCreatedEvent,
86+
ConferenceDeletedEvent,
6387
]
6488
BotCommand = Union[IncomingMessage, SystemEvent]

pybotx/models/enums.py

Lines changed: 37 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]
@@ -103,6 +110,10 @@ class BotAPISystemEventTypes(StrEnum):
103110
LEFT_FROM_CHAT = "system:left_from_chat"
104111
SMARTAPP_EVENT = "system:smartapp_event"
105112
EVENT_EDIT = "system:event_edit"
113+
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"
106117

107118

108119
class BotAPIClientPlatforms(Enum):
@@ -127,6 +138,13 @@ class BotAPIMentionTypes(StrEnum):
127138
ALL = "all"
128139

129140

141+
class BotAPIConferenceLinkTypes(StrEnum):
142+
PUBLIC = "public"
143+
TRUSTS = "trusts"
144+
CORPORATE = "corporate"
145+
SERVER = "server"
146+
147+
130148
class APIUserKinds(Enum):
131149
USER = "user"
132150
CTS_USER = "cts_user"
@@ -233,6 +251,25 @@ def convert_attachment_type_to_domain(
233251
return converted_type
234252

235253

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+
236273
def convert_attachment_type_from_domain(
237274
attachment_type: AttachmentTypes,
238275
) -> 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+
)

0 commit comments

Comments
 (0)