Skip to content

Commit 397ba94

Browse files
committed
Merge remote-tracking branch 'origin/master' into release-candidate
# Conflicts: # pyproject.toml
2 parents 3c78ff5 + 5567e2c commit 397ba94

14 files changed

Lines changed: 532 additions & 55 deletions

File tree

pybotx/__init__.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
ChatCreationError,
4040
ChatCreationProhibitedError,
4141
InvalidUsersListError,
42+
ThreadAlreadyExistsError,
4243
ThreadCreationError,
4344
ThreadCreationProhibitedError,
4445
)
@@ -144,6 +145,7 @@
144145
from pybotx.models.system_events.cts_login import CTSLoginEvent
145146
from pybotx.models.system_events.cts_logout import CTSLogoutEvent
146147
from pybotx.models.system_events.deleted_from_chat import DeletedFromChatEvent
148+
from pybotx.models.system_events.event_delete import EventDeleted
147149
from pybotx.models.system_events.event_edit import EventEdit
148150
from pybotx.models.system_events.internal_bot_notification import (
149151
InternalBotNotificationEvent,
@@ -206,6 +208,7 @@
206208
"DeletedFromChatEvent",
207209
"Document",
208210
"EditMessage",
211+
"EventDeleted",
209212
"EventEdit",
210213
"EventNotFoundError",
211214
"File",
@@ -262,8 +265,8 @@
262265
"SyncSmartAppEventHandlerFunc",
263266
"SyncSmartAppEventHandlerNotFoundError",
264267
"SyncSourceTypes",
268+
"ThreadAlreadyExistsError",
265269
"ThreadCreationError",
266-
"ThreadCreationEventNotFoundError",
267270
"ThreadCreationProhibitedError",
268271
"UnknownBotAccountError",
269272
"UnknownSystemEventError",

pybotx/bot/bot.py

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,7 @@
33
from contextlib import asynccontextmanager
44
from datetime import datetime
55
from types import SimpleNamespace
6-
from typing import (
7-
Any,
8-
Dict,
9-
List,
10-
Optional,
11-
Set,
12-
Tuple,
13-
Union,
14-
)
6+
from typing import Any, Dict, List, Optional, Set, Tuple, Union
157
from uuid import UUID
168

179
import aiofiles

pybotx/bot/handler.py

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,6 @@
11
from dataclasses import dataclass
22
from functools import partial
3-
from typing import (
4-
TYPE_CHECKING,
5-
Awaitable,
6-
Callable,
7-
List,
8-
Literal,
9-
TypeVar,
10-
Union,
11-
)
3+
from typing import TYPE_CHECKING, Awaitable, Callable, List, Literal, TypeVar, Union
124

135
from pybotx.models.commands import BotCommand
146
from pybotx.models.message.incoming_message import IncomingMessage
@@ -23,6 +15,7 @@
2315
from pybotx.models.system_events.cts_login import CTSLoginEvent
2416
from pybotx.models.system_events.cts_logout import CTSLogoutEvent
2517
from pybotx.models.system_events.deleted_from_chat import DeletedFromChatEvent
18+
from pybotx.models.system_events.event_delete import EventDeleted
2619
from pybotx.models.system_events.event_edit import EventEdit
2720
from pybotx.models.system_events.internal_bot_notification import (
2821
InternalBotNotificationEvent,
@@ -53,6 +46,7 @@
5346
HandlerFunc[CTSLogoutEvent],
5447
HandlerFunc[InternalBotNotificationEvent],
5548
HandlerFunc[SmartAppEvent],
49+
HandlerFunc[EventDeleted],
5650
HandlerFunc[EventEdit],
5751
HandlerFunc[JoinToChatEvent],
5852
HandlerFunc[ConferenceChangedEvent],

pybotx/bot/handler_collector.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
from pybotx.models.system_events.cts_login import CTSLoginEvent
4949
from pybotx.models.system_events.cts_logout import CTSLogoutEvent
5050
from pybotx.models.system_events.deleted_from_chat import DeletedFromChatEvent
51+
from pybotx.models.system_events.event_delete import EventDeleted
5152
from pybotx.models.system_events.event_edit import EventEdit
5253
from pybotx.models.system_events.internal_bot_notification import (
5354
InternalBotNotificationEvent,
@@ -316,6 +317,14 @@ def event_edit(
316317
self._system_event(EventEdit, handler_func)
317318
return handler_func
318319

320+
def event_deleted(
321+
self,
322+
handler_func: HandlerFunc[EventDeleted],
323+
) -> HandlerFunc[EventDeleted]:
324+
"""Decorate `event deleted` event handler."""
325+
self._system_event(EventDeleted, handler_func)
326+
return handler_func
327+
319328
def conference_changed(
320329
self,
321330
handler_func: HandlerFunc[ConferenceChangedEvent],

pybotx/client/chats_api/create_thread.py

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
1-
from typing import Literal
1+
from typing import Literal, NoReturn
22
from uuid import UUID
33

4+
import httpx
5+
46
from pybotx.client.authorized_botx_method import AuthorizedBotXMethod
57
from pybotx.client.botx_method import response_exception_thrower
68
from pybotx.client.exceptions.chats import (
9+
ThreadAlreadyExistsError,
710
ThreadCreationError,
811
ThreadCreationProhibitedError,
912
)
@@ -31,12 +34,21 @@ def to_domain(self) -> UUID:
3134
return self.result.thread_id
3235

3336

37+
def conflict_error_handler(response: httpx.Response) -> NoReturn:
38+
reason = response.json().get("reason")
39+
40+
if reason == "thread_already_created":
41+
raise ThreadAlreadyExistsError.from_response(response)
42+
43+
raise ThreadCreationError.from_response(response)
44+
45+
3446
class CreateThreadMethod(AuthorizedBotXMethod):
3547
status_handlers = {
3648
**AuthorizedBotXMethod.status_handlers,
3749
403: response_exception_thrower(ThreadCreationProhibitedError),
3850
404: response_exception_thrower(EventNotFoundError),
39-
422: response_exception_thrower(ThreadCreationError),
51+
409: conflict_error_handler,
4052
}
4153

4254
async def execute(

pybotx/client/exceptions/chats.py

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,22 +17,24 @@ class ChatCreationError(BaseClientError):
1717
"""Error while chat creation."""
1818

1919

20+
class ThreadAlreadyExistsError(BaseClientError):
21+
"""Thread is already exists."""
22+
23+
2024
class ThreadCreationError(BaseClientError):
21-
"""Error while thread creation (invalid scheme)."""
25+
"""Creating a thread for a deleted message."""
2226

2327

2428
class ThreadCreationProhibitedError(BaseClientError):
2529
"""
2630
Error while permission checks.
2731
2832
1. Bot has no permissions to create thread
29-
2. Threads are not allowed for that message
33+
2. Threads are not allowed for this chat
3034
3. Bot is not a chat member where message is located
3135
4. Message is located in personal chat
3236
5. Usupported event type
3337
6. Unsuppoerted chat type
34-
7. Thread is already created
35-
8. No access for message
36-
9. Message in stealth mode
37-
10. Message is deleted
38+
7. No access for message
39+
8. Message in stealth mode
3840
"""

pybotx/client/smartapps_api/smartapp_manifest.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from typing import List, Literal
1+
from typing import List, Literal, Optional
22
from uuid import UUID
33

44
from pybotx.client.authorized_botx_method import AuthorizedBotXMethod
@@ -23,6 +23,7 @@ class SmartappManifestAuroraParams(VerifiedPayloadBaseModel):
2323
class SmartappManifestWebParams(VerifiedPayloadBaseModel):
2424
default_layout: WebLayoutChoices = WebLayoutChoices.minimal
2525
expanded_layout: WebLayoutChoices = WebLayoutChoices.half
26+
allowed_layouts: Optional[list[WebLayoutChoices]] = None
2627
always_pinned: bool = False
2728

2829

pybotx/models/commands.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
BotAPIDeletedFromChat,
4141
DeletedFromChatEvent,
4242
)
43+
from pybotx.models.system_events.event_delete import BotAPIEventDeleted, EventDeleted
4344
from pybotx.models.system_events.event_edit import BotAPIEventEdit, EventEdit
4445
from pybotx.models.system_events.internal_bot_notification import (
4546
BotAPIInternalBotNotification,
@@ -69,6 +70,7 @@
6970
BotAPILeftFromChat,
7071
BotAPICTSLogin,
7172
BotAPICTSLogout,
73+
BotAPIEventDeleted,
7274
BotAPIEventEdit,
7375
BotAPIJoinToChat,
7476
BotAPIConferenceChanged,
@@ -88,6 +90,7 @@
8890
LeftFromChatEvent,
8991
CTSLoginEvent,
9092
CTSLogoutEvent,
93+
EventDeleted,
9194
EventEdit,
9295
JoinToChatEvent,
9396
ConferenceChangedEvent,

pybotx/models/enums.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@ class BotAPISystemEventTypes(StrEnum):
112112
INTERNAL_BOT_NOTIFICATION = "system:internal_bot_notification"
113113
LEFT_FROM_CHAT = "system:left_from_chat"
114114
SMARTAPP_EVENT = "system:smartapp_event"
115+
EVENT_DELETED = "system:event_deleted"
115116
EVENT_EDIT = "system:event_edit"
116117
JOIN_TO_CHAT = "system:user_joined_to_chat"
117118
CONFERENCE_CHANGED = "system:conference_changed"
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
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 BotAPISystemEventTypes
17+
18+
19+
@dataclass
20+
class EventDeleted(BotCommandBase):
21+
"""Event `system:event_deleted`.
22+
23+
Attributes:
24+
deleted_at: Delete message date and time.
25+
group_chat_id: Delete message group chat id.
26+
meta: Delete message meta.
27+
sync_ids: Delete message sync ids.
28+
"""
29+
30+
deleted_at: datetime
31+
group_chat_id: UUID
32+
sync_ids: List[UUID]
33+
meta: Optional[Dict[str, Any]]
34+
35+
36+
class BotAPIEventDeletedData(VerifiedPayloadBaseModel):
37+
deleted_at: datetime
38+
group_chat_id: UUID
39+
sync_ids: List[UUID]
40+
meta: Optional[Dict[str, Any]]
41+
42+
43+
class BotAPIEventDeletedPayload(BotAPIBaseSystemEventPayload):
44+
body: Literal[BotAPISystemEventTypes.EVENT_DELETED]
45+
data: BotAPIEventDeletedData
46+
47+
48+
class BotAPIEventDeleted(BotAPIBaseCommand):
49+
payload: BotAPIEventDeletedPayload = Field(..., alias="command")
50+
bot: BaseBotAPIContext = Field(..., alias="from")
51+
52+
def to_domain(self, raw_command: Dict[str, Any]) -> EventDeleted:
53+
return EventDeleted(
54+
bot=BotAccount(
55+
id=self.bot_id,
56+
host=self.bot.host,
57+
),
58+
raw_command=raw_command,
59+
deleted_at=self.payload.data.deleted_at,
60+
group_chat_id=self.payload.data.group_chat_id,
61+
meta=self.payload.data.meta,
62+
sync_ids=self.payload.data.sync_ids,
63+
)

0 commit comments

Comments
 (0)