Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
148 changes: 133 additions & 15 deletions poetry.lock

Large diffs are not rendered by default.

8 changes: 8 additions & 0 deletions pybotx/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,7 @@
AttachmentTypes,
ChatTypes,
ClientPlatforms,
ConferenceLinkTypes,
MentionTypes,
SmartappManifestWebLayoutChoices,
SyncSourceTypes,
Expand Down Expand Up @@ -135,6 +136,9 @@
from pybotx.models.system_events.added_to_chat import AddedToChatEvent
from pybotx.models.system_events.chat_created import ChatCreatedEvent, ChatCreatedMember
from pybotx.models.system_events.chat_deleted_by_user import ChatDeletedByUserEvent
from pybotx.models.system_events.conference_changed import ConferenceChangedEvent
from pybotx.models.system_events.conference_created import ConferenceCreatedEvent
from pybotx.models.system_events.conference_deleted import ConferenceDeletedEvent
from pybotx.models.system_events.cts_login import CTSLoginEvent
from pybotx.models.system_events.cts_logout import CTSLogoutEvent
from pybotx.models.system_events.deleted_from_chat import DeletedFromChatEvent
Expand Down Expand Up @@ -193,6 +197,10 @@
"ChatNotFoundError",
"ChatTypes",
"ClientPlatforms",
"ConferenceChangedEvent",
"ConferenceCreatedEvent",
"ConferenceDeletedEvent",
"ConferenceLinkTypes",
"DeletedFromChatEvent",
"Document",
"EditMessage",
Expand Down
6 changes: 6 additions & 0 deletions pybotx/bot/handler.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@
from pybotx.models.system_events.added_to_chat import AddedToChatEvent
from pybotx.models.system_events.chat_created import ChatCreatedEvent
from pybotx.models.system_events.chat_deleted_by_user import ChatDeletedByUserEvent
from pybotx.models.system_events.conference_changed import ConferenceChangedEvent
from pybotx.models.system_events.conference_created import ConferenceCreatedEvent
from pybotx.models.system_events.conference_deleted import ConferenceDeletedEvent
from pybotx.models.system_events.cts_login import CTSLoginEvent
from pybotx.models.system_events.cts_logout import CTSLogoutEvent
from pybotx.models.system_events.deleted_from_chat import DeletedFromChatEvent
Expand Down Expand Up @@ -44,6 +47,9 @@
HandlerFunc[SmartAppEvent],
HandlerFunc[EventEdit],
HandlerFunc[JoinToChatEvent],
HandlerFunc[ConferenceChangedEvent],
HandlerFunc[ConferenceCreatedEvent],
HandlerFunc[ConferenceDeletedEvent],
]

