telegrinder 0.4.0__py3-none-any.whl → 0.4.2__py3-none-any.whl

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.

Potentially problematic release.


This version of telegrinder might be problematic. Click here for more details.

telegrinder/__init__.py CHANGED
@@ -22,7 +22,7 @@ logger.set_level("INFO")
22
22
 
23
23
 
24
24
  @bot.on.message(Text("/start"))
25
- async def start(message: Message):
25
+ async def start(message: Message) -> None:
26
26
  me = (await api.get_me()).unwrap()
27
27
  await message.answer(f"Hello, {message.from_user.full_name}! I'm {me.full_name}.")
28
28
 
@@ -76,7 +76,7 @@ else:
76
76
  continue
77
77
  if orig_arg in (Variative, Some, Option):
78
78
  return _get_cute_from_generic(typing.get_args(arg))
79
- if issubclass(arg, BaseCute):
79
+ if issubclass(orig_arg, BaseCute):
80
80
  return arg
81
81
 
82
82
  return None
@@ -118,7 +118,7 @@ class FuncHandler(ABCHandler[Event], typing.Generic[Event, Function, ErrorHandle
118
118
  try:
119
119
  if event_param := self.get_name_event_param(event):
120
120
  ctx = Context(**{event_param: event, **ctx})
121
- return await self(**magic_bundle(self.function, ctx, start_idx=0))
121
+ return await self(**magic_bundle(self.function, ctx, start_idx=0, bundle_ctx=True))
122
122
  except BaseException as exception:
123
123
  return await self.error_handler.run(exception, event, api, ctx)
124
124
  finally:
@@ -6,7 +6,6 @@ from telegrinder.bot.scenario.checkbox import Checkbox, ChoiceAction
6
6
 
7
7
  if typing.TYPE_CHECKING:
8
8
  from telegrinder.api.api import API
9
- from telegrinder.bot.dispatch.view.base import BaseStateView
10
9
 
11
10
  class Choice[Key: typing.Hashable](Checkbox[Key]):
12
11
  async def wait(
@@ -16,6 +15,7 @@ if typing.TYPE_CHECKING:
16
15
  ) -> tuple[Key, int]: ...
17
16
 
18
17
  else:
18
+
19
19
  class Choice(Checkbox):
20
20
  async def handle(self, cb):
21
21
  code = cb.data.unwrap().replace(self.random_code + "/", "", 1)
@@ -261,7 +261,7 @@ class Decoder:
261
261
  f"Unknown type `{repr_type(origin_type)}`. You can implement decode hook for this type."
262
262
  )
263
263
  dec_hook_func = self.dec_hooks[origin_type]
264
- kwargs = magic_bundle(dec_hook_func, context or {}, start_idx=2, bundle_ctx=False)
264
+ kwargs = magic_bundle(dec_hook_func, context or {}, start_idx=2)
265
265
  return dec_hook_func(tp, obj, **kwargs)
266
266
 
267
267
  return inner
@@ -400,7 +400,7 @@ class Encoder:
400
400
  f"Not implemented encode hook for object of type `{repr_type(origin_type)}`.",
401
401
  )
402
402
  enc_hook_func = self.enc_hooks[origin_type]
403
- kwargs = magic_bundle(enc_hook_func, context or {}, start_idx=1, bundle_ctx=False)
403
+ kwargs = magic_bundle(enc_hook_func, context or {}, start_idx=1)
404
404
  return enc_hook_func(obj, **kwargs)
405
405
 
406
406
  return inner
@@ -10,7 +10,7 @@ from telegrinder.modules import logger
10
10
  from telegrinder.node.base import ComposeError, Node, get_nodes
11
11
  from telegrinder.node.composer import CONTEXT_STORE_NODES_KEY, NodeSession, compose_nodes
12
12
  from telegrinder.node.scope import NodeScope
13
- from telegrinder.tools.magic import get_impls, impl, magic_bundle
13
+ from telegrinder.tools.magic import get_polymorphic_implementations, impl, magic_bundle
14
14
  from telegrinder.types.objects import Update
15
15
 
16
16
 
@@ -26,7 +26,7 @@ class Polymorphic(Node):
26
26
  Update: raw_update,
27
27
  }
28
28
 
29
- for i, impl_ in enumerate(get_impls(cls)):
29
+ for i, impl_ in enumerate(get_polymorphic_implementations(cls)):
30
30
  logger.debug("Checking impl {!r}...", impl_.__name__)
31
31
  node_collection = None
32
32
 
