Pytdbot 0.10.0.dev4__tar.gz → 0.10.0.dev6__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {pytdbot-0.10.0.dev4 → pytdbot-0.10.0.dev6}/PKG-INFO +1 -1
- {pytdbot-0.10.0.dev4 → pytdbot-0.10.0.dev6}/Pytdbot.egg-info/PKG-INFO +1 -1
- {pytdbot-0.10.0.dev4 → pytdbot-0.10.0.dev6}/pytdbot/__init__.py +1 -1
- {pytdbot-0.10.0.dev4 → pytdbot-0.10.0.dev6}/pytdbot/client.py +4 -5
- pytdbot-0.10.0.dev6/pytdbot/exception/__init__.py +39 -0
- {pytdbot-0.10.0.dev4 → pytdbot-0.10.0.dev6}/pytdbot/handlers/decorators.py +6 -4
- {pytdbot-0.10.0.dev4 → pytdbot-0.10.0.dev6}/pytdbot/handlers/handler.py +10 -0
- {pytdbot-0.10.0.dev4 → pytdbot-0.10.0.dev6}/pytdbot/utils/escape.py +4 -4
- {pytdbot-0.10.0.dev4 → pytdbot-0.10.0.dev6}/pytdbot/utils/json_utils.py +7 -5
- {pytdbot-0.10.0.dev4 → pytdbot-0.10.0.dev6}/pytdbot/utils/obj_encoder.py +13 -4
- {pytdbot-0.10.0.dev4 → pytdbot-0.10.0.dev6}/pytdbot/utils/strings.py +13 -13
- pytdbot-0.10.0.dev4/pytdbot/exception/__init__.py +0 -31
- {pytdbot-0.10.0.dev4 → pytdbot-0.10.0.dev6}/LICENSE +0 -0
- {pytdbot-0.10.0.dev4 → pytdbot-0.10.0.dev6}/MANIFEST.in +0 -0
- {pytdbot-0.10.0.dev4 → pytdbot-0.10.0.dev6}/Pytdbot.egg-info/SOURCES.txt +0 -0
- {pytdbot-0.10.0.dev4 → pytdbot-0.10.0.dev6}/Pytdbot.egg-info/dependency_links.txt +0 -0
- {pytdbot-0.10.0.dev4 → pytdbot-0.10.0.dev6}/Pytdbot.egg-info/requires.txt +0 -0
- {pytdbot-0.10.0.dev4 → pytdbot-0.10.0.dev6}/Pytdbot.egg-info/top_level.txt +0 -0
- {pytdbot-0.10.0.dev4 → pytdbot-0.10.0.dev6}/README.md +0 -0
- {pytdbot-0.10.0.dev4 → pytdbot-0.10.0.dev6}/pyproject.toml +0 -0
- {pytdbot-0.10.0.dev4 → pytdbot-0.10.0.dev6}/pytdbot/client_manager.py +0 -0
- {pytdbot-0.10.0.dev4 → pytdbot-0.10.0.dev6}/pytdbot/filters.py +0 -0
- {pytdbot-0.10.0.dev4 → pytdbot-0.10.0.dev6}/pytdbot/handlers/__init__.py +0 -0
- {pytdbot-0.10.0.dev4 → pytdbot-0.10.0.dev6}/pytdbot/handlers/td_updates.py +0 -0
- {pytdbot-0.10.0.dev4 → pytdbot-0.10.0.dev6}/pytdbot/methods/__init__.py +0 -0
- {pytdbot-0.10.0.dev4 → pytdbot-0.10.0.dev6}/pytdbot/methods/methods.py +0 -0
- {pytdbot-0.10.0.dev4 → pytdbot-0.10.0.dev6}/pytdbot/methods/td_functions.py +0 -0
- {pytdbot-0.10.0.dev4 → pytdbot-0.10.0.dev6}/pytdbot/tdjson/__init__.py +0 -0
- {pytdbot-0.10.0.dev4 → pytdbot-0.10.0.dev6}/pytdbot/tdjson/tdjson.py +0 -0
- {pytdbot-0.10.0.dev4 → pytdbot-0.10.0.dev6}/pytdbot/types/__init__.py +0 -0
- {pytdbot-0.10.0.dev4 → pytdbot-0.10.0.dev6}/pytdbot/types/bound_methods/__init__.py +0 -0
- {pytdbot-0.10.0.dev4 → pytdbot-0.10.0.dev6}/pytdbot/types/bound_methods/callback_query.py +0 -0
- {pytdbot-0.10.0.dev4 → pytdbot-0.10.0.dev6}/pytdbot/types/bound_methods/chatActions.py +0 -0
- {pytdbot-0.10.0.dev4 → pytdbot-0.10.0.dev6}/pytdbot/types/bound_methods/file.py +0 -0
- {pytdbot-0.10.0.dev4 → pytdbot-0.10.0.dev6}/pytdbot/types/bound_methods/message.py +0 -0
- {pytdbot-0.10.0.dev4 → pytdbot-0.10.0.dev6}/pytdbot/types/bound_methods/sender_id.py +0 -0
- {pytdbot-0.10.0.dev4 → pytdbot-0.10.0.dev6}/pytdbot/types/plugins/__init__.py +0 -0
- {pytdbot-0.10.0.dev4 → pytdbot-0.10.0.dev6}/pytdbot/types/td_types.py +0 -0
- {pytdbot-0.10.0.dev4 → pytdbot-0.10.0.dev6}/pytdbot/types/tdserver/__init__.py +0 -0
- {pytdbot-0.10.0.dev4 → pytdbot-0.10.0.dev6}/pytdbot/types/tdserver/schedule.py +0 -0
- {pytdbot-0.10.0.dev4 → pytdbot-0.10.0.dev6}/pytdbot/types/tdserver/stats.py +0 -0
- {pytdbot-0.10.0.dev4 → pytdbot-0.10.0.dev6}/pytdbot/utils/__init__.py +0 -0
- {pytdbot-0.10.0.dev4 → pytdbot-0.10.0.dev6}/pytdbot/utils/albums.py +0 -0
- {pytdbot-0.10.0.dev4 → pytdbot-0.10.0.dev6}/pytdbot/utils/text_format.py +0 -0
- {pytdbot-0.10.0.dev4 → pytdbot-0.10.0.dev6}/pytdbot/utils/webapps.py +0 -0
- {pytdbot-0.10.0.dev4 → pytdbot-0.10.0.dev6}/setup.cfg +0 -0
|
@@ -716,7 +716,9 @@ class Client(Decorators, Methods):
|
|
|
716
716
|
if self.is_nats:
|
|
717
717
|
await self.__on_update(
|
|
718
718
|
await self.__nc.request(
|
|
719
|
-
self.__requests_subject,
|
|
719
|
+
self.__requests_subject,
|
|
720
|
+
json_dumps(request, encode=True),
|
|
721
|
+
timeout=None,
|
|
720
722
|
)
|
|
721
723
|
)
|
|
722
724
|
else:
|
|
@@ -1197,10 +1199,7 @@ class Client(Decorators, Methods):
|
|
|
1197
1199
|
await self.process_update(obj_to_dict(update))
|
|
1198
1200
|
|
|
1199
1201
|
async def __on_update(self, update):
|
|
1200
|
-
|
|
1201
|
-
await self.process_update(json_loads(update.data))
|
|
1202
|
-
except Exception:
|
|
1203
|
-
self.logger.exception("Failed to process update")
|
|
1202
|
+
self.loop.create_task(self.process_update(json_loads(update.data)))
|
|
1204
1203
|
|
|
1205
1204
|
async def __handle_update_user(self, update: types.UpdateUser):
|
|
1206
1205
|
if self.is_authenticated and self.me and update.user.id == self.me.id:
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
__all__ = ("StopHandlers", "AuthorizationError", "WebAppDataError")
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class StopHandlers(Exception):
|
|
5
|
+
r"""An exception to stop handlers from execution"""
|
|
6
|
+
|
|
7
|
+
pass
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class AuthorizationError(Exception):
|
|
11
|
+
r"""An exception for authorization errors"""
|
|
12
|
+
|
|
13
|
+
def __init__(self, message: str, code: int = 0) -> None:
|
|
14
|
+
self.code = code
|
|
15
|
+
super().__init__(message)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class WebAppDataError(Exception):
|
|
19
|
+
r"""Base exception for webapp data errors"""
|
|
20
|
+
|
|
21
|
+
pass
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class WebAppDataInvalid(WebAppDataError):
|
|
25
|
+
r"""An exception for invalid webapp data"""
|
|
26
|
+
|
|
27
|
+
pass
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class WebAppDataOutdated(WebAppDataError):
|
|
31
|
+
r"""An exception for outdated webapp data"""
|
|
32
|
+
|
|
33
|
+
pass
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class WebAppDataMismatch(WebAppDataError):
|
|
37
|
+
r"""An exception for mismatched webapp data"""
|
|
38
|
+
|
|
39
|
+
pass
|
|
@@ -11,6 +11,8 @@ from .td_updates import Updates
|
|
|
11
11
|
|
|
12
12
|
logger = logging.getLogger(__name__)
|
|
13
13
|
|
|
14
|
+
HandlerDecorator = Callable[[Callable], Callable]
|
|
15
|
+
|
|
14
16
|
|
|
15
17
|
class Decorators(Updates):
|
|
16
18
|
"""Decorators class."""
|
|
@@ -21,7 +23,7 @@ class Decorators(Updates):
|
|
|
21
23
|
position: int | None = None,
|
|
22
24
|
inner_object: bool = False,
|
|
23
25
|
timeout: float | None = None,
|
|
24
|
-
) ->
|
|
26
|
+
) -> HandlerDecorator:
|
|
25
27
|
r"""A decorator to initialize an event object before running other handlers
|
|
26
28
|
|
|
27
29
|
Parameters:
|
|
@@ -85,7 +87,7 @@ class Decorators(Updates):
|
|
|
85
87
|
position: int | None = None,
|
|
86
88
|
inner_object: bool = False,
|
|
87
89
|
timeout: float | None = None,
|
|
88
|
-
) ->
|
|
90
|
+
) -> HandlerDecorator:
|
|
89
91
|
r"""A decorator to finalize an event object after running all handlers
|
|
90
92
|
|
|
91
93
|
Parameters:
|
|
@@ -147,7 +149,7 @@ class Decorators(Updates):
|
|
|
147
149
|
filters: pytdbot.filters.Filter | None = None,
|
|
148
150
|
position: int | None = None,
|
|
149
151
|
timeout: float | None = None,
|
|
150
|
-
) ->
|
|
152
|
+
) -> HandlerDecorator:
|
|
151
153
|
r"""A decorator to handle ``updateNewMessage`` but with ``Message`` object.
|
|
152
154
|
|
|
153
155
|
Parameters:
|
|
@@ -207,7 +209,7 @@ class Decorators(Updates):
|
|
|
207
209
|
filters: pytdbot.filters.Filter | None = None,
|
|
208
210
|
position: int | None = None,
|
|
209
211
|
timeout: float | None = None,
|
|
210
|
-
) ->
|
|
212
|
+
) -> HandlerDecorator:
|
|
211
213
|
r"""A scheduled event has been triggered
|
|
212
214
|
|
|
213
215
|
Parameters:
|
|
@@ -10,6 +10,16 @@ from ..filters import Filter
|
|
|
10
10
|
class Handler:
|
|
11
11
|
r"""A handler class."""
|
|
12
12
|
|
|
13
|
+
__slots__ = (
|
|
14
|
+
"func",
|
|
15
|
+
"update_type",
|
|
16
|
+
"filter",
|
|
17
|
+
"position",
|
|
18
|
+
"inner_object",
|
|
19
|
+
"timeout",
|
|
20
|
+
"is_from_plugin",
|
|
21
|
+
)
|
|
22
|
+
|
|
13
23
|
def __init__(
|
|
14
24
|
self,
|
|
15
25
|
func: Callable,
|
|
@@ -18,8 +18,8 @@ def escape_html(text: str, quote: bool = True) -> str:
|
|
|
18
18
|
return _html_escape(text, quote=quote)
|
|
19
19
|
|
|
20
20
|
|
|
21
|
-
|
|
22
|
-
|
|
21
|
+
special_chars_v1_set = set(r"_\*`\[")
|
|
22
|
+
special_chars_v2_set = set(r"\_*[]()~`>#+-=|{}.!")
|
|
23
23
|
|
|
24
24
|
|
|
25
25
|
def escape_markdown(text: str, version: int = 2) -> str:
|
|
@@ -40,9 +40,9 @@ def escape_markdown(text: str, version: int = 2) -> str:
|
|
|
40
40
|
"""
|
|
41
41
|
|
|
42
42
|
if version == 1:
|
|
43
|
-
chars =
|
|
43
|
+
chars = special_chars_v1_set
|
|
44
44
|
elif version == 2:
|
|
45
|
-
chars =
|
|
45
|
+
chars = special_chars_v2_set
|
|
46
46
|
else:
|
|
47
47
|
raise ValueError("Invalid version. Must be 1 or 2.")
|
|
48
48
|
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
from typing import Any
|
|
2
|
+
|
|
1
3
|
try:
|
|
2
4
|
import orjson as json
|
|
3
5
|
except ImportError:
|
|
@@ -29,12 +31,12 @@ else:
|
|
|
29
31
|
return d if not encode else d.encode("utf-8")
|
|
30
32
|
|
|
31
33
|
|
|
32
|
-
def json_loads(obj):
|
|
34
|
+
def json_loads(obj: Any) -> Any:
|
|
33
35
|
return json.loads(obj)
|
|
34
36
|
|
|
35
37
|
|
|
36
38
|
class CallbackData:
|
|
37
|
-
def __init__(self, action, data=None):
|
|
39
|
+
def __init__(self, action: str, data: Any = None) -> None:
|
|
38
40
|
self.action = action
|
|
39
41
|
self.data = data
|
|
40
42
|
|
|
@@ -45,20 +47,20 @@ empty_callback_data = CallbackData("")
|
|
|
45
47
|
def load_callback_data(data: bytes) -> CallbackData:
|
|
46
48
|
r"""loads already created callback data by :func:`~pytdbot.utils.callback_data`. Returns empty CallbackData on error"""
|
|
47
49
|
|
|
48
|
-
if not (data[0] == 0x5B and data[-1] == 0x5D):
|
|
50
|
+
if not data or not (data[0] == 0x5B and data[-1] == 0x5D):
|
|
49
51
|
return empty_callback_data
|
|
50
52
|
|
|
51
53
|
try:
|
|
52
54
|
d = json_loads(data)
|
|
53
55
|
if not isinstance(d, list) or len(d) != 2:
|
|
54
56
|
return empty_callback_data
|
|
55
|
-
except
|
|
57
|
+
except (ValueError, TypeError):
|
|
56
58
|
return empty_callback_data
|
|
57
59
|
else:
|
|
58
60
|
return CallbackData(*d)
|
|
59
61
|
|
|
60
62
|
|
|
61
|
-
def callback_data(action, data=None) -> bytes:
|
|
63
|
+
def callback_data(action: Any, data: Any = None) -> bytes:
|
|
62
64
|
r"""Create callback data for inline buttons
|
|
63
65
|
|
|
64
66
|
Parameters:
|
|
@@ -1,14 +1,17 @@
|
|
|
1
1
|
import json
|
|
2
2
|
from base64 import b64encode
|
|
3
|
+
from typing import Any
|
|
3
4
|
|
|
4
5
|
from .. import types, utils
|
|
5
6
|
|
|
7
|
+
_type_cache: dict[str, type] = {}
|
|
6
8
|
|
|
7
|
-
|
|
9
|
+
|
|
10
|
+
def obj_to_json(obj: Any, **kwargs: Any) -> str:
|
|
8
11
|
return json.dumps(obj_to_dict(obj), **kwargs)
|
|
9
12
|
|
|
10
13
|
|
|
11
|
-
def obj_to_dict(obj):
|
|
14
|
+
def obj_to_dict(obj: Any) -> Any:
|
|
12
15
|
if hasattr(obj, "to_dict"):
|
|
13
16
|
return obj_to_dict(obj.to_dict())
|
|
14
17
|
elif isinstance(obj, list):
|
|
@@ -21,10 +24,16 @@ def obj_to_dict(obj):
|
|
|
21
24
|
return obj
|
|
22
25
|
|
|
23
26
|
|
|
24
|
-
def dict_to_obj(dict_obj, client=None):
|
|
27
|
+
def dict_to_obj(dict_obj: Any, client: Any = None) -> Any:
|
|
25
28
|
if isinstance(dict_obj, dict):
|
|
26
29
|
if "@type" in dict_obj:
|
|
27
|
-
|
|
30
|
+
td_type = dict_obj["@type"]
|
|
31
|
+
obj_type = _type_cache.get(td_type)
|
|
32
|
+
if obj_type is None:
|
|
33
|
+
obj_type = getattr(types, utils.to_camel_case(td_type))
|
|
34
|
+
_type_cache[td_type] = obj_type
|
|
35
|
+
|
|
36
|
+
obj = obj_type.from_dict(
|
|
28
37
|
{key: dict_to_obj(value, client) for key, value in dict_obj.items()}
|
|
29
38
|
)
|
|
30
39
|
if client:
|
|
@@ -9,23 +9,23 @@ def to_camel_case(input_str: str, delimiter: str = ".", is_class: bool = True) -
|
|
|
9
9
|
return ""
|
|
10
10
|
|
|
11
11
|
parts = input_str.split(delimiter)
|
|
12
|
-
camel_case_str = ""
|
|
13
12
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
camel_case_str += part
|
|
13
|
+
result = [parts[0]]
|
|
14
|
+
for part in parts[1:]:
|
|
15
|
+
result.append(part[0].upper())
|
|
16
|
+
result.append(part[1:])
|
|
19
17
|
|
|
20
|
-
|
|
21
|
-
camel_case_str = (
|
|
22
|
-
camel_case_str[0].upper() if is_class else camel_case_str[0].lower()
|
|
23
|
-
) + camel_case_str[1:]
|
|
18
|
+
joined = "".join(result)
|
|
24
19
|
|
|
25
|
-
|
|
20
|
+
if not joined:
|
|
21
|
+
return ""
|
|
22
|
+
|
|
23
|
+
if is_class:
|
|
24
|
+
return joined[0].upper() + joined[1:]
|
|
25
|
+
return joined[0].lower() + joined[1:]
|
|
26
26
|
|
|
27
27
|
|
|
28
|
-
def create_extra_id(bytes_size: int = 9):
|
|
28
|
+
def create_extra_id(bytes_size: int = 9) -> str:
|
|
29
29
|
return binascii.hexlify(os.urandom(bytes_size)).decode()
|
|
30
30
|
|
|
31
31
|
|
|
@@ -48,5 +48,5 @@ def get_retry_after_time(error_message: str) -> int:
|
|
|
48
48
|
|
|
49
49
|
try:
|
|
50
50
|
return int(error_message.removeprefix(RETRY_AFTER_PREFEX))
|
|
51
|
-
except
|
|
51
|
+
except (ValueError, AttributeError):
|
|
52
52
|
return 0
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
__all__ = ("StopHandlers", "AuthorizationError")
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
class StopHandlers(Exception):
|
|
5
|
-
r"""An exception to stop handlers from execution"""
|
|
6
|
-
|
|
7
|
-
pass
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
class AuthorizationError(Exception):
|
|
11
|
-
r"""An exception for authorization errors"""
|
|
12
|
-
|
|
13
|
-
pass
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
class WebAppDataInvalid(Exception):
|
|
17
|
-
r"""An exception for invalid webapp data"""
|
|
18
|
-
|
|
19
|
-
pass
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
class WebAppDataOutdated(Exception):
|
|
23
|
-
r"""An exception for outdated webapp data"""
|
|
24
|
-
|
|
25
|
-
pass
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
class WebAppDataMismatch(Exception):
|
|
29
|
-
r"""An exception for mismatched webapp data"""
|
|
30
|
-
|
|
31
|
-
pass
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|