VisibleFunc = Callable[[StatusRecipient, "Bot"], Awaitable[bool]]
Expand Down
27 changes: 27 additions & 0 deletions pybotx/bot/handler_collector.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,9 @@
from pybotx.models.system_events.added_to_chat import AddedToChatEvent
from pybotx.models.system_events.chat_created import ChatCreatedEvent
from pybotx.models.system_events.chat_deleted_by_user import ChatDeletedByUserEvent
from pybotx.models.system_events.conference_changed import ConferenceChangedEvent
from pybotx.models.system_events.conference_created import ConferenceCreatedEvent
from pybotx.models.system_events.conference_deleted import ConferenceDeletedEvent
from pybotx.models.system_events.cts_login import CTSLoginEvent
from pybotx.models.system_events.cts_logout import CTSLogoutEvent
from pybotx.models.system_events.deleted_from_chat import DeletedFromChatEvent
Expand Down Expand Up @@ -310,6 +313,30 @@ def event_edit(
self._system_event(EventEdit, handler_func)
return handler_func

def conference_changed(
self,
handler_func: HandlerFunc[ConferenceChangedEvent],
) -> HandlerFunc[ConferenceChangedEvent]:
"""Decorate `conference changed` event handler."""
self._system_event(ConferenceChangedEvent, handler_func)
return handler_func

def conference_created(
self,
handler_func: HandlerFunc[ConferenceCreatedEvent],
) -> HandlerFunc[ConferenceCreatedEvent]:
"""Decorate `conference created` event handler."""
self._system_event(ConferenceCreatedEvent, handler_func)
return handler_func

def conference_deleted(
self,
handler_func: HandlerFunc[ConferenceDeletedEvent],
) -> HandlerFunc[ConferenceDeletedEvent]:
"""Decorate `conference deleted` event handler."""
self._system_event(ConferenceDeletedEvent, handler_func)
return handler_func

def smartapp_event(
self,
handler_func: HandlerFunc[SmartAppEvent],
Expand Down
18 changes: 18 additions & 0 deletions pybotx/models/commands.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,18 @@
BotAPIChatDeletedByUser,
ChatDeletedByUserEvent,
)
from pybotx.models.system_events.conference_changed import (
BotAPIConferenceChanged,
ConferenceChangedEvent,
)
from pybotx.models.system_events.conference_created import (
BotAPIConferenceCreated,
ConferenceCreatedEvent,
)
from pybotx.models.system_events.conference_deleted import (
BotAPIConferenceDeleted,
ConferenceDeletedEvent,
)
from pybotx.models.system_events.cts_login import BotAPICTSLogin, CTSLoginEvent
from pybotx.models.system_events.cts_logout import BotAPICTSLogout, CTSLogoutEvent
from pybotx.models.system_events.deleted_from_chat import (
Expand Down Expand Up @@ -50,6 +62,9 @@
BotAPICTSLogout,
BotAPIEventEdit,
BotAPIJoinToChat,
BotAPIConferenceChanged,
BotAPIConferenceCreated,
BotAPIConferenceDeleted,
]
BotAPICommand = Union[BotAPIIncomingMessage, BotAPISystemEvent]

Expand All @@ -66,5 +81,8 @@
CTSLogoutEvent,
EventEdit,
JoinToChatEvent,
ConferenceChangedEvent,
ConferenceCreatedEvent,
ConferenceDeletedEvent,
]
BotCommand = Union[IncomingMessage, SystemEvent]
36 changes: 36 additions & 0 deletions pybotx/models/enums.py
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,13 @@ class SyncSourceTypes(AutoName):
BOTX = auto()


class ConferenceLinkTypes(AutoName):
PUBLIC = auto()
TRUSTS = auto()
CORPORATE = auto()
SERVER = auto()


UNSUPPORTED = Literal["UNSUPPORTED"]
IncomingChatTypes = Union[ChatTypes, UNSUPPORTED]
IncomingSyncSourceTypes = Union[SyncSourceTypes, UNSUPPORTED]
Expand Down Expand Up @@ -104,6 +111,9 @@ class BotAPISystemEventTypes(StrEnum):
SMARTAPP_EVENT = "system:smartapp_event"
EVENT_EDIT = "system:event_edit"
JOIN_TO_CHAT = "system:user_joined_to_chat"
CONFERENCE_CHANGED = "system:conference_changed"
CONFERENCE_CREATED = "system:conference_created"
CONFERENCE_DELETED = "system:conference_deleted"


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


class BotAPIConferenceLinkTypes(StrEnum):
PUBLIC = "public"
TRUSTS = "trusts"
CORPORATE = "corporate"
SERVER = "server"


