telegrinder 0.1.dev169__py3-none-any.whl → 0.1.dev171__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.

Files changed (79) hide show
  1. telegrinder/api/abc.py +7 -1
  2. telegrinder/api/api.py +12 -3
  3. telegrinder/api/error.py +2 -1
  4. telegrinder/bot/bot.py +6 -1
  5. telegrinder/bot/cute_types/base.py +144 -17
  6. telegrinder/bot/cute_types/callback_query.py +6 -1
  7. telegrinder/bot/cute_types/chat_member_updated.py +1 -2
  8. telegrinder/bot/cute_types/message.py +23 -11
  9. telegrinder/bot/cute_types/update.py +48 -0
  10. telegrinder/bot/cute_types/utils.py +2 -465
  11. telegrinder/bot/dispatch/__init__.py +2 -3
  12. telegrinder/bot/dispatch/abc.py +6 -3
  13. telegrinder/bot/dispatch/context.py +6 -6
  14. telegrinder/bot/dispatch/dispatch.py +61 -23
  15. telegrinder/bot/dispatch/handler/abc.py +2 -2
  16. telegrinder/bot/dispatch/handler/func.py +36 -17
  17. telegrinder/bot/dispatch/handler/message_reply.py +2 -2
  18. telegrinder/bot/dispatch/middleware/abc.py +2 -2
  19. telegrinder/bot/dispatch/process.py +10 -10
  20. telegrinder/bot/dispatch/return_manager/abc.py +3 -3
  21. telegrinder/bot/dispatch/view/abc.py +12 -15
  22. telegrinder/bot/dispatch/view/box.py +73 -62
  23. telegrinder/bot/dispatch/view/message.py +11 -3
  24. telegrinder/bot/dispatch/view/raw.py +3 -0
  25. telegrinder/bot/dispatch/waiter_machine/machine.py +2 -2
  26. telegrinder/bot/dispatch/waiter_machine/middleware.py +1 -1
  27. telegrinder/bot/dispatch/waiter_machine/short_state.py +2 -1
  28. telegrinder/bot/polling/polling.py +3 -3
  29. telegrinder/bot/rules/abc.py +11 -7
  30. telegrinder/bot/rules/adapter/event.py +7 -4
  31. telegrinder/bot/rules/adapter/node.py +1 -1
  32. telegrinder/bot/rules/command.py +5 -7
  33. telegrinder/bot/rules/func.py +1 -1
  34. telegrinder/bot/rules/fuzzy.py +1 -1
  35. telegrinder/bot/rules/integer.py +1 -2
  36. telegrinder/bot/rules/markup.py +3 -3
  37. telegrinder/bot/rules/message_entities.py +1 -1
  38. telegrinder/bot/rules/node.py +2 -2
  39. telegrinder/bot/rules/regex.py +1 -1
  40. telegrinder/bot/rules/rule_enum.py +1 -1
  41. telegrinder/bot/scenario/checkbox.py +2 -2
  42. telegrinder/model.py +87 -47
  43. telegrinder/modules.py +3 -3
  44. telegrinder/msgspec_utils.py +94 -13
  45. telegrinder/node/__init__.py +20 -11
  46. telegrinder/node/attachment.py +19 -16
  47. telegrinder/node/base.py +120 -24
  48. telegrinder/node/callback_query.py +5 -9
  49. telegrinder/node/command.py +6 -2
  50. telegrinder/node/composer.py +82 -54
  51. telegrinder/node/container.py +4 -4
  52. telegrinder/node/event.py +59 -0
  53. telegrinder/node/me.py +3 -0
  54. telegrinder/node/message.py +6 -10
  55. telegrinder/node/polymorphic.py +11 -12
  56. telegrinder/node/rule.py +27 -5
  57. telegrinder/node/source.py +10 -11
  58. telegrinder/node/text.py +4 -4
  59. telegrinder/node/update.py +1 -2
  60. telegrinder/py.typed +0 -0
  61. telegrinder/tools/__init__.py +2 -2
  62. telegrinder/tools/buttons.py +5 -10
  63. telegrinder/tools/error_handler/error.py +2 -0
  64. telegrinder/tools/error_handler/error_handler.py +1 -1
  65. telegrinder/tools/formatting/spec_html_formats.py +10 -10
  66. telegrinder/tools/global_context/__init__.py +2 -2
  67. telegrinder/tools/global_context/global_context.py +2 -2
  68. telegrinder/tools/global_context/telegrinder_ctx.py +4 -4
  69. telegrinder/tools/keyboard.py +2 -2
  70. telegrinder/tools/loop_wrapper/loop_wrapper.py +39 -5
  71. telegrinder/tools/magic.py +48 -15
  72. telegrinder/types/enums.py +1 -0
  73. telegrinder/types/methods.py +14 -5
  74. telegrinder/types/objects.py +3 -0
  75. {telegrinder-0.1.dev169.dist-info → telegrinder-0.1.dev171.dist-info}/METADATA +2 -2
  76. telegrinder-0.1.dev171.dist-info/RECORD +145 -0
  77. telegrinder-0.1.dev169.dist-info/RECORD +0 -143
  78. {telegrinder-0.1.dev169.dist-info → telegrinder-0.1.dev171.dist-info}/LICENSE +0 -0
  79. {telegrinder-0.1.dev169.dist-info → telegrinder-0.1.dev171.dist-info}/WHEEL +0 -0
@@ -24,7 +24,7 @@ def is_spec_format(obj: typing.Any) -> typing.TypeGuard[SpecialFormat]:
24
24
  )
25
25
 
26
26
 
27
- @dataclasses.dataclass(repr=False)
27
+ @dataclasses.dataclass(repr=False, slots=True)
28
28
  class BaseSpecFormat:
29
29
  __formatter_name__: typing.ClassVar[str] = dataclasses.field(init=False, repr=False)
30
30
 
@@ -32,7 +32,7 @@ class BaseSpecFormat:
32
32
  return f"<Special formatter {self.__class__.__name__!r} -> {self.__formatter_name__!r}>"
33
33
 
34
34
 
35
- @dataclasses.dataclass(repr=False)
35
+ @dataclasses.dataclass(repr=False, slots=True)
36
36
  class ChannelBoostLink(BaseSpecFormat):
37
37
  __formatter_name__ = "channel_boost_link"
38
38
 
@@ -40,7 +40,7 @@ class ChannelBoostLink(BaseSpecFormat):
40
40
  string: str | None = None
41
41
 
42
42
 
43
- @dataclasses.dataclass(repr=False)
43
+ @dataclasses.dataclass(repr=False, slots=True)
44
44
  class InviteChatLink(BaseSpecFormat):
45
45
  __formatter_name__ = "invite_chat_link"
46
46
 
