Pytdbot 0.10.0.dev5__tar.gz → 0.10.0.dev7__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.
Files changed (46) hide show
  1. {pytdbot-0.10.0.dev5 → pytdbot-0.10.0.dev7}/PKG-INFO +1 -1
  2. {pytdbot-0.10.0.dev5 → pytdbot-0.10.0.dev7}/Pytdbot.egg-info/PKG-INFO +1 -1
  3. {pytdbot-0.10.0.dev5 → pytdbot-0.10.0.dev7}/pytdbot/__init__.py +1 -1
  4. pytdbot-0.10.0.dev7/pytdbot/exception/__init__.py +39 -0
  5. {pytdbot-0.10.0.dev5 → pytdbot-0.10.0.dev7}/pytdbot/handlers/decorators.py +6 -4
  6. {pytdbot-0.10.0.dev5 → pytdbot-0.10.0.dev7}/pytdbot/handlers/handler.py +10 -0
  7. {pytdbot-0.10.0.dev5 → pytdbot-0.10.0.dev7}/pytdbot/utils/escape.py +4 -4
  8. {pytdbot-0.10.0.dev5 → pytdbot-0.10.0.dev7}/pytdbot/utils/json_utils.py +7 -5
  9. {pytdbot-0.10.0.dev5 → pytdbot-0.10.0.dev7}/pytdbot/utils/obj_encoder.py +14 -7
  10. {pytdbot-0.10.0.dev5 → pytdbot-0.10.0.dev7}/pytdbot/utils/strings.py +13 -13
  11. pytdbot-0.10.0.dev5/pytdbot/exception/__init__.py +0 -31
  12. {pytdbot-0.10.0.dev5 → pytdbot-0.10.0.dev7}/LICENSE +0 -0
  13. {pytdbot-0.10.0.dev5 → pytdbot-0.10.0.dev7}/MANIFEST.in +0 -0
  14. {pytdbot-0.10.0.dev5 → pytdbot-0.10.0.dev7}/Pytdbot.egg-info/SOURCES.txt +0 -0
  15. {pytdbot-0.10.0.dev5 → pytdbot-0.10.0.dev7}/Pytdbot.egg-info/dependency_links.txt +0 -0
  16. {pytdbot-0.10.0.dev5 → pytdbot-0.10.0.dev7}/Pytdbot.egg-info/requires.txt +0 -0
  17. {pytdbot-0.10.0.dev5 → pytdbot-0.10.0.dev7}/Pytdbot.egg-info/top_level.txt +0 -0
  18. {pytdbot-0.10.0.dev5 → pytdbot-0.10.0.dev7}/README.md +0 -0
  19. {pytdbot-0.10.0.dev5 → pytdbot-0.10.0.dev7}/pyproject.toml +0 -0
  20. {pytdbot-0.10.0.dev5 → pytdbot-0.10.0.dev7}/pytdbot/client.py +0 -0
  21. {pytdbot-0.10.0.dev5 → pytdbot-0.10.0.dev7}/pytdbot/client_manager.py +0 -0
  22. {pytdbot-0.10.0.dev5 → pytdbot-0.10.0.dev7}/pytdbot/filters.py +0 -0
  23. {pytdbot-0.10.0.dev5 → pytdbot-0.10.0.dev7}/pytdbot/handlers/__init__.py +0 -0
  24. {pytdbot-0.10.0.dev5 → pytdbot-0.10.0.dev7}/pytdbot/handlers/td_updates.py +0 -0
  25. {pytdbot-0.10.0.dev5 → pytdbot-0.10.0.dev7}/pytdbot/methods/__init__.py +0 -0
  26. {pytdbot-0.10.0.dev5 → pytdbot-0.10.0.dev7}/pytdbot/methods/methods.py +0 -0
  27. {pytdbot-0.10.0.dev5 → pytdbot-0.10.0.dev7}/pytdbot/methods/td_functions.py +0 -0
  28. {pytdbot-0.10.0.dev5 → pytdbot-0.10.0.dev7}/pytdbot/tdjson/__init__.py +0 -0
  29. {pytdbot-0.10.0.dev5 → pytdbot-0.10.0.dev7}/pytdbot/tdjson/tdjson.py +0 -0
  30. {pytdbot-0.10.0.dev5 → pytdbot-0.10.0.dev7}/pytdbot/types/__init__.py +0 -0
  31. {pytdbot-0.10.0.dev5 → pytdbot-0.10.0.dev7}/pytdbot/types/bound_methods/__init__.py +0 -0
  32. {pytdbot-0.10.0.dev5 → pytdbot-0.10.0.dev7}/pytdbot/types/bound_methods/callback_query.py +0 -0
  33. {pytdbot-0.10.0.dev5 → pytdbot-0.10.0.dev7}/pytdbot/types/bound_methods/chatActions.py +0 -0
  34. {pytdbot-0.10.0.dev5 → pytdbot-0.10.0.dev7}/pytdbot/types/bound_methods/file.py +0 -0
  35. {pytdbot-0.10.0.dev5 → pytdbot-0.10.0.dev7}/pytdbot/types/bound_methods/message.py +0 -0
  36. {pytdbot-0.10.0.dev5 → pytdbot-0.10.0.dev7}/pytdbot/types/bound_methods/sender_id.py +0 -0
  37. {pytdbot-0.10.0.dev5 → pytdbot-0.10.0.dev7}/pytdbot/types/plugins/__init__.py +0 -0
  38. {pytdbot-0.10.0.dev5 → pytdbot-0.10.0.dev7}/pytdbot/types/td_types.py +0 -0
  39. {pytdbot-0.10.0.dev5 → pytdbot-0.10.0.dev7}/pytdbot/types/tdserver/__init__.py +0 -0
  40. {pytdbot-0.10.0.dev5 → pytdbot-0.10.0.dev7}/pytdbot/types/tdserver/schedule.py +0 -0
  41. {pytdbot-0.10.0.dev5 → pytdbot-0.10.0.dev7}/pytdbot/types/tdserver/stats.py +0 -0
  42. {pytdbot-0.10.0.dev5 → pytdbot-0.10.0.dev7}/pytdbot/utils/__init__.py +0 -0
  43. {pytdbot-0.10.0.dev5 → pytdbot-0.10.0.dev7}/pytdbot/utils/albums.py +0 -0
  44. {pytdbot-0.10.0.dev5 → pytdbot-0.10.0.dev7}/pytdbot/utils/text_format.py +0 -0
  45. {pytdbot-0.10.0.dev5 → pytdbot-0.10.0.dev7}/pytdbot/utils/webapps.py +0 -0
  46. {pytdbot-0.10.0.dev5 → pytdbot-0.10.0.dev7}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: Pytdbot