@@ -95,7 +95,7 @@ from .magic import (
95
95
  get_cached_translation,
96
96
  get_default_args,
97
97
  get_func_parameters,
98
- get_impls,
98
+ get_polymorphic_implementations,
99
99
  impl,
100
100
  magic_bundle,
101
101
  resolve_arg_names,
@@ -165,7 +165,7 @@ __all__ = (
165
165
  "get_cached_translation",
166
166
  "get_default_args",
167
167
  "get_func_parameters",
168
- "get_impls",
168
+ "get_polymorphic_implementations",
169
169
  "impl",
170
170
  "italic",
171
171
  "link",
@@ -22,9 +22,7 @@ class EventAdapter[ToEvent: BaseCute](ABCAdapter[Update, ToEvent]):
22
22
 
23
23
  def __repr__(self) -> str:
24
24
  raw_update_type = (
25
- f"Update -> {self.event.__name__}"
26
- if isinstance(self.event, type)
27
- else f"Update.{self.event.value}" # type: ignore
25
+ f"Update -> {self.event.__name__}" if isinstance(self.event, type) else f"Update.{self.event.value}" # type: ignore
28
26
  )
29
27
  return "<{}: adapt {} -> {}>".format(
30
28
  self.__class__.__name__,
@@ -4,11 +4,10 @@ import asyncio
4
4
  import dataclasses
5
5
  import enum
6
6
  import inspect
7
- import types
8
- import typing
9
7
  from collections import OrderedDict
10
8
  from functools import wraps
11
9
 
10
+ import typing_extensions as typing
12
11
  from fntypes import Result
13
12
 
14
13
  from telegrinder.model import get_params
@@ -18,56 +17,67 @@ if typing.TYPE_CHECKING:
18
17
  from telegrinder.node.polymorphic import Polymorphic
19
18
 
20
19
  type Impl = type[classmethod]
21
- type FuncType = types.FunctionType | typing.Callable[..., typing.Any]
22
-
20
+ type Function = typing.Callable[..., typing.Any]
23
21
  type Executor[T] = typing.Callable[
24
22
  [T, str, dict[str, typing.Any]],
25
23
  typing.Awaitable[Result[typing.Any, typing.Any]],
26
24
  ]
27
25
 
28
26
  TRANSLATIONS_KEY: typing.Final[str] = "_translations"
27
+ MORPH_IMPLEMENTATIONS_KEY = "__morph_implementations__"
29
28
  IMPL_MARK: typing.Final[str] = "_is_impl"
29
+ CONTEXT_KEYS: typing.Final[tuple[str, ...]] = ("ctx", "context")
30
+
31
+
32
+ class FuncParams(typing.TypedDict, total=True):
33
+ args: list[tuple[str, typing.Any | inspect.Parameter.empty]]
34
+ kwargs: list[tuple[str, typing.Any | inspect.Parameter.empty]]
35
+ var_args: typing.NotRequired[str]
36
+ var_kwargs: typing.NotRequired[str]
30
37
 
31
38
 
32
39
  @dataclasses.dataclass(slots=True, frozen=True)
33
40
  class Shortcut[T]:
34
41
  method_name: str
35
42
  executor: Executor[T] | None = dataclasses.field(default=None, kw_only=True)
36
- custom_params: set[str] = dataclasses.field(default_factory=lambda: set(), kw_only=True)
43
+ custom_params: set[str] = dataclasses.field(default_factory=lambda: set[str](), kw_only=True)
37
44
 
38
45
 
39
46
  def cache_magic_value(mark_key: str, /):
40
47
  def inner[Func: typing.Callable[..., typing.Any]](func: Func) -> Func:
41
48
  @wraps(func)
42
- def wrapper(*args: typing.Any, **kwargs: typing.Any) -> typing.Any:
43
- if mark_key not in args[0].__dict__:
44
- args[0].__dict__[mark_key] = func(*args, **kwargs)
45
- return args[0].__dict__[mark_key]
49
+ def wrapper(
50
+ f: Function | None = None,
51
+ /,
52
+ *args: typing.Any,
53
+ **kwargs: typing.Any,
54
+ ) -> typing.Any:
55
+ if f is not None and mark_key not in f.__dict__:
56
+ f.__dict__[mark_key] = func(f, *args, **kwargs)
57
+ return f.__dict__[mark_key]
46
58
 
47
59
  return wrapper # type: ignore
48
60
 
49
61
  return inner
50
62
 
51
63
 
52
- def resolve_arg_names(func: FuncType, start_idx: int = 1) -> tuple[str, ...]:
64
+ def resolve_arg_names(func: Function, start_idx: int = 1) -> tuple[str, ...]:
53
65
  return func.__code__.co_varnames[start_idx : func.__code__.co_argcount]
54
66
 
55
67
 
56
- @cache_magic_value("__default_args__")
57
- def get_default_args(func: FuncType) -> dict[str, typing.Any]:
58
- kwdefaults = func.__kwdefaults__
59
- if kwdefaults:
60
- return kwdefaults
61
-
68
+ @cache_magic_value("__default_arguments__")
69
+ def get_default_args(func: Function, /) -> dict[str, typing.Any]:
62
70
  defaults = func.__defaults__
71
+ kwdefaults = {} if not func.__kwdefaults__ else func.__kwdefaults__.copy()
63
72
  if not defaults:
64
- return {}
65
-
66
- return {k: defaults[i] for i, k in enumerate(resolve_arg_names(func, start_idx=0)[-len(defaults) :])}
73
+ return kwdefaults
74
+ return {
75
+ k: defaults[i] for i, k in enumerate(resolve_arg_names(func, start_idx=0)[-len(defaults) :])
76
+ } | kwdefaults
67
77
 
68
78
 
69
- @cache_magic_value("__func_parameters__")
70
- def get_func_parameters(func: FuncType, /) -> FuncParams:
79
+ @cache_magic_value("__function_parameters__")
80
+ def get_func_parameters(func: Function, /) -> FuncParams:
71
81
  func_params: FuncParams = {"args": [], "kwargs": []}
72
82
 
73
83
  for k, p in inspect.signature(func).parameters.items():
@@ -87,8 +97,8 @@ def get_func_parameters(func: FuncType, /) -> FuncParams:
87
97
  return func_params
88
98
 
89
99
 
90
- def get_annotations(func: FuncType, *, return_type: bool = False) -> dict[str, typing.Any]:
91
- annotations = func.__annotations__
100
+ def get_annotations(func: Function, *, return_type: bool = False) -> dict[str, typing.Any]:
101
+ annotations = func.__annotations__.copy()
92
102
  if not return_type:
93
103
  annotations.pop("return", None)
94
104
  return annotations
@@ -101,49 +111,66 @@ def to_str(s: str | enum.Enum) -> str:
101
111
 
102
112
 
103
113
  @typing.overload
104
- def magic_bundle(function: FuncType, kw: dict[str, typing.Any]) -> dict[str, typing.Any]: ...
114
+ def magic_bundle(
115
+ function: Function,
116
+ kw: dict[str, typing.Any],
117
+ *,
118
+ start_idx: int = 1,
119
+ omit_defaults: bool = False,
120
+ ) -> dict[str, typing.Any]: ...
105
121
 
106
122
 
107
123
  @typing.overload
108
- def magic_bundle(function: FuncType, kw: dict[enum.Enum, typing.Any]) -> dict[str, typing.Any]: ...
124
+ def magic_bundle(
125
+ function: Function,
126
+ kw: dict[enum.Enum, typing.Any],
127
+ *,
128
+ start_idx: int = 1,
129
+ omit_defaults: bool = False,
130
+ ) -> dict[str, typing.Any]: ...
109
131
 
110
132
 
111
133
  @typing.overload
112
134
  def magic_bundle(
113
- function: FuncType,
135
+ function: Function,
114
136
  kw: dict[str, typing.Any],
115
137
  *,
116
138
  start_idx: int = 1,
117
- bundle_ctx: bool = True,
139
+ bundle_ctx: bool = False,
140
+ omit_defaults: bool = False,
118
141
  ) -> dict[str, typing.Any]: ...
119
142
 
120
143
 
121
144
  @typing.overload
122
145
  def magic_bundle(
123
- function: FuncType,
146
+ function: Function,
124
147
  kw: dict[enum.Enum, typing.Any],
125
148
  *,
126
149
  start_idx: int = 1,
127
- bundle_ctx: bool = True,
150
+ bundle_ctx: bool = False,
151
+ omit_defaults: bool = False,
128
152
  ) -> dict[str, typing.Any]: ...
129
153
 
130
154
 
131
155
  @typing.overload
132
156
  def magic_bundle(
133
- function: FuncType,
157
+ function: Function,
134
158
  kw: dict[type[typing.Any], typing.Any],
135
159
  *,
160
+ start_idx: int = 1,
136
161
  typebundle: typing.Literal[True] = True,
162
+ omit_defaults: bool = False,
137
163
  ) -> dict[str, typing.Any]: ...
138
164
 
139
165
 
140
166
  def magic_bundle(
141
- function: FuncType,
167
+ function: Function,
142
168
  kw: dict[typing.Any, typing.Any],
143
169
  *,
144
170
  start_idx: int = 1,
145
- bundle_ctx: bool = True,
171
+ bundle_ctx: bool = False,
146
172
  typebundle: bool = False,
173
+ omit_defaults: bool = False,
147
174
  ) -> dict[str, typing.Any]:
148
175
  # Bundle considering the function annotations
149
176
  if typebundle:
@@ -154,10 +181,16 @@ def magic_bundle(
154
181
  if "var_kwargs" in get_func_parameters(function) and not names:
155
182
  return {to_str(k): v for k, v in kw.items()}
156
183
 
157
- # Bundle considering the function parameters and defaults
158
- args = get_default_args(function) | {n: v for k, v in kw.items() if (n := to_str(k)) in names}
159
- if "ctx" in names and bundle_ctx:
160
- args["ctx"] = kw
184
+ # Bundle considering the function parameters and defaults (if do not omit defaults)
185
+ defaults = {} if omit_defaults else get_default_args(function)
186
+ args = defaults | {n: v for k, v in kw.items() if (n := to_str(k)) in names}
187
+
188
+ # Bundle a context if context key specified in `names`
189
+ if bundle_ctx:
190
+ for key in CONTEXT_KEYS:
191
+ if key in names:
192
+ args[key] = kw
193
+ break
161
194
 
162
195
  return args
163
196
 
@@ -189,30 +222,23 @@ def impl(method: typing.Callable[..., typing.Any]):
189
222
  return classmethod(method)
190
223
 
191
224
 
192
- def get_impls(cls: type[Polymorphic]) -> list[typing.Callable[..., typing.Any]]:
193
- moprh_impls = getattr(cls, "__morph_impls__", None)
225
+ def get_polymorphic_implementations(cls: type[Polymorphic], /) -> list[typing.Callable[..., typing.Any]]:
226
+ moprh_impls = getattr(cls, MORPH_IMPLEMENTATIONS_KEY, None)
194
227
  if moprh_impls is not None:
195
228
  return moprh_impls
196
229
 
197
230
  impls = []
198
231
  for cls_ in cls.mro():
199
232
  impls += [
200
- func.__func__
201
- for func in vars(cls_).values()
202
- if isinstance(func, classmethod) and getattr(func.__func__, IMPL_MARK, False)
233
+ obj.__func__
234
+ for obj in vars(cls_).values()
235
+ if isinstance(obj, classmethod) and getattr(obj.__func__, IMPL_MARK, False)
203
236
  ]
204
237
 
205
- setattr(cls, "__morph_impls__", impls)
238
+ setattr(cls, MORPH_IMPLEMENTATIONS_KEY, impls)
206
239
  return impls
207
240
 
208
241
 
209
- class FuncParams(typing.TypedDict, total=True):
210
- args: list[tuple[str, typing.Any | inspect.Parameter.empty]]
211
- kwargs: list[tuple[str, typing.Any | inspect.Parameter.empty]]
212
- var_args: typing.NotRequired[str]
213
- var_kwargs: typing.NotRequired[str]
214
-
215
-
216
242
  def shortcut[T](
217
243
  method_name: str,
218
244
  *,
@@ -308,7 +334,7 @@ __all__ = (
308
334
  "get_default_args",
309
335
  "get_default_args",
310
336
  "get_func_parameters",
311
- "get_impls",
337
+ "get_polymorphic_implementations",
312
338
  "impl",
313
339
  "join_dicts",
314
340
  "magic_bundle",
@@ -1,35 +1,36 @@
1
- Metadata-Version: 2.3
1
+ Metadata-Version: 2.4
2
2
  Name: telegrinder
3
- Version: 0.4.0
3
+ Version: 0.4.2
4
4
  Summary: Modern visionary telegram bot framework.
5
+ Project-URL: Source, https://github.com/timoniq/telegrinder
6
+ Project-URL: Bug Tracker, https://github.com/timoniq/telegrinder/issues
7
+ Project-URL: Documentation, https://telegrinder.readthedocs.io/en/latest/
8
+ Author-email: timoniq <tesseradecades@mail.ru>
9
+ Maintainer-email: luwqz1 <howluwqz1@gmail.com>
5
10
  License: MIT License
6
-
7
- Copyright (c) 2022-2025 timoniq
8
- Copyright (c) 2024-2025 luwqz1
9
-
10
- Permission is hereby granted, free of charge, to any person obtaining a copy
11
- of this software and associated documentation files (the "Software"), to deal
12
- in the Software without restriction, including without limitation the rights
13
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
14
- copies of the Software, and to permit persons to whom the Software is
15
- furnished to do so, subject to the following conditions:
16
-
17
- The above copyright notice and this permission notice shall be included in all
18
- copies or substantial portions of the Software.
19
-
20
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
23
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
25
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
26
- SOFTWARE.
27
- Keywords: asyncio,api schema,async,bot building,bot api,custom rules,telegram,telegram bot api framework,telegrinder framework,middleware,composition,framework,telegrinder,waiter machine
28
- Author: timoniq
29
- Author-email: tesseradecades@mail.ru
30
- Maintainer: luwqz1
31
- Maintainer-email: howluwqz1@gmail.com
32
- Requires-Python: >=3.12,<4.0
11
+
12
+ Copyright (c) 2022-2025 timoniq
13
+ Copyright (c) 2024-2025 luwqz1
14
+
15
+ Permission is hereby granted, free of charge, to any person obtaining a copy
16
+ of this software and associated documentation files (the "Software"), to deal
17
+ in the Software without restriction, including without limitation the rights
18
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
19
+ copies of the Software, and to permit persons to whom the Software is
20
+ furnished to do so, subject to the following conditions:
21
+
22
+ The above copyright notice and this permission notice shall be included in all
23
+ copies or substantial portions of the Software.
24
+
25
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
26
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
27
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
28
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
29
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
30
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
31
+ SOFTWARE.
32
+ License-File: LICENSE
33
+ Keywords: api schema,async,asyncio,bot api,bot building,composition,custom rules,framework,middleware,telegram,telegram bot api framework,telegrinder,telegrinder framework,waiter machine
33
34
  Classifier: Environment :: Console
34
35
  Classifier: Intended Audience :: Developers
35
36
  Classifier: License :: OSI Approved :: MIT License
@@ -38,28 +39,25 @@ Classifier: Programming Language :: Python :: 3.13
38
39
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
39
40
  Classifier: Topic :: Software Development :: Quality Assurance
40
41
  Classifier: Typing :: Typed
42
+ Requires-Python: <4.0,>=3.12
43
+ Requires-Dist: aiohttp<4.0.0,>=3.11.14
44
+ Requires-Dist: certifi>=2025.1.31
45
+ Requires-Dist: choicelib<0.2.0,>=0.1.5
46
+ Requires-Dist: colorama<0.5.0,>=0.4.6
47
+ Requires-Dist: envparse<0.3.0,>=0.2.0
48
+ Requires-Dist: fntypes<0.2.0,>=0.1.4.post3
49
+ Requires-Dist: msgspec<0.20.0,>=0.19.0
50
+ Requires-Dist: typing-extensions<5.0.0,>=4.12.2
51
+ Requires-Dist: vbml<2.0,>=1.1.post1
41
52
  Provides-Extra: all
53
+ Requires-Dist: loguru>=0.7.0; extra == 'all'
54
+ Requires-Dist: uvloop>=0.21.0; extra == 'all'
42
55
  Provides-Extra: fast
56
+ Requires-Dist: uvloop>=0.21.0; extra == 'fast'
43
57
  Provides-Extra: loguru
58
+ Requires-Dist: loguru>=0.7.0; extra == 'loguru'
44
59
  Provides-Extra: uvloop
45
- Requires-Dist: aiohttp (>=3.11.11,<4.0.0)
46
- Requires-Dist: certifi (>=2025.1.31)
47
- Requires-Dist: choicelib (>=0.1.5,<0.2.0)
48
- Requires-Dist: colorama (>=0.4.6,<0.5.0)
49
- Requires-Dist: envparse (>=0.2.0,<0.3.0)
50
- Requires-Dist: fntypes (>=0.1.4.post3,<0.2.0)
51
- Requires-Dist: loguru (>=0.7.0) ; extra == "all"
52
- Requires-Dist: loguru (>=0.7.0) ; extra == "loguru"
53
- Requires-Dist: msgspec (>=0.19.0,<0.20.0)
54
- Requires-Dist: pyyaml (>=6.0.2,<7.0.0)
55
- Requires-Dist: typing-extensions (>=4.12.2,<5.0.0)
56
- Requires-Dist: uvloop (>=0.21.0) ; extra == "all"
57
- Requires-Dist: uvloop (>=0.21.0) ; extra == "fast"
58
- Requires-Dist: uvloop (>=0.21.0) ; extra == "uvloop"
59
- Requires-Dist: vbml (>=1.1.post1,<2.0)
60
- Project-URL: Bug Tracker, https://github.com/timoniq/telegrinder/issues
61
- Project-URL: Documentation, https://telegrinder.readthedocs.io/en/latest/
62
- Project-URL: Source, https://github.com/timoniq/telegrinder
60
+ Requires-Dist: uvloop>=0.21.0; extra == 'uvloop'
63
61
  Description-Content-Type: text/markdown
64
62
 
65
63
  # Telegrinder
@@ -84,17 +82,26 @@ pip install telegrinder
84
82
  ```
85
83
 
86
84
  Using poetry:
87
-
88
85
  ```console
89
86
  poetry add telegrinder
90
87
  ```
91
88
 
89
+ Using uv:
90
+
91
+ ```console
92
+ uv add telegrinder
93
+ ```
94
+
92
95
  Install from github:
93
96
 
94
97
  ```console
95
98
  pip install -U https://github.com/timoniq/telegrinder/archive/dev.zip
96
99
  ```
97
100
 
101
+ ```console
102
+ uv add "telegrinder @ git+https://github.com/timoniq/telegrinder.git@dev"
103
+ ```
104
+
98
105
  ```console
99
106
  poetry add git+https://github.com/timoniq/telegrinder.git#dev
100
107
  ```
@@ -112,7 +119,7 @@ logger.set_level("INFO")
112
119
 
113
120
 
114
121
  @bot.on.message(Text("/start"))
115
- async def start(message: Message):
122
+ async def start(message: Message) -> None:
116
123
  me = (await api.get_me()).unwrap()
117
124
  await message.answer(f"Hello, {message.from_user.full_name}! I'm {me.full_name}.")
118
125
 
@@ -138,7 +145,7 @@ Copyright © 2024-2025 [luwqz1](https://github.com/luwqz1)
138
145
 
139
146
  # Contributors
140
147
 
148
+
141
149
  <a href="https://github.com/timoniq/telegrinder/graphs/contributors">
142
150
  <img src="https://contributors-img.web.app/image?repo=timoniq/telegrinder" />
143
151
  </a>
144
-
@@ -1,4 +1,11 @@
1
- telegrinder/__init__.py,sha256=4z_tgGLiF8GxKmnxmny6yu4J9iGclNtW17cQmooYhj0,5933
1
+ telegrinder/__init__.py,sha256=Gp0nHwVBqk024sFO40CVWgbtnKG2WYG-2czdlmO6zXA,5941
2
+ telegrinder/model.py,sha256=CrN2XOMG_rPFN5jF-QQeNGyepwT3DuBzWLm7oqIMajI,6106
3
+ telegrinder/modules.py,sha256=XcEIjz67xAKcYQfNVIm4VfidMa3M43iDcfUaX6QKFX8,7826
4
+ telegrinder/msgspec_json.py,sha256=eDuRTP_bFYWtNPDINuzY2OGKXbdleaKyXh2mQgfJdMk,237
5
+ telegrinder/msgspec_utils.py,sha256=PYs3-qQ0HoP4JzDg-8c0gC0ZIe-UmMkTHhOBnPWEIfQ,14303
6
+ telegrinder/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
+ telegrinder/rules.py,sha256=BFB8RFwKKxqs9HFfo_p0RfulQNonPZAX8cHpmnG7qCU,39
8
+ telegrinder/verification_utils.py,sha256=Tp-XEp5nu4ih67jbrgU5USSNRgzlILMrfKgfGENYBtg,985
2
9
  telegrinder/api/__init__.py,sha256=RuqIF0RsCEGZth6Nc8_6lOYxr9e50Bx5OiR212U3XwU,264
3
10
  telegrinder/api/api.py,sha256=DqeSvQcHKVbvkAv7o6r2wCVZM2fcox1DfKHiUWlgggY,3417
4
11
  telegrinder/api/error.py,sha256=tYgJtqDakXO2ef_MvhTmNuWALktefpVlyJMfXM0Btg8,440
@@ -7,7 +14,7 @@ telegrinder/api/token.py,sha256=q2wP2GNy14LdNA3kHBJtSw3-bHZ0ADm_ASesbVWQXSE,951
7
14
  telegrinder/bot/__init__.py,sha256=c8vMIjXEOZIuRccrxlRpcpbr-HzvMKxe6HrrIKlH8NM,2945
8
15
  telegrinder/bot/bot.py,sha256=jx4ZJHBFSMCTUDgsv0fFocEr6Ti9foEnROB9sYTkyQY,3134
9
16
  telegrinder/bot/cute_types/__init__.py,sha256=zytO2K8RuTjlhojRJlfApae9YSOu39GWsAwdffaok-I,746
10
- telegrinder/bot/cute_types/base.py,sha256=f9ItBY_r4UYGAYmgSsUMXmIcGY9e9oEhn3_1z_djnh8,6417
17
+ telegrinder/bot/cute_types/base.py,sha256=kkzYW4fntazqe3n3KH8aETgT-yAyVWW15agCWiQWDeI,6422
11
18
  telegrinder/bot/cute_types/callback_query.py,sha256=vWnyO7dNJ_7EBYmVwurzDC606RS_99inwP9nK_6gGDo,19499
12
19
  telegrinder/bot/cute_types/chat_join_request.py,sha256=LWs8Vta27czrZxFtKu8TkjVE4_n9s7H_OLk6r6tyJh4,2056
13
20
  telegrinder/bot/cute_types/chat_member_updated.py,sha256=oVvQ12FSFSL9UC87r7fPuhDv0kOzk7LC8dvXZKKbVus,6251
@@ -20,12 +27,13 @@ telegrinder/bot/dispatch/__init__.py,sha256=agSk03df-VD9Odo8JqfgF8lzW8JWcaXhv3a6
20
27
  telegrinder/bot/dispatch/abc.py,sha256=8BaLdmupx7Ch0zd5g6jwcTLdidKPFZVaL3kGpzLjpeE,2341
21
28
  telegrinder/bot/dispatch/context.py,sha256=-_beXNZ82zpccDOMwO8_WK5_UcXBR6JebnqowOBk570,2727
22
29
  telegrinder/bot/dispatch/dispatch.py,sha256=bK0IQeo0UZ_wYJccrNYLTHA481yV1l7OfPyPgYO1V60,7899
30
+ telegrinder/bot/dispatch/process.py,sha256=-gZ8BjMti1HXCDQmrnimwOULujJJlk0aKTSpa6QRDHs,4716
23
31
  telegrinder/bot/dispatch/handler/__init__.py,sha256=PL17gyh9u9fHHz1yTglyBpRGoioqdMD5UxFAtmTidC0,911
24
32
  telegrinder/bot/dispatch/handler/abc.py,sha256=JKLxHaxq9YjBe4xs1_fMYfMRy7U8TJNGtgmbtY0l0Ao,596
25
33
  telegrinder/bot/dispatch/handler/audio_reply.py,sha256=MZkWROKdugRcu02-HHq_p8ZsCGxKLkrLJdZmfeOj98g,1340
26
34
  telegrinder/bot/dispatch/handler/base.py,sha256=xrM6K4PNxwh37s_L6Y-9M7phaEkU9k1Bx5BQnur8kWE,1780
27
35
  telegrinder/bot/dispatch/handler/document_reply.py,sha256=YYcC_4658eN56hlNgGPU2J8WQM6r53TPnHkYpUp4aHQ,1367
28
- telegrinder/bot/dispatch/handler/func.py,sha256=k96tOnRLjcloKg4vN4grcOmUJXQXZVui58DcgtFeJbE,4980
36
+ telegrinder/bot/dispatch/handler/func.py,sha256=5CjSVEsr6NQHffHGLPZ7qN1qmMX4eV-5BEEjTpFSMfY,4997
29
37
  telegrinder/bot/dispatch/handler/media_group_reply.py,sha256=57Mqun52VsJblkde8IiSYZF-yBrSwpiqe3nDv0xFsd8,1401
30
38
  telegrinder/bot/dispatch/handler/message_reply.py,sha256=E5aH3omcdhxrxe98ysrJcoJtZR7mAYP8T859cS0k3UM,1119
31
39
  telegrinder/bot/dispatch/handler/photo_reply.py,sha256=iyfNeCLgn3j6wyEIcJqUyAoUT6kur0DHtbGFLymHEZI,1340
@@ -34,7 +42,6 @@ telegrinder/bot/dispatch/handler/video_reply.py,sha256=kqwJHxFNQ2_foWzZ59QgX2VEE
34
42
  telegrinder/bot/dispatch/middleware/__init__.py,sha256=znQGQ0jnBioEXr-2RPHOkmDbjei4LEbaTjgiE9c8aXI,96
35
43
  telegrinder/bot/dispatch/middleware/abc.py,sha256=CkZc3uW2IAZAFAdb37Cc2ViAe2kfnQ07wubjLDFsPlY,3208
36
44
  telegrinder/bot/dispatch/middleware/global_middleware.py,sha256=6k4dY8ax5djqQ0KBlO8F-rK86VGh6sK_VQjMFygQbFI,2523
37
- telegrinder/bot/dispatch/process.py,sha256=-gZ8BjMti1HXCDQmrnimwOULujJJlk0aKTSpa6QRDHs,4716
38
45
  telegrinder/bot/dispatch/return_manager/__init__.py,sha256=ubhWS1MUT0928-KYNZLyM8CKFwTtXoh1QVUf4Xh9V-w,728
39
46
  telegrinder/bot/dispatch/return_manager/abc.py,sha256=PK8p2rHNR_7RNIAsFNWbgtN_xfYj_LqDkOA8xQ_1emg,3619
40
47
  telegrinder/bot/dispatch/return_manager/callback_query.py,sha256=x7FT1PioR6USsfeyNVyy8mWvP4Vkq-sysIl1OpZm-fI,722
@@ -54,14 +61,14 @@ telegrinder/bot/dispatch/view/pre_checkout_query.py,sha256=EMEISukuS45J4a_1UH_rR
54
61
  telegrinder/bot/dispatch/view/raw.py,sha256=HD1iRuRqNw_6dRa-eO2SGR1j_4E_-AjHYUI07b9RS_E,3858
55
62
  telegrinder/bot/dispatch/waiter_machine/__init__.py,sha256=2I3MQpTAVFCHoHJUxAPCWUyasGOkdGSBKRETiTLgBpg,862
56
63
  telegrinder/bot/dispatch/waiter_machine/actions.py,sha256=omU5poxjDz9D800Zu4GjXPOW44m4-UqJ8pO9FjRV8iQ,376
64
+ telegrinder/bot/dispatch/waiter_machine/machine.py,sha256=uI_tx8VsbVAjHg-NK5ZlGsWVGIyvYcRj2hXTJrkXrKk,9012
65
+ telegrinder/bot/dispatch/waiter_machine/middleware.py,sha256=9uULMp-oF_WSOfU1jQk-D5F1pixmO0i1zj0VdfW5jXc,3075
66
+ telegrinder/bot/dispatch/waiter_machine/short_state.py,sha256=rBLkSgSQvHAO-9XkL5ScAu2gjf42NxOrkJV2tRR64Kk,1739
57
67
  telegrinder/bot/dispatch/waiter_machine/hasher/__init__.py,sha256=nu0WhOWmGkhybOP-faiAFEx1nlYo_N_LW2AuAmbC_Z0,497
58
68
  telegrinder/bot/dispatch/waiter_machine/hasher/callback.py,sha256=W-caGejmYBRx-yWdUPH-D54yPPBtESrroNLyVog8e2I,1587
59
69
  telegrinder/bot/dispatch/waiter_machine/hasher/hasher.py,sha256=EHBdcAJEeB7_AA0RnLc8JogsEVy82Y-U4kktk3fAs5g,1845
60
70
  telegrinder/bot/dispatch/waiter_machine/hasher/message.py,sha256=NoT2BaTrHVnyaaXsXTkf8riJZp8473-T3EXNri4y70I,1253
61
71
  telegrinder/bot/dispatch/waiter_machine/hasher/state.py,sha256=D1j8H8XwML0nPPYcDBy9QWM5OAXi3mch5ElUOo7-RmA,677
62
- telegrinder/bot/dispatch/waiter_machine/machine.py,sha256=uI_tx8VsbVAjHg-NK5ZlGsWVGIyvYcRj2hXTJrkXrKk,9012
63
- telegrinder/bot/dispatch/waiter_machine/middleware.py,sha256=9uULMp-oF_WSOfU1jQk-D5F1pixmO0i1zj0VdfW5jXc,3075
64
- telegrinder/bot/dispatch/waiter_machine/short_state.py,sha256=rBLkSgSQvHAO-9XkL5ScAu2gjf42NxOrkJV2tRR64Kk,1739
65
72
  telegrinder/bot/polling/__init__.py,sha256=OqfIFPS_V6UrCg-vCv9pkMFzTKdNbDP2faBfATs_TGg,94
66
73
  telegrinder/bot/polling/abc.py,sha256=qFiKzWTWENK-sSuShC5cPlM-JS4In2c8-1_ARdwdTms,442
67
74
  telegrinder/bot/polling/polling.py,sha256=76YLN_MN85UF69LBNDzihRAz04cnUchtxL8n8SmtoZo,5514
@@ -94,16 +101,12 @@ telegrinder/bot/rules/update.py,sha256=-mE12-xy0AjOz9RVRVZ8vS7ohGCuf_bNmG26rDbrj
94
101
  telegrinder/bot/scenario/__init__.py,sha256=nnPjdxdvjoEYYMRUEfWvIhZStiY1C984x1azdRRP9II,136
95
102
  telegrinder/bot/scenario/abc.py,sha256=ZjcHJyVuUeNKHIHWd_3bNBxuklNMLM-HsBadLnDVzm8,409
96
103
  telegrinder/bot/scenario/checkbox.py,sha256=4vfpbRMUFxa06ZKfYcIsVOH6-UWhAn4MjhmU9kGOVAc,5174
97
- telegrinder/bot/scenario/choice.py,sha256=zBNbbx8NfFak3KU7QpFHmcoLkdakrahlXZ-yOJvdmw4,1770
104
+ telegrinder/bot/scenario/choice.py,sha256=VOuIrDGnX2IMrU11TMYp_9VIyhc0EAOUvqYP99Fp1Jk,1706
98
105
  telegrinder/client/__init__.py,sha256=2TfRdGAokRyuQhwu09u0KAXc9cLIch9WJtBIjgj49yg,281
99
106
  telegrinder/client/abc.py,sha256=rEDgfuo8dufkCY5o9ijgDawAmEuhzGDNj9WrdqUUMA8,2431
100
107
  telegrinder/client/aiohttp.py,sha256=v5R-WZS8AwaypHsY12jT6VbI9GN763O0y69DYA3qZZ0,3932
101
108
  telegrinder/client/form_data.py,sha256=XpSrM6b42lnoUDR7rnFko7agDzjnuChrCyjp-cACGHE,689
102
109
  telegrinder/client/sonic.py,sha256=MZ1ZdVUlwoXkKrfzaV08n4q0M3IYfHKd3UGttVcfK8g,6523
103
- telegrinder/model.py,sha256=CrN2XOMG_rPFN5jF-QQeNGyepwT3DuBzWLm7oqIMajI,6106
104
- telegrinder/modules.py,sha256=XcEIjz67xAKcYQfNVIm4VfidMa3M43iDcfUaX6QKFX8,7826
105
- telegrinder/msgspec_json.py,sha256=eDuRTP_bFYWtNPDINuzY2OGKXbdleaKyXh2mQgfJdMk,237
106
- telegrinder/msgspec_utils.py,sha256=AbaBcKJWLqjzYtORSDzCuMHpOKEDBxFtcTrAX4L6REE,14339
107
110
  telegrinder/node/__init__.py,sha256=WbargilSBjZHE1CUKZzbjZpZx5hl_XOw565Ecy4PRCk,2268
108
111
  telegrinder/node/attachment.py,sha256=ocSUsqnPJEIq5aaj5-xKbKmoifnoA1fhlp2brZLJgXY,4857
109
112
  telegrinder/node/base.py,sha256=xlqwSPuwDc5FCr-1cJkAafW2_NlZm0o2nAQI7_wYPsQ,8249
@@ -116,25 +119,31 @@ telegrinder/node/event.py,sha256=KItU-Pf7mT-ztTnVethqd63hkwwOTnqB6smasxRwk00,184
116
119
  telegrinder/node/file.py,sha256=88fS9tDfGpElrqEb1ejY-kpfc0dPkgZMHFNN_wpavO8,1430
117
120
  telegrinder/node/me.py,sha256=mBP1i1Jto0XMS9ZYgfRtte9QPfrak0ARgBDJvGQ6CX4,414
118
121
  telegrinder/node/payload.py,sha256=Z3rjzux4oB6OKNK0kB7JALp6hclxF174N8WUj3l6FnE,2706
119
- telegrinder/node/polymorphic.py,sha256=EJ25etzPtlfJa0p4oufPvb2jZJ7d9-zq-PI7zkDrQpQ,2621
122
+ telegrinder/node/polymorphic.py,sha256=S6nnB8PkqIllCTN7x1G_M5bs9jx2OUCFfFWTOAwONAA,2665
120
123
  telegrinder/node/rule.py,sha256=pwCHC7Z2IRR-q7ewDB_cjCmbYJsdkftF0QD4r889HQs,2381
121
124
  telegrinder/node/scope.py,sha256=tq9TyKyUeiRl0WpAyBAVTBdF9pKC_z0X0MxuxwLBQ8M,734
122
125
  telegrinder/node/source.py,sha256=pUBICRo8bkcgzdUW60cy6fsmjAZGv2efBhaQWHTp2Y0,2691
123
126
  telegrinder/node/text.py,sha256=vx9gQscBAqwG0e5zm9p1bt6D7yMnp1JS_NWbuZe4Rrw,1379
124
127
  telegrinder/node/tools/__init__.py,sha256=iyjs82g3brYGzpPsUQaoK6_r7YuQhRkJ61YjjuPOx9E,67
125
128
  telegrinder/node/tools/generator.py,sha256=4zbAASQmSJGiEPBWbHh1F0mXJrCuc4oXHI-kB51I3qQ,973
126
- telegrinder/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
127
- telegrinder/rules.py,sha256=BFB8RFwKKxqs9HFfo_p0RfulQNonPZAX8cHpmnG7qCU,39
128
- telegrinder/tools/__init__.py,sha256=Kz1VABWRQqT50bt5c9U85Ot9VWd5NSBh8MdQV7pzi5Q,4444
129
+ telegrinder/tools/__init__.py,sha256=9PkcZsbdHbmQ_2-F_OVQeuBcUYwDFyiU8hnJt8mr5pY,4488
130
+ telegrinder/tools/buttons.py,sha256=Ez99XgIcg4_6mtdDvkN0Uq4VkcpgcGE1cufSitXe61A,3904
131
+ telegrinder/tools/functional.py,sha256=pkCVxLIyOLlO-hVtT5xz7LLFdLFbwQ7a0NTqhLV2jJs,201
132
+ telegrinder/tools/input_file_directory.py,sha256=F77qMxG7reK8VX6rnHKbYZhzQAzw229Q20K8q0CF0cw,839
133
+ telegrinder/tools/keyboard.py,sha256=BvxGs6RvXpqbWBEUVqKKij-Nw4acgXpH7u7fU_N9rP0,3791
134
+ telegrinder/tools/lifespan.py,sha256=2-vGm8Jb9Hpx0mvhWRpSvIRiibtAPJnYSQuAE-QEo-A,3199
135
+ telegrinder/tools/limited_dict.py,sha256=ySot8-lVd0XkRcxl_R9dvTb0g8OfspsbSXQdlB7mVgo,1039
136
+ telegrinder/tools/magic.py,sha256=z6soR2gU_FlxO5MhDbJg2_aQi6BUTEuGRRA5mQVaV2c,10122
137
+ telegrinder/tools/parse_mode.py,sha256=JyQ-x9YAMPLhIIiUX01acyKkpWgs5TBA07W-iUyPHpE,92
138
+ telegrinder/tools/strings.py,sha256=rb8tAmEqkkJnEAIVqME1LpV4GICBZ2IbfUJ_nd7F2Mo,285
129
139
  telegrinder/tools/adapter/__init__.py,sha256=ZOnQl0uu7UGshKKopH5ZkFtg5N-LMrI8FXwIVTMuNDw,633
130
140
  telegrinder/tools/adapter/abc.py,sha256=vq1Q8PzdjtkiJPtjuFg9UJJxcnlvaABlUxTy4NCGOOw,1333
131
141
  telegrinder/tools/adapter/dataclass.py,sha256=x6xAjHB8CngwhDbOxIupgzusiP0RXtRH2z4diz4drm8,2232
132
142
  telegrinder/tools/adapter/errors.py,sha256=2r_UBTWm5-heU-NchBfobC1f848EWeC64nKvprGnAAY,73
133
- telegrinder/tools/adapter/event.py,sha256=H-V43ghLAmwjhChfk-AwMHAm_-TlWOQlYgkoU34WRbs,2393
143
+ telegrinder/tools/adapter/event.py,sha256=1O3Y10JJh4NekmaXLu5z3JyB9L-4G9CyFu3ffoWZcxw,2369
134
144
  telegrinder/tools/adapter/node.py,sha256=APX_hXf5R16vPULvfUlhh9jr9X4q_aFSyItDKstlXdM,1572
135
145
  telegrinder/tools/adapter/raw_event.py,sha256=Ve2ziMogw533B8K_DXRBpqQGnjnjGFXu7qeYiF-stc0,975
136
146
  telegrinder/tools/adapter/raw_update.py,sha256=o-posiO4C_YRMi2KXYGjRKdKJM0wOke90x5aYPB9ZGE,997
137
- telegrinder/tools/buttons.py,sha256=Ez99XgIcg4_6mtdDvkN0Uq4VkcpgcGE1cufSitXe61A,3904
138
147
  telegrinder/tools/callback_data_serilization/__init__.py,sha256=mavF_sXLzhcF2xZ00Z2_jbKzAc2xx4xDUTCMNJUJL8I,187
139
148
  telegrinder/tools/callback_data_serilization/abc.py,sha256=OgzpVKw12kbabTxzoNid0a1mrjb1GYvYyYp0BU4TYik,1232
140
149
  telegrinder/tools/callback_data_serilization/json_ser.py,sha256=gjgOJMcTmahqZUEOjZatgsqmSFi7BAyOy20FErmlxJE,1952
@@ -147,36 +156,27 @@ telegrinder/tools/formatting/__init__.py,sha256=-OwOBkYwg3Dj7fL5gKpTSMDLb2rRmLHW
147
156
  telegrinder/tools/formatting/deep_links.py,sha256=o9bE3sADuTt_DluGR6yqQ3GLBFxXODeI1r3LUqEReDU,19576
148
157
  telegrinder/tools/formatting/html_formatter.py,sha256=5r2lryBksrarn9Ejt4mp_0ZZHd8CX310Six82wn1BjM,7854
149
158
  telegrinder/tools/formatting/spec_html_formats.py,sha256=YyppEtrgwRTrjK8h5nwIIYaPQXGovYEXarMpk5EPNKs,1542
150
- telegrinder/tools/functional.py,sha256=pkCVxLIyOLlO-hVtT5xz7LLFdLFbwQ7a0NTqhLV2jJs,201
151
159
  telegrinder/tools/global_context/__init__.py,sha256=5pF9growKd28WO739wk_DZUqCDw5hxs6eUcDtxTosX8,290
152
160
  telegrinder/tools/global_context/abc.py,sha256=twwAmbTk49KGl_POImr4yj6POr-zdx8mz74McuphZH0,1644
153
161
  telegrinder/tools/global_context/global_context.py,sha256=ddKLJyyczORxqb3AbAGG6YeYfV2mL55TNehG6NZMk_E,13626
154
162
  telegrinder/tools/global_context/telegrinder_ctx.py,sha256=lEbJqgC0Ex3Cgeu3ufqbD-iVlGRNiB37N1Hto3wmf0Y,707
155
163
  telegrinder/tools/i18n/__init__.py,sha256=jMrrdFexgMU-BUiKf-p22VowQaqtQeaCb-Cs0fq2Tls,287
156
164
  telegrinder/tools/i18n/abc.py,sha256=jxJVYiTplJaNeklkGiin-m7BkfZiac2fbVXTEdhNw6o,726
165
+ telegrinder/tools/i18n/simple.py,sha256=w2SlMKYqJbDK9ScTwCAB6pdskqwtmqV7pK8yEhSUFDA,1564
157
166
  telegrinder/tools/i18n/middleware/__init__.py,sha256=a0yJUYmDbl1Mqf_cWx2TTmA3_Andlk8ixLJyDYAA23I,81
158
167
  telegrinder/tools/i18n/middleware/abc.py,sha256=RQLDDEGXseaf2E4XGvtof_2CxhOzHnMLXMvhb6PkWg8,701
159
- telegrinder/tools/i18n/simple.py,sha256=w2SlMKYqJbDK9ScTwCAB6pdskqwtmqV7pK8yEhSUFDA,1564
160
- telegrinder/tools/input_file_directory.py,sha256=F77qMxG7reK8VX6rnHKbYZhzQAzw229Q20K8q0CF0cw,839
161
- telegrinder/tools/keyboard.py,sha256=BvxGs6RvXpqbWBEUVqKKij-Nw4acgXpH7u7fU_N9rP0,3791
162
- telegrinder/tools/lifespan.py,sha256=2-vGm8Jb9Hpx0mvhWRpSvIRiibtAPJnYSQuAE-QEo-A,3199
163
- telegrinder/tools/limited_dict.py,sha256=ySot8-lVd0XkRcxl_R9dvTb0g8OfspsbSXQdlB7mVgo,1039
164
168
  telegrinder/tools/loop_wrapper/__init__.py,sha256=ZQ5jmE1lOKnqJlMZ9k2OYmjvOEhOlHPijUWqZ4nHIgk,165
165
169
  telegrinder/tools/loop_wrapper/abc.py,sha256=aZG2OGoQKLUxeO6WZ_gluFAjRHubeMfKxmKeIG7isYI,383
166
170
  telegrinder/tools/loop_wrapper/loop_wrapper.py,sha256=t31AYkk1S_uyoq4MJMQCkoC6_fSvfON3NjBBKEuQy5U,5160
167
- telegrinder/tools/magic.py,sha256=hDarnKUfo3bzbPQSAttt4BY3wyT0KJ8a1nyXNNTJmlE,9295
168
- telegrinder/tools/parse_mode.py,sha256=JyQ-x9YAMPLhIIiUX01acyKkpWgs5TBA07W-iUyPHpE,92
169
171
  telegrinder/tools/state_storage/__init__.py,sha256=G2EK2HwS0NbRQIu0OotVlgEYtO_GuzN1aJOIxmDEtz4,211
170
172
  telegrinder/tools/state_storage/abc.py,sha256=GufeznJI1AF2Cl0D6J3MW94UvsL_QHuOnlEc1lqQNss,878
171
173
  telegrinder/tools/state_storage/memory.py,sha256=nbCHHhN3YmjvnbrS_5cLvwrkuJgFA0qGVuAsqhBGNyY,740
172
- telegrinder/tools/strings.py,sha256=rb8tAmEqkkJnEAIVqME1LpV4GICBZ2IbfUJ_nd7F2Mo,285
173
174
  telegrinder/types/__init__.py,sha256=9uF3fmerYcpt0B_3ycj-2AoAv-KVShlUAAaePo65wfY,6844
174
175
  telegrinder/types/enums.py,sha256=xK3_4GrM5U3mIezwgzvu-C7Xx_GUQqfQRGEDPaURiec,19060
175
176
  telegrinder/types/input_file.py,sha256=xwzag5QvhAUAraw_qeoOQjG6Qqf72GLtQKbHB6VUblI,1440
176
177
  telegrinder/types/methods.py,sha256=D45Ou7BrNRqCGRGpatBnMGoM7ZbsXTHq42EBb7ZasrM,219112
177
178
  telegrinder/types/objects.py,sha256=jZCyM1-A6msV9XZQcVqVN-pEh_P1qw62kj2Xh-caycU,299955
178
- telegrinder/verification_utils.py,sha256=Tp-XEp5nu4ih67jbrgU5USSNRgzlILMrfKgfGENYBtg,985
179
- telegrinder-0.4.0.dist-info/LICENSE,sha256=mKmh92w0b8JKW6Z72AJ00ZtKS_9ZhTH7uevlEspyVD4,1100
180
- telegrinder-0.4.0.dist-info/METADATA,sha256=QAxTK-_--RbCTfR9tKXFSx9bg9g3qXKfsTV1VuBXdic,4879
181
- telegrinder-0.4.0.dist-info/WHEEL,sha256=XbeZDeTWKc1w7CSIyre5aMDU_-PohRwTQceYnisIYYY,88
182
- telegrinder-0.4.0.dist-info/RECORD,,
179
+ telegrinder-0.4.2.dist-info/METADATA,sha256=oL_EoJvJucIYBRfonzaYHiYqRqxCnSFaUJnGd8ZywJM,4921
180
+ telegrinder-0.4.2.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
181
+ telegrinder-0.4.2.dist-info/licenses/LICENSE,sha256=mKmh92w0b8JKW6Z72AJ00ZtKS_9ZhTH7uevlEspyVD4,1100
182
+ telegrinder-0.4.2.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: poetry-core 2.1.1
2
+ Generator: hatchling 1.27.0
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any