@@ -48,7 +48,7 @@ class InviteChatLink(BaseSpecFormat):
48
48
  string: str | None = None
49
49
 
50
50
 
51
- @dataclasses.dataclass(repr=False)
51
+ @dataclasses.dataclass(repr=False, slots=True)
52
52
  class Mention(BaseSpecFormat):
53
53
  __formatter_name__ = "mention"
54
54
 
@@ -56,7 +56,7 @@ class Mention(BaseSpecFormat):
56
56
  user_id: int
57
57
 
58
58
 
59
- @dataclasses.dataclass(repr=False)
59
+ @dataclasses.dataclass(repr=False, slots=True)
60
60
  class Link(BaseSpecFormat):
61
61
  __formatter_name__ = "link"
62
62
 
@@ -64,7 +64,7 @@ class Link(BaseSpecFormat):
64
64
  string: str | None = None
65
65
 
66
66
 
67
- @dataclasses.dataclass(repr=False)
67
+ @dataclasses.dataclass(repr=False, slots=True)
68
68
  class PreCode(BaseSpecFormat):
69
69
  __formatter_name__ = "pre_code"
70
70
 
@@ -72,7 +72,7 @@ class PreCode(BaseSpecFormat):
72
72
  lang: str | ProgrammingLanguage | None = None
73
73
 
74
74
 
75
- @dataclasses.dataclass(repr=False)
75
+ @dataclasses.dataclass(repr=False, slots=True)
76
76
  class TgEmoji(BaseSpecFormat):
77
77
  __formatter_name__ = "tg_emoji"
78
78
 
@@ -80,7 +80,7 @@ class TgEmoji(BaseSpecFormat):
80
80
  emoji_id: int
81
81
 
82
82
 
83
- @dataclasses.dataclass(repr=False)
83
+ @dataclasses.dataclass(repr=False, slots=True)
84
84
  class StartBotLink(BaseSpecFormat):
85
85
  __formatter_name__ = "start_bot_link"
86
86
 
@@ -89,7 +89,7 @@ class StartBotLink(BaseSpecFormat):
89
89
  string: str | None
90
90
 
91
91
 
92
- @dataclasses.dataclass(repr=False)
92
+ @dataclasses.dataclass(repr=False, slots=True)
93
93
  class StartGroupLink(BaseSpecFormat):
94
94
  __formatter_name__ = "start_group_link"
95
95
 
@@ -98,7 +98,7 @@ class StartGroupLink(BaseSpecFormat):
98
98
  string: str | None = None
99
99
 
100
100
 
101
- @dataclasses.dataclass(repr=False)
101
+ @dataclasses.dataclass(repr=False, slots=True)
102
102
  class ResolveDomain(BaseSpecFormat):
103
103
  __formatter_name__ = "resolve_domain"
104
104
 
@@ -1,12 +1,12 @@
1
1
  from .abc import ABCGlobalContext, CtxVar, GlobalCtxVar
2
2
  from .global_context import GlobalContext, ctx_var
3
- from .telegrinder_ctx import TelegrinderCtx
3
+ from .telegrinder_ctx import TelegrinderContext
4
4
 
5
5
  __all__ = (
6
6
  "ABCGlobalContext",
7
7
  "CtxVar",
8
8
  "GlobalContext",
9
9
  "GlobalCtxVar",
10
- "TelegrinderCtx",
10
+ "TelegrinderContext",
11
11
  "ctx_var",
12
12
  )
@@ -81,7 +81,7 @@ def ctx_var(value: T, *, const: bool = False) -> T:
81
81
  return typing.cast(T, CtxVar(value, const=const))
82
82
 
83
83
 
84
- @dataclasses.dataclass(frozen=True, eq=False)
84
+ @dataclasses.dataclass(frozen=True, eq=False, slots=True)
85
85
  class RootAttr:
86
86
  name: str
87
87
  can_be_read: bool = dataclasses.field(default=True, kw_only=True)
@@ -91,7 +91,7 @@ class RootAttr:
91
91
  return self.name == __value
92
92
 
93
93
 
94
- @dataclasses.dataclass(repr=False, frozen=True)
94
+ @dataclasses.dataclass(repr=False, frozen=True, slots=True)
95
95
  class Storage:
96
96
  _storage: dict[str, "GlobalContext"] = dataclasses.field(
97
97
  default_factory=lambda: {},
@@ -5,14 +5,14 @@ import vbml
5
5
  from telegrinder.tools.global_context import GlobalContext, ctx_var
6
6
 
7
7
 
8
- class TelegrinderCtx(GlobalContext):
8
+ class TelegrinderContext(GlobalContext):
9
9
  """Basic type-hinted telegrinder context with context name `"telegrinder"`.
10
10
 
11
11
  You can use this class or GlobalContext:
12
12
  ```
13
- from telegrinder.tools.global_context import GlobalContext, TelegrinderCtx
13
+ from telegrinder.tools.global_context import GlobalContext, TelegrinderContext
14
14
 
15
- ctx1 = TelegrinderCtx()
15
+ ctx1 = TelegrinderContext()
16
16
  ctx2 = GlobalContext("telegrinder") # same, but without the type-hints
17
17
  assert ctx1 == ctx2 # ok
18
18
  ```"""
@@ -22,4 +22,4 @@ class TelegrinderCtx(GlobalContext):
22
22
  vbml_patcher: typing.ClassVar[vbml.Patcher] = ctx_var(vbml.Patcher(), const=True)
23
23
 
24
24
 
25
- __all__ = ("TelegrinderCtx",)
25
+ __all__ = ("TelegrinderContext",)
@@ -17,7 +17,7 @@ DictStrAny: typing.TypeAlias = dict[str, typing.Any]
17
17
  AnyMarkup: typing.TypeAlias = InlineKeyboardMarkup | ReplyKeyboardMarkup
18
18
 
19
19
 
20
- @dataclasses.dataclass(kw_only=True)
20
+ @dataclasses.dataclass(kw_only=True, slots=True)
21
21
  class KeyboardModel:
22
22
  resize_keyboard: bool
23
23
  one_time_keyboard: bool
@@ -77,7 +77,7 @@ class ABCMarkup(ABC, typing.Generic[ButtonT]):
77
77
  return self
78
78
 
79
79
 
80
- @dataclasses.dataclass(kw_only=True)
80
+ @dataclasses.dataclass(kw_only=True, slots=True)
81
81
  class Keyboard(ABCMarkup[Button], KeyboardModel):
82
82
  BUTTON = Button
83
83
 
@@ -1,6 +1,7 @@
1
1
  import asyncio
2
2
  import contextlib
3
3
  import dataclasses
4
+ import datetime
4
5
  import typing
5
6
 
6
7
  from telegrinder.modules import logger
@@ -32,7 +33,7 @@ def to_coroutine_task(task: Task) -> CoroutineTask[typing.Any]:
32
33
  return task
33
34
 
34
35
 
35
- @dataclasses.dataclass
36
+ @dataclasses.dataclass(slots=True)
36
37
  class DelayedTask(typing.Generic[CoroFunc]):
37
38
  handler: CoroFunc
38
39
  seconds: float
@@ -60,7 +61,7 @@ class DelayedTask(typing.Generic[CoroFunc]):
60
61
  self._cancelled = True
61
62
 
62
63
 
63
- @dataclasses.dataclass(kw_only=True)
64
+ @dataclasses.dataclass(kw_only=True, slots=True)
64
65
  class Lifespan:
65
66
  startup_tasks: list[CoroutineTask[typing.Any]] = dataclasses.field(default_factory=lambda: [])
66
67
  shutdown_tasks: list[CoroutineTask[typing.Any]] = dataclasses.field(default_factory=lambda: [])
@@ -86,10 +87,11 @@ class LoopWrapper(ABCLoopWrapper):
86
87
  *,
87
88
  tasks: list[CoroutineTask[typing.Any]] | None = None,
88
89
  lifespan: Lifespan | None = None,
90
+ event_loop: asyncio.AbstractEventLoop | None = None,
89
91
  ) -> None:
90
92
  self.tasks: list[CoroutineTask[typing.Any]] = tasks or []
91
93
  self.lifespan = lifespan or Lifespan()
92
- self._loop = asyncio.new_event_loop()
94
+ self._loop = event_loop or asyncio.new_event_loop()
93
95
 
94
96
  def __repr__(self) -> str:
95
97
  return "<{}: loop={!r} with tasks={!r}, lifespan={!r}>".format(
@@ -143,6 +145,10 @@ class LoopWrapper(ABCLoopWrapper):
143
145
  with contextlib.suppress(asyncio.CancelledError):
144
146
  self._loop.run_until_complete(task_to_cancel)
145
147
 
148
+ @typing.overload
149
+ def timer(self, *, seconds: datetime.timedelta) -> typing.Callable[..., typing.Any]: ...
150
+
151
+ @typing.overload
146
152
  def timer(
147
153
  self,
148
154
  *,
@@ -150,7 +156,19 @@ class LoopWrapper(ABCLoopWrapper):
150
156
  hours: int = 0,
151
157
  minutes: int = 0,
152
158
  seconds: float = 0,
153
- ):
159
+ ) -> typing.Callable[..., typing.Any]: ...
160
+
161
+ def timer(
162
+ self,
163
+ *,
164
+ days: int = 0,
165
+ hours: int = 0,
166
+ minutes: int = 0,
167
+ seconds: float | datetime.timedelta = 0,
168
+ ) -> typing.Callable[..., typing.Any]:
169
+ if isinstance(seconds, datetime.timedelta):
170
+ seconds = seconds.total_seconds()
171
+
154
172
  seconds += minutes * 60
155
173
  seconds += hours * 60 * 60
156
174
  seconds += days * 24 * 60 * 60
@@ -161,6 +179,10 @@ class LoopWrapper(ABCLoopWrapper):
161
179
 
162
180
  return decorator
163
181
 
182
+ @typing.overload
183
+ def interval(self, *, seconds: datetime.timedelta) -> typing.Callable[..., typing.Any]: ...
184
+
185
+ @typing.overload
164
186
  def interval(
165
187
  self,
166
188
  *,
@@ -168,7 +190,19 @@ class LoopWrapper(ABCLoopWrapper):
168
190
  hours: int = 0,
169
191
  minutes: int = 0,
170
192
  seconds: float = 0,
171
- ):
193
+ ) -> typing.Callable[..., typing.Any]: ...
194
+
195
+ def interval(
196
+ self,
197
+ *,
198
+ days: int = 0,
199
+ hours: int = 0,
200
+ minutes: int = 0,
201
+ seconds: float | datetime.timedelta = 0,
202
+ ) -> typing.Callable[..., typing.Any]:
203
+ if isinstance(seconds, datetime.timedelta):
204
+ seconds = seconds.total_seconds()
205
+
172
206
  seconds += minutes * 60
173
207
  seconds += hours * 60 * 60
174
208
  seconds += days * 24 * 60 * 60
@@ -2,34 +2,56 @@ import enum
2
2
  import inspect
3
3
  import types
4
4
  import typing
5
+ from functools import wraps
5
6
 
6
7
  if typing.TYPE_CHECKING:
7
8
  from telegrinder.bot.rules.abc import ABCRule
9
+ from telegrinder.node.base import Node
8
10
 
9
11
  T = typing.TypeVar("T", bound=ABCRule)
12
+ F = typing.TypeVar(
13
+ "F",
14
+ bound=typing.Callable[typing.Concatenate[typing.Callable[..., typing.Any], ...], typing.Any],
15
+ )
10
16
 
11
17
  Impl: typing.TypeAlias = type[classmethod]
18
+ NodeImpl: typing.TypeAlias = Impl
12
19
  FuncType: typing.TypeAlias = types.FunctionType | typing.Callable[..., typing.Any]
13
20
 
14
21
  TRANSLATIONS_KEY: typing.Final[str] = "_translations"
15
22
  IMPL_MARK: typing.Final[str] = "_is_impl"
23
+ NODE_IMPL_MARK: typing.Final[str] = "_is_node_impl"
24
+
25
+
26
+ def cache_magic_value(mark_key: str, /):
27
+ def inner(func: "F") -> "F":
28
+ @wraps(func)
29
+ def wrapper(*args: typing.Any, **kwargs: typing.Any) -> typing.Any:
30
+ if mark_key not in args[0].__dict__:
31
+ args[0].__dict__[mark_key] = func(*args, **kwargs)
32
+ return args[0].__dict__[mark_key]
33
+
34
+ return wrapper # type: ignore
35
+
36
+ return inner
16
37
 
17
38
 
18
39
  def resolve_arg_names(func: FuncType, start_idx: int = 1) -> tuple[str, ...]:
19
40
  return func.__code__.co_varnames[start_idx : func.__code__.co_argcount]
20
41
 
21
42
 
43
+ @cache_magic_value("__default_args__")
22
44
  def get_default_args(func: FuncType) -> dict[str, typing.Any]:
23
45
  fspec = inspect.getfullargspec(func)
24
- return dict(zip(fspec.args[::-1], (fspec.defaults or ())[::-1]))
46
+ if not fspec.defaults:
47
+ return {}
48
+ return dict(zip(fspec.args[-len(fspec.defaults):], fspec.defaults))
25
49
 
26
50
 