3
- Version: 0.10.0.dev5
3
+ Version: 0.10.0.dev7
4
4
  Summary: Easy-to-use asynchronous TDLib wrapper for Python.
5
5
  Author-email: AYMEN A <let.me.code.safe@gmail.com>
6
6
  License-Expression: MIT
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: Pytdbot
3
- Version: 0.10.0.dev5
3
+ Version: 0.10.0.dev7
4
4
  Summary: Easy-to-use asynchronous TDLib wrapper for Python.
5
5
  Author-email: AYMEN A <let.me.code.safe@gmail.com>
6
6
  License-Expression: MIT
@@ -13,7 +13,7 @@ __all__ = [
13
13
  "Client",
14
14
  ]
15
15
 
16
- __version__ = "0.10.0.dev5"
16
+ __version__ = "0.10.0.dev7"
17
17
  __copyright__ = "Copyright (c) 2022-2026 Pytdbot, AYMENJD"
18
18
  __license__ = "MIT License"
19
19
 
@@ -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
- ) -> None:
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
- ) -> None:
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
- ) -> None:
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
- ) -> None:
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
- special_chars_v1 = r"_\*`\["
22
- special_chars_v2 = r"\_*[]()~`>#+-=|{}.!"
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 = special_chars_v1
43
+ chars = special_chars_v1_set
44
44
  elif version == 2:
45
- chars = special_chars_v2
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 Exception:
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,16 @@
1
- import json
2
1
  from base64 import b64encode
2
+ from typing import Any
3
3
 
4
4
  from .. import types, utils
5
5
 
6
+ _type_cache: dict[str, type] = {}
6
7
 
7
- def obj_to_json(obj, **kwargs):
8
- return json.dumps(obj_to_dict(obj), **kwargs)
9
8
 
9
+ def obj_to_json(obj: Any, **kwargs: Any) -> str:
10
+ return utils.json_dumps(obj_to_dict(obj), **kwargs)
10
11
 
11
- def obj_to_dict(obj):
12
+
13
+ def obj_to_dict(obj: Any) -> Any:
12
14
  if hasattr(obj, "to_dict"):
13
15
  return obj_to_dict(obj.to_dict())
14
16
  elif isinstance(obj, list):
@@ -21,10 +23,15 @@ def obj_to_dict(obj):
21
23
  return obj
22
24
 
23
25
 
24
- def dict_to_obj(dict_obj, client=None):
26
+ def dict_to_obj(dict_obj: Any, client: Any = None) -> Any:
25
27
  if isinstance(dict_obj, dict):
26
- if "@type" in dict_obj:
27
- obj = getattr(types, utils.to_camel_case(dict_obj["@type"])).from_dict(
28
+ if td_type := dict_obj.get("@type"):
29
+ obj_type = _type_cache.get(td_type)
30
+ if obj_type is None:
31
+ obj_type = getattr(types, utils.to_camel_case(td_type))
32
+ _type_cache[td_type] = obj_type
33
+
34
+ obj = obj_type.from_dict(
28
35
  {key: dict_to_obj(value, client) for key, value in dict_obj.items()}
29
36
  )
30
37
  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
- for i, part in enumerate(parts):
15
- if i > 0:
16
- camel_case_str += part[0].upper() + part[1:]
17
- else:
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
- if camel_case_str:
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
- return camel_case_str
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 Exception:
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