class APIUserKinds(Enum):
USER = "user"
CTS_USER = "cts_user"
Expand Down Expand Up @@ -234,6 +251,25 @@ def convert_attachment_type_to_domain(
return converted_type


def convert_conference_link_type_to_domain(
conference_link_type: BotAPIConferenceLinkTypes,
) -> ConferenceLinkTypes:
conference_link_type_mapping = {
BotAPIConferenceLinkTypes.PUBLIC: ConferenceLinkTypes.PUBLIC,
BotAPIConferenceLinkTypes.TRUSTS: ConferenceLinkTypes.TRUSTS,
BotAPIConferenceLinkTypes.CORPORATE: ConferenceLinkTypes.CORPORATE,
BotAPIConferenceLinkTypes.SERVER: ConferenceLinkTypes.SERVER,
}

converted_type = conference_link_type_mapping.get(conference_link_type)
if converted_type is None:
raise NotImplementedError(
f"Unsupported conference link type: {conference_link_type}",
)

return converted_type


def convert_attachment_type_from_domain(
attachment_type: AttachmentTypes,
) -> APIAttachmentTypes:
Expand Down
114 changes: 114 additions & 0 deletions pybotx/models/system_events/conference_changed.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
from dataclasses import dataclass
from datetime import datetime
from typing import Any, Dict, List, Literal, Optional
from uuid import UUID

from pydantic import Field

from pybotx.models.api_base import VerifiedPayloadBaseModel
from pybotx.models.base_command import (
BaseBotAPIContext,
BotAPIBaseCommand,
BotAPIBaseSystemEventPayload,
BotCommandBase,
)
from pybotx.models.bot_account import BotAccount
from pybotx.models.enums import (
BotAPIConferenceLinkTypes,
BotAPISystemEventTypes,
ConferenceLinkTypes,
convert_conference_link_type_to_domain,
)


@dataclass
class ConferenceChangedEvent(BotCommandBase):
"""Event `system:conference_changed`.

Attributes:
access_code: access code for conference.
actor: who changes conference.
added_users: added users to conference.
admins: admins conference.
call_id: id conference.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Стоит описать все параметры в доксринге, а не только часть

deleted_users: deleted users to conference.
end_at: end conference.
link: conference link.
link_id: conference link id.
link_type: link type on conference (public|trusts|corporate|server).
members: list members.
name: name conference.
operation: operation.
sip_number: sip number conference.
start_at: end conference.
"""

access_code: Optional[str]
actor: Optional[UUID]
added_users: List[UUID]
admins: List[UUID]
call_id: UUID
deleted_users: List[UUID]
end_at: Optional[datetime]
link: str
link_id: UUID
link_type: ConferenceLinkTypes
members: List[UUID]
name: str
operation: str
sip_number: int
start_at: datetime


class BotAPIConferenceChangedData(VerifiedPayloadBaseModel):
access_code: Optional[str]
actor: Optional[UUID]
added_users: List[UUID]
admins: List[UUID]
call_id: UUID
deleted_users: List[UUID]
end_at: Optional[datetime]
link: str
link_id: UUID
link_type: BotAPIConferenceLinkTypes
members: List[UUID]
name: str
operation: str
sip_number: int
start_at: datetime


class BotAPIConferenceChangedPayload(BotAPIBaseSystemEventPayload):
body: Literal[BotAPISystemEventTypes.CONFERENCE_CHANGED]
data: BotAPIConferenceChangedData


class BotAPIConferenceChanged(BotAPIBaseCommand):
payload: BotAPIConferenceChangedPayload = Field(..., alias="command")
sender: BaseBotAPIContext = Field(..., alias="from")

def to_domain(self, raw_command: Dict[str, Any]) -> ConferenceChangedEvent:
return ConferenceChangedEvent(
bot=BotAccount(
id=self.bot_id,
host=self.sender.host,
),
raw_command=raw_command,
access_code=self.payload.data.access_code,
actor=self.payload.data.actor,
added_users=self.payload.data.added_users,
admins=self.payload.data.admins,
call_id=self.payload.data.call_id,
deleted_users=self.payload.data.deleted_users,
end_at=self.payload.data.end_at,
link=self.payload.data.link,
link_id=self.payload.data.link_id,
link_type=convert_conference_link_type_to_domain(
self.payload.data.link_type,
),
members=self.payload.data.members,
name=self.payload.data.name,
operation=self.payload.data.operation,
sip_number=self.payload.data.sip_number,
start_at=self.payload.data.start_at,
)
50 changes: 50 additions & 0 deletions pybotx/models/system_events/conference_created.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
from dataclasses import dataclass
from typing import Any, Dict, Literal
from uuid import UUID

from pydantic import Field

from pybotx.models.api_base import VerifiedPayloadBaseModel
from pybotx.models.base_command import (
BaseBotAPIContext,
BotAPIBaseCommand,
BotAPIBaseSystemEventPayload,
BotCommandBase,
)
from pybotx.models.bot_account import BotAccount
from pybotx.models.enums import BotAPISystemEventTypes


@dataclass
class ConferenceCreatedEvent(BotCommandBase):
"""Event `system:conference_created`.

Attributes:
call_id: id conference.
"""

call_id: UUID


class BotAPIConferenceCreatedData(VerifiedPayloadBaseModel):
call_id: UUID


class BotAPIConferenceCreatedPayload(BotAPIBaseSystemEventPayload):
body: Literal[BotAPISystemEventTypes.CONFERENCE_CREATED]
data: BotAPIConferenceCreatedData


class BotAPIConferenceCreated(BotAPIBaseCommand):
payload: BotAPIConferenceCreatedPayload = Field(..., alias="command")
sender: BaseBotAPIContext = Field(..., alias="from")

def to_domain(self, raw_command: Dict[str, Any]) -> ConferenceCreatedEvent:
return ConferenceCreatedEvent(
bot=BotAccount(
id=self.bot_id,
host=self.sender.host,
),
raw_command=raw_command,
call_id=self.payload.data.call_id,
)
Loading
Loading