27
- def get_annotations(func: FuncType) -> dict[str, typing.Any]:
28
- return {
29
- name: parameter.annotation
30
- for name, parameter in inspect.signature(func).parameters.items()
31
- if parameter.annotation is not inspect._empty
32
- }
51
+ def get_annotations(func: FuncType, *, return_type: bool = False) -> dict[str, typing.Any]:
52
+ if not return_type and "return" in func.__annotations__:
53
+ del func.__annotations__["return"]
54
+ return func.__annotations__
33
55
 
34
56
 
35
57
  def to_str(s: str | enum.Enum) -> str:
@@ -59,30 +81,41 @@ def get_cached_translation(rule: "T", locale: str) -> "T | None":
59
81
 
60
82
  def cache_translation(base_rule: "T", locale: str, translated_rule: "T") -> None:
61
83
  translations = getattr(base_rule, TRANSLATIONS_KEY, {})
62
- setattr(base_rule, TRANSLATIONS_KEY, {locale: translated_rule, **translations})
84
+ translations[locale] = translated_rule
85
+ setattr(base_rule, TRANSLATIONS_KEY, translations)
63
86
 
64
87
 
65
- def get_impls(cls: type[typing.Any]) -> list[typing.Callable[..., typing.Any]]:
66
- functions = [func.__func__ for func in vars(cls).values() if isinstance(func, classmethod)]
67
- return [impl for impl in functions if getattr(impl, IMPL_MARK, False) is True]
88
+ def get_impls_by_key(cls: type["Node"], mark_key: str) -> dict[str, typing.Callable[..., typing.Any]]:
89
+ return {
90
+ name: func.__func__
91
+ for name, func in vars(cls).items()
92
+ if isinstance(func, classmethod) and getattr(func.__func__, mark_key, False)
93
+ }
68
94
 
69
95
 
70
96
  @typing.cast(typing.Callable[..., Impl], lambda f: f)
71
97
  def impl(method: typing.Callable[..., typing.Any]):
72
- bound_method = classmethod(method)
73
98
  setattr(method, IMPL_MARK, True)
74
- return bound_method
99
+ return classmethod(method)
100
+
101
+
102
+ @typing.cast(typing.Callable[..., NodeImpl], lambda f: f)
103
+ def node_impl(method: typing.Callable[..., typing.Any]):
104
+ setattr(method, NODE_IMPL_MARK, True)
105
+ return classmethod(method)
75
106
 
76
107
 
77
108
  __all__ = (
78
109
  "TRANSLATIONS_KEY",
110
+ "cache_magic_value",
79
111
  "cache_translation",
112
+ "get_annotations",
80
113
  "get_cached_translation",
81
114
  "get_default_args",
82
115
  "get_default_args",
83
- "magic_bundle",
84
116
  "impl",
117
+ "magic_bundle",
118
+ "node_impl",
85
119
  "resolve_arg_names",
86
120
  "to_str",
87
- "get_annotations",
88
121
  )
@@ -352,6 +352,7 @@ class Currency(str, enum.Enum):
352
352
  YER = "YER"
353
353
  ZAR = "ZAR"
354
354
  XTR = "XTR"
355
+ """Telegram stars."""
355
356
 
356
357
 
357
358
  class InlineQueryResultType(str, enum.Enum):
@@ -13,7 +13,7 @@ if typing.TYPE_CHECKING:
13
13
 
14
14
 
15
15
  class APIMethods:
16
- """Telegram Bot API 7.7 methods, released `July 7, 2024`."""
16
+ """Telegram Bot API 7.8 methods, released `July 31, 2024`."""
17
17
 
18
18
  default_params = ProxiedDict(
19
19
  typing.TypedDict(
@@ -2207,6 +2207,7 @@ class APIMethods:
2207
2207
  self,
2208
2208
  chat_id: int | str,
2209
2209
  message_id: int,
2210
+ business_connection_id: str | None = None,
2210
2211
  disable_notification: bool | None = None,
2211
2212
  **other: typing.Any,
2212
2213
  ) -> Result[bool, APIError]:
@@ -2218,6 +2219,9 @@ class APIMethods:
2218
2219
  in a supergroup or 'can_edit_messages' administrator right in a channel.
2219
2220
  Returns True on success.
2220
2221
 
2222
+ :param business_connection_id: Unique identifier of the business connection on behalf of which the message \
2223
+ will be pinned.
2224
+
2221
2225
  :param chat_id: Unique identifier for the target chat or username of the target channel \
2222
2226
  (in the format @channelusername).
2223
2227
 
@@ -2237,6 +2241,7 @@ class APIMethods:
2237
2241
  async def unpin_chat_message(
2238
2242
  self,
2239
2243
  chat_id: int | str,
2244
+ business_connection_id: str | None = None,
2240
2245
  message_id: int | None = None,
2241
2246
  **other: typing.Any,
2242
2247
  ) -> Result[bool, APIError]:
@@ -2248,11 +2253,15 @@ class APIMethods:
2248
2253
  in a supergroup or 'can_edit_messages' administrator right in a channel.
2249
2254
  Returns True on success.
2250
2255
 
2256
+ :param business_connection_id: Unique identifier of the business connection on behalf of which the message \
2257
+ will be unpinned.
2258
+
2251
2259
  :param chat_id: Unique identifier for the target chat or username of the target channel \
2252
2260
  (in the format @channelusername).
2253
2261
 
2254
- :param message_id: Identifier of a message to unpin. If not specified, the most recent pinned \
2255
- message (by sending date) will be unpinned.
2262
+ :param message_id: Identifier of the message to unpin. Required if business_connection_id \
2263
+ is specified. If not specified, the most recent pinned message (by sending \
2264
+ date) will be unpinned.
2256
2265
  """
2257
2266
 
2258
2267
  method_response = await self.api.request_raw(
@@ -3929,9 +3938,9 @@ class APIMethods:
3929
3938
 
3930
3939
  :param thumbnail: A .WEBP or .PNG image with the thumbnail, must be up to 128 kilobytes in size \
3931
3940
  and have a width and height of exactly 100px, or a .TGS animation with a thumbnail \
3932
- up to 32 kilobytes in size (see https://core.telegram.org/stickers#animated-sticker-requirements \
3941
+ up to 32 kilobytes in size (see https://core.telegram.org/stickers#animation-requirements \
3933
3942
  for animated sticker technical requirements), or a WEBM video with the \
3934
- thumbnail up to 32 kilobytes in size; see https://core.telegram.org/stickers#video-sticker-requirements \
3943
+ thumbnail up to 32 kilobytes in size; see https://core.telegram.org/stickers#video-requirements \
3935
3944
  for video sticker technical requirements. Pass a file_id as a String to \
3936
3945
  send a file that already exists on the Telegram servers, pass an HTTP URL \
3937
3946
  as a String for Telegram to get a file from the Internet, or upload a new one \
@@ -423,6 +423,9 @@ class User(Model):
423
423
  """Optional. True, if the bot can be connected to a Telegram Business account
424
424
  to receive its messages. Returned only in getMe."""
425
425
 
426
+ has_main_web_app: Option[bool] = Nothing
427
+ """Optional. True, if the bot has a main Web App. Returned only in getMe."""
428
+
426
429
  def __eq__(self, other: typing.Any) -> bool:
427
430
  return isinstance(other, self.__class__) and self.id == other.id
428
431
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: telegrinder
3
- Version: 0.1.dev169
3
+ Version: 0.1.dev171
4
4
  Summary: Modern visionary telegram bot framework.
5
5
  Home-page: https://github.com/timoniq/telegrinder
6
6
  License: MIT
@@ -25,7 +25,7 @@ Requires-Dist: certifi (>=2024.2.2,<2025.0.0)
25
25
  Requires-Dist: choicelib (>=0.1.5,<0.2.0)
26
26
  Requires-Dist: colorama (>=0.4.0,<0.5.0)
27
27
  Requires-Dist: envparse (>=0.2.0,<0.3.0)
28
- Requires-Dist: fntypes (>=0.1.2.post1,<0.2.0)
28
+ Requires-Dist: fntypes (>=0.1.3,<0.2.0)
29
29
  Requires-Dist: msgspec (>=0.18.6,<0.19.0)
30
30
  Requires-Dist: requests (>=2.28.1,<3.0.0)
31
31
  Requires-Dist: typing-extensions (>=4.10.0,<5.0.0)
@@ -0,0 +1,145 @@
1
+ telegrinder/__init__.py,sha256=_oJyGLb0znFMchGTHQtqeBYlvgvTb9FE9QxnyJvzuTQ,4230
2
+ telegrinder/api/__init__.py,sha256=pIDtnsL0NwT5PgVm43Gkp-ByOqDsqnD-oFDiC9tcPT4,246
3
+ telegrinder/api/abc.py,sha256=JtGFXQR918uPiW4EUFdHLDE1_zfWBwq19uNCQqZ3Oz0,1931
4
+ telegrinder/api/api.py,sha256=EnUnxmD0bSd0hziEnLZSAhRcNLp5uBrW5EFFZwJvjuU,2844
5
+ telegrinder/api/error.py,sha256=6_KBR819Tg9mLI7w5aHHYnrS8VSDYNkWIrHCnfgCFKk,422
6
+ telegrinder/api/response.py,sha256=d7Oxd5kOdbZNJiALkzkecHl8Y3K_BzCmsRq2Sn3otqA,491
7
+ telegrinder/bot/__init__.py,sha256=bGXs_-fHjyeZ736Jyy9GN1J0W4ar4Kl58IBkybj5k30,1918
8
+ telegrinder/bot/bot.py,sha256=NnwGJIaVKV6QIh59sNJlm2DavaPMkgqqyHowy0Gknnc,2503
9
+ telegrinder/bot/cute_types/__init__.py,sha256=XDcZJMKDFYJExvaNSm3B-bMQ2_wRETALz7-OWAytBC0,457
10
+ telegrinder/bot/cute_types/base.py,sha256=3NcEROSe00cyf21UBKjtkDdKMacGt5W2OM2EmpJ5W8o,9148
11
+ telegrinder/bot/cute_types/callback_query.py,sha256=4YfEuKSRZ_-IkjoIDQPoKFSkY4DM7Sb1tKksr9c0auI,20851
12
+ telegrinder/bot/cute_types/chat_join_request.py,sha256=JJFYgaofPZeegBC-gAWUaClzzb7yOhNN_DEd3Y4A8oU,2264
13
+ telegrinder/bot/cute_types/chat_member_updated.py,sha256=HJUTiku9YpRKEN_VHVecFu7AgNqKmsQ85nbMVKdKev0,10885
14
+ telegrinder/bot/cute_types/inline_query.py,sha256=wd_zhUQXNi1xOVnDBleD4GZXgH63g5STFXUJaW0YE0Q,2474
15
+ telegrinder/bot/cute_types/message.py,sha256=EtcjcM31JfHm-0BRO6-Q0mLhpxElov3qkCN3CNZZWcs,150406
16
+ telegrinder/bot/cute_types/update.py,sha256=ugzYF5aVDyRSyXIkYlJRjaUR-pZ8sUZHH_-PxXK7HBI,2953
17
+ telegrinder/bot/cute_types/utils.py,sha256=ZgbKOCnwyH1gj-pWPtbnjfid8e5BhGylkYmyv3cQJ-0,2522
18
+ telegrinder/bot/dispatch/__init__.py,sha256=fsiHbCZBmYTxnvrct2KvMicq387nPxiNlPn0VIQcYa8,1452
19
+ telegrinder/bot/dispatch/abc.py,sha256=yVJjjE-TJGWY7ZH0Ak-vd44TguyRPtKqf43TypIVnCA,660
20
+ telegrinder/bot/dispatch/context.py,sha256=WqeZAmKrgOSMGpVwtvojjFesVAlEgFh5pyBXX2FFlxs,2319
21
+ telegrinder/bot/dispatch/dispatch.py,sha256=qyhy-IqPqo0GZt5-PzJGxHH173ZQUksAcp37KKC62fg,6553
22
+ telegrinder/bot/dispatch/handler/__init__.py,sha256=mzchbArrm0eoTEeVKHYrtJX4WSfW5t6T4xDU3-mtYaA,169
23
+ telegrinder/bot/dispatch/handler/abc.py,sha256=P48Dn8goXwNqbCPo0Zvmc8itf-AtBuOQomoNc1nDu28,591
24
+ telegrinder/bot/dispatch/handler/func.py,sha256=_gy8r6FtEBx-mzdpqoboc_buofdkE3iANNYor5FeAdY,4585
25
+ telegrinder/bot/dispatch/handler/message_reply.py,sha256=qMG24tqibPqxZnV7C_VSNqApP9MwdlNPuy_rAeXWqmo,1964
26
+ telegrinder/bot/dispatch/middleware/__init__.py,sha256=qDuTt2ZZKX9UMjPdw5xaaNZdMI-i3P4Px2T8qbYCMJw,61
27
+ telegrinder/bot/dispatch/middleware/abc.py,sha256=O3aiE44XpjE6h9iXYc_uWNZCBxDH1KAFrLej4nsJhUI,413
28
+ telegrinder/bot/dispatch/process.py,sha256=hES2zuhekAWHfOcDTsNPrfngPM1GhOCowQOrj2NTjVo,3407
29
+ telegrinder/bot/dispatch/return_manager/__init__.py,sha256=M9RmSqs5U_JixX_1FT1byMAxdfcC3UGvZAhmmebFDN4,446
30
+ telegrinder/bot/dispatch/return_manager/abc.py,sha256=iKO67VMmEbCLsqRDYmnWle2aL3xsZhjkxVKVXfeoVhE,3559
31
+ telegrinder/bot/dispatch/return_manager/callback_query.py,sha256=FvAmCHZQ59fA7tJdW4lWsG0WdkJJApGNHYKwC-_or_k,652
32
+ telegrinder/bot/dispatch/return_manager/inline_query.py,sha256=lKmg1__LBgFTrWjS2Ckp7LDWVKr8PDfB_awMyh3PnFg,475
33
+ telegrinder/bot/dispatch/return_manager/message.py,sha256=ZrCrvq8wNmz8TTykoVMzneKk11cIqkCFZIOynZ5PjAQ,1160
34
+ telegrinder/bot/dispatch/view/__init__.py,sha256=x8qPwRWosGNTk89tvyiWZhHKvVK2IqFI87D7YTrRKbk,569
35
+ telegrinder/bot/dispatch/view/abc.py,sha256=5r5wY4HWjppmLWVmOLF-NXoOGhcVOqrbN3bLBxt4nl4,6649
36
+ telegrinder/bot/dispatch/view/box.py,sha256=fQwdMJs-5tKNN5iOJKi0JlXjHA1Nu8MhLjwbpb9SDbI,5505
37
+ telegrinder/bot/dispatch/view/callback_query.py,sha256=ALQm-cUFDQggZqwGVOEVodvpTcYKXCebwYDbLcZ36cE,560
38
+ telegrinder/bot/dispatch/view/chat_join_request.py,sha256=y1wQMrPSiqxDHQm7TqdOA-ecAP3rnocYTzQxa7-7vws,447
39
+ telegrinder/bot/dispatch/view/chat_member.py,sha256=VGXp0F_y4b1b3kYNO5Y4QLeoM6pt_DzA1sNysBdObAY,715
40
+ telegrinder/bot/dispatch/view/inline_query.py,sha256=hRwrgfhgS5YF0E6eUrR8FuWVHUMlnA758kG7V049lkE,531
41
+ telegrinder/bot/dispatch/view/message.py,sha256=4JP9uIb9emoEzwMPOtfdnQ1qcgA6ojCmfPA9o0NdFLU,1328
42
+ telegrinder/bot/dispatch/view/raw.py,sha256=I46Ph66KDkEMI4Yzhgr7nprtOmdJ8ZJ-WcAb7fF4LXo,3462
43
+ telegrinder/bot/dispatch/waiter_machine/__init__.py,sha256=6Rt8xVhL7c-k_kNEQ7GX52DJEwVo_1Y4VacqA7rUDyc,246
44
+ telegrinder/bot/dispatch/waiter_machine/machine.py,sha256=6yRuYzeN4QucJSfGO2Zc1sifTwfPA81CY1B_f8w-faU,5869
45
+ telegrinder/bot/dispatch/waiter_machine/middleware.py,sha256=f4IJgjMwACOetmAIo6mey5WYOmO3Sw3OG3pga5ptsCc,3528
46
+ telegrinder/bot/dispatch/waiter_machine/short_state.py,sha256=AYrDN03cdiwFYsuMoK_LQ1AHorswIVHwqkSRstYvTjI,2122
47
+ telegrinder/bot/polling/__init__.py,sha256=OqfIFPS_V6UrCg-vCv9pkMFzTKdNbDP2faBfATs_TGg,94
48
+ telegrinder/bot/polling/abc.py,sha256=-5BpX55SJfDlEJWt15yOXWCizQRrgeY5oiA5eHkm1Nw,434
49
+ telegrinder/bot/polling/polling.py,sha256=Kt6CnrUAqMTaO3LdFfPQp9kyoV6coQez_jknpL6COt4,4716
50
+ telegrinder/bot/rules/__init__.py,sha256=4gxjLyXueNa6-4RoQuK0wsV51GtnRsRp1WvnnC_9XRw,2352
51
+ telegrinder/bot/rules/abc.py,sha256=1TVVfCf76RrFW_9Nr_gmQXRzCpexCHsKB-as2xAmphg,5957
52
+ telegrinder/bot/rules/adapter/__init__.py,sha256=r1U1mky2I5K9ZUiktGILtcGtHUU3LPIz2-G6hs9WWeg,300
53
+ telegrinder/bot/rules/adapter/abc.py,sha256=SXChAektvYOkGxIxjZrIn-BS4AttsWohqMF4zLPc9qM,567
54
+ telegrinder/bot/rules/adapter/errors.py,sha256=qrovMtrhsLfSAwfkh3tAi9ld5fl58SpYMKyju78LOcU,68
55
+ telegrinder/bot/rules/adapter/event.py,sha256=DUvlZHGEagtaaDWH4Z7D7GwVJTdUkWJxCPER2pEMndk,2342
56
+ telegrinder/bot/rules/adapter/node.py,sha256=d_R1Blkw0BkRMp_v-CWK9fklbbXdiMVBoQRRn-2kmdM,1660
57
+ telegrinder/bot/rules/adapter/raw_update.py,sha256=K0bwq3Hh-hIs_xbEYDOgZHMS4r-Zvo3VKs1B3gkJLGA,752
58
+ telegrinder/bot/rules/callback_data.py,sha256=5ZcIapEmRNxX34s0Htese2nKpGxpH9rP25cfs6qPorM,5511
59
+ telegrinder/bot/rules/chat_join.py,sha256=xuyotgsGc_2_jQ5GFp-_3i4bs3ofHDaXoRbWn_Qu-QY,1484
60
+ telegrinder/bot/rules/command.py,sha256=ESJA21HZHWT0RlYzHqOKBa223CTFbqwx_cgvNsWao44,3912
61
+ telegrinder/bot/rules/enum_text.py,sha256=YJ6S2fAQts8zCjCgoL7uUGWlnPOH59rjvA7Si2hKyR4,944
62
+ telegrinder/bot/rules/func.py,sha256=f2FB6jVs1x1rmAJzzkaWml3uX1rJcg8j8E2J4rMWUy0,761
63
+ telegrinder/bot/rules/fuzzy.py,sha256=Kx4S1y6iFqWM3uIUmor47mCmD08NRRJbcciH-dFs19M,676
64
+ telegrinder/bot/rules/inline.py,sha256=56I-TAFbha99HTgM9HXNPpL0KWTwTqhvDFon2cNl1vA,1981
65
+ telegrinder/bot/rules/integer.py,sha256=kyH2MxlUlDF7i--2mwunOP6Xvjvw4V2IxSyjg8EIMuQ,435
66
+ telegrinder/bot/rules/is_from.py,sha256=x7vCbLzqFkFE0GxPgy_WA_mRFa_ogSNTzyJ6PK3Qx0o,3382
67
+ telegrinder/bot/rules/markup.py,sha256=co58K9s3e6T9fyJijjJCRjB8zgNLLdTBLbu42mIml1Y,1104
68
+ telegrinder/bot/rules/mention.py,sha256=xteWbtSjQN3KOXpB8RjuVYu18bGrLxNtVFg6oR-UkxU,435
69
+ telegrinder/bot/rules/message.py,sha256=VFfcEmNrw5sW4EYpk2XgLkSE5-rRr7sWC2dFE26Q3cI,442
70
+ telegrinder/bot/rules/message_entities.py,sha256=gBmhDTWVNzL5oBRk6h7LfpWkLirnuGF8G_oAo16vGLc,1111
71
+ telegrinder/bot/rules/node.py,sha256=IP7Ke-4hILb12XHNIresMf_87kXhlLfKOloShoQvWN0,892
72
+ telegrinder/bot/rules/regex.py,sha256=mjXXPX-NB2e3gFU6LFihLnKANcgUoAL5lOnfmhC3Qnc,1153
73
+ telegrinder/bot/rules/rule_enum.py,sha256=35GwPKLBTG_ESn4TZLcFJTLNjYXAi_d9wrfIDexoEH8,2113
74
+ telegrinder/bot/rules/start.py,sha256=3ciA28m9JNcM-1H2YnLrUNyS1Y4UsyYPR5MClrpdAdA,1154
75
+ telegrinder/bot/rules/text.py,sha256=kmiL-mG_T4eoJXbYyCacf6ZvvKmKgNrEaIo2RTMBG0E,1031
76
+ telegrinder/bot/rules/update.py,sha256=T-sJGnpWkAZ_uxAdrRqWi33FKNlUA3wV_-vp87x0lsI,465
77
+ telegrinder/bot/scenario/__init__.py,sha256=nnPjdxdvjoEYYMRUEfWvIhZStiY1C984x1azdRRP9II,136
78
+ telegrinder/bot/scenario/abc.py,sha256=3AZYRjZlkbDtyFbsKdZ6BefzWYlJ0DOrGwh8jI3nzv4,474
79
+ telegrinder/bot/scenario/checkbox.py,sha256=5M-l24WK8uSvMZxVN_beE282zRtUPkDfKU8YW-EfAUk,4164
80
+ telegrinder/bot/scenario/choice.py,sha256=YAWY2mEqon9cO93Kc25emR9U4bPIKHFg8APIJR3APZo,1441
81
+ telegrinder/client/__init__.py,sha256=ZiS1Wb_l_kv3FHzEEi1oXtFLwlA_HXmWOzeN0xA3E7Y,104
82
+ telegrinder/client/abc.py,sha256=OxsTX_PLYBEeFT9zpidFUzAbQL9BM7rQqru7zdn5DiQ,1611
83
+ telegrinder/client/aiohttp.py,sha256=AqmuHd6Z3zy96YBe7xIMC4U8Hi9SA7j-0EI7xYE3ZCU,4085
84
+ telegrinder/model.py,sha256=2qhceVzDO7BntIQqD0eiGkek_yeyEpvfbyFeSuq816g,7233
85
+ telegrinder/modules.py,sha256=GDGBT79wTcC_vEG4-1zWe4E5fMNbp6-n6AwJoYF_Oek,7945
86
+ telegrinder/msgspec_json.py,sha256=phfyhUvYYZUGEcI6RAyRx9lnARPK_Fqtw3Q0MEJnuUk,226
87
+ telegrinder/msgspec_utils.py,sha256=07W8hzakLhVwGig69IpDSu_k1OksRgmRH2260826VQA,10782
88
+ telegrinder/node/__init__.py,sha256=OYjRrJd3ryei-JNKx-d-EQw84v2XWkB47H00Qcym9Fw,1430
89
+ telegrinder/node/attachment.py,sha256=n79uAt1ixgnr8qjBMNstu36qe4Fli63kSvpgW1WO7S8,3061
90
+ telegrinder/node/base.py,sha256=KE67MDzsrot2ecs8AbLlcczihhqbqMNTRgSppmsehOI,5528
91
+ telegrinder/node/callback_query.py,sha256=aDXnDGQb6H7im5J8A-M3vfZHczg0PrFAjUexIK2dTUM,507
92
+ telegrinder/node/command.py,sha256=S6povhUFXJ3o5keuOzTP7nbIrZ16KKkQNK3xji1LPb4,874
93
+ telegrinder/node/composer.py,sha256=D7dVO-2VtTrE-09ODhHd-BUhV53SxwWtihC03yTpT-o,6582
94
+ telegrinder/node/container.py,sha256=evExZxEy-n4NLpR0W_b75GjRTZLD42I6Z7w_wXljDIA,658
95
+ telegrinder/node/event.py,sha256=1FKQXCbsC-xl4bcYxTv6NRVzz39LNkW4-9JAE-BPFmE,2098
96
+ telegrinder/node/me.py,sha256=9RhRLsIe1e-yDLZ6ehfmGvhhLYRMu1VAjkSri9H0V8E,378
97
+ telegrinder/node/message.py,sha256=TbT2zeR9kVR-QAqVkRAmtse4U0BHoWfQ4esKMKLzm7A,449
98
+ telegrinder/node/polymorphic.py,sha256=kvjC8CaB5e-elYU4cPokFmAI6Sy6g1GRXxQL1fyd7YY,1661
99
+ telegrinder/node/rule.py,sha256=UWrX3ep9yybROE1Rac1uPsW5WA8o6v1wM4rUkZfpsxg,2600
100
+ telegrinder/node/scope.py,sha256=AU2YSB2E3tf0rAdoa1AtbcpTCKguuprl6eulBsgUuxM,677
101
+ telegrinder/node/source.py,sha256=hKsgVg20Ge6vQ4Da3RQoJGvN93z3089s_v9sfm7sF6c,1896
102
+ telegrinder/node/text.py,sha256=Jik937Pn6JGAKiplHmHseWDWoflnK5yirvvG_vrUxl8,581
103
+ telegrinder/node/tools/__init__.py,sha256=iyjs82g3brYGzpPsUQaoK6_r7YuQhRkJ61YjjuPOx9E,67
104
+ telegrinder/node/tools/generator.py,sha256=xuhZ5-TwoctFLlDBdYvjOQxHTpqC4IAdnkzMViVSsUM,1046
105
+ telegrinder/node/update.py,sha256=dr6w9bccH2m47Z1FX-twBzg9RfFz8Zh2L3EiuUcecY8,268
106
+ telegrinder/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
107
+ telegrinder/rules.py,sha256=BFB8RFwKKxqs9HFfo_p0RfulQNonPZAX8cHpmnG7qCU,39
108
+ telegrinder/tools/__init__.py,sha256=N_EGjedn096mPw1Tozc4uMCSXH2h9NCFnKuubFZu5ec,2837
109
+ telegrinder/tools/buttons.py,sha256=4Mc8KZ8i8l2XSiJaybbO23ywIx8T3bQiMH0UkyXuj4I,2905
110
+ telegrinder/tools/error_handler/__init__.py,sha256=WmYWZCNhhSk32j4lIOltEwzoYUx086TGTbOF5h3Ps7s,207
111
+ telegrinder/tools/error_handler/abc.py,sha256=w5t2sWa_xt9iy7pdphiFs1kgmsll7A7eaPbm3Yes8t0,888
112
+ telegrinder/tools/error_handler/error.py,sha256=uLcG-wqyOeCEB45m8vMcGy5kZ87bGHUS_-fPw2cGE9s,221
113
+ telegrinder/tools/error_handler/error_handler.py,sha256=prWsknbOCirZjBbqMIje6p7s2OOs8gfB_5QSfX9WOpY,6375
114
+ telegrinder/tools/formatting/__init__.py,sha256=1tFuJjMpDphCIOR4uXQhptyLHuAZ26mYSFx_BQwL5Lo,1459
115
+ telegrinder/tools/formatting/html.py,sha256=h8hyN6t6cJfMBjMf-XWZixVnweoAuLUIJ1xjg9JOJDw,8736
116
+ telegrinder/tools/formatting/links.py,sha256=dYJy2qPxa4YGHYqSSCTv-6hXz0Aa0AGuzsLXwbxPZ9A,1112
117
+ telegrinder/tools/formatting/spec_html_formats.py,sha256=I-OULqlof8NOeSNGBddKkudqMLjsMAQ02Pc6qH_fNRQ,2617
118
+ telegrinder/tools/global_context/__init__.py,sha256=5pF9growKd28WO739wk_DZUqCDw5hxs6eUcDtxTosX8,290
119
+ telegrinder/tools/global_context/abc.py,sha256=twwAmbTk49KGl_POImr4yj6POr-zdx8mz74McuphZH0,1644
120
+ telegrinder/tools/global_context/global_context.py,sha256=9gA5_ikMA3Lqi9ng_MCxwGHiSWSLjZ-4XQzAOiIegjQ,13669
121
+ telegrinder/tools/global_context/telegrinder_ctx.py,sha256=U6DHIC-B40HLWojwU3tAui256VcZpTpUmYhSSqV0vDY,663
122
+ telegrinder/tools/i18n/__init__.py,sha256=CLUoiCJzOZzF-dqDIHZ5Fc8QUa38cYhIG4WF-ctPLfE,288
123
+ telegrinder/tools/i18n/base.py,sha256=jxJVYiTplJaNeklkGiin-m7BkfZiac2fbVXTEdhNw6o,726
124
+ telegrinder/tools/i18n/middleware/__init__.py,sha256=y5ZX6s3fOix_Yn98UNO8VqQ7ihJbQ_e5Uz01RgL7pHg,82
125
+ telegrinder/tools/i18n/middleware/base.py,sha256=gGqcPxJLLC3f6XfV_0-drhr27TND40cL1Z5sNmC84lo,663
126
+ telegrinder/tools/i18n/simple.py,sha256=yiaGtEAaMkrzYV3O7esA2wi3A2n9YyndxKPKp8Fs834,1567
127
+ telegrinder/tools/kb_set/__init__.py,sha256=k1KCQTnvEgJ2y4KlghhJWOh5rccwg_27cs8264NtMmk,156
128
+ telegrinder/tools/kb_set/base.py,sha256=mbZs-ViUErfSibzyN064IqZp76LBJPg3NB4D9v4VFtg,243
129
+ telegrinder/tools/kb_set/yaml.py,sha256=glk27r0L9Y8ibaPmTHMAEJZw-ED-ehmSo_NdJNKkrNs,2007
130
+ telegrinder/tools/keyboard.py,sha256=gsHGqYkpaKgyzUwNLUz8lvQjlKt6VqHfeKrkFS14HiE,3673
131
+ telegrinder/tools/limited_dict.py,sha256=tb1WT4P3Oia5CsCBXTHzlFjrPnIgf9eHCkQ0zhAbEUg,1078
132
+ telegrinder/tools/loop_wrapper/__init__.py,sha256=ZQ5jmE1lOKnqJlMZ9k2OYmjvOEhOlHPijUWqZ4nHIgk,165
133
+ telegrinder/tools/loop_wrapper/abc.py,sha256=ET_Dp-kRz75Jo1fZB3qofUgEXN4FqlU0xH2diESKGCM,266
134
+ telegrinder/tools/loop_wrapper/loop_wrapper.py,sha256=UL3seGtMJQGc4WJjYrRvzClSUQzgVjpqriydeO_eXTM,6838
135
+ telegrinder/tools/magic.py,sha256=6Y-LGS0fs2AmeelKT46OFeHMeL48SFt37-c9Oh7ExyA,3578
136
+ telegrinder/tools/parse_mode.py,sha256=JyQ-x9YAMPLhIIiUX01acyKkpWgs5TBA07W-iUyPHpE,92
137
+ telegrinder/types/__init__.py,sha256=zwqYH_BevwejjvnNmbslt42646_3YKsdEdW3cisd12c,6588
138
+ telegrinder/types/enums.py,sha256=Jk1agclB7dqJVJf8uvZKvmOfHkN6BBSZGj95WFVzmO8,18995
139
+ telegrinder/types/methods.py,sha256=EPMLUNkAFsfXolb9eQZy0p4vrRsAoQZpmAJ5yadFEx8,198025
140
+ telegrinder/types/objects.py,sha256=spFyqkPqeHKCjyDgej58yketWOBahH2MjNcLn_0Y7_U,243731
141
+ telegrinder/verification_utils.py,sha256=ZUgHsouZjs930D5rI_w7VGy0ub69vovwKXeKjqgrSNc,1028
142
+ telegrinder-0.1.dev171.dist-info/LICENSE,sha256=Q0tKgU8mPOCQAkc6m__BrNIpRge8mPBQJDd59s21NZo,1095
143
+ telegrinder-0.1.dev171.dist-info/METADATA,sha256=9EOupgVlYbQZg0byXZM-L0ZJEzogMt9hqHfzvILWZbU,3007
144
+ telegrinder-0.1.dev171.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
145
+ telegrinder-0.1.dev171.dist-info/RECORD,,