telegrinder 0.3.4__py3-none-any.whl → 0.4.0__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 (192) hide show
  1. telegrinder/__init__.py +148 -149
  2. telegrinder/api/__init__.py +9 -8
  3. telegrinder/api/api.py +101 -93
  4. telegrinder/api/error.py +20 -16
  5. telegrinder/api/response.py +20 -20
  6. telegrinder/api/token.py +36 -36
  7. telegrinder/bot/__init__.py +72 -66
  8. telegrinder/bot/bot.py +83 -76
  9. telegrinder/bot/cute_types/__init__.py +19 -17
  10. telegrinder/bot/cute_types/base.py +184 -258
  11. telegrinder/bot/cute_types/callback_query.py +400 -385
  12. telegrinder/bot/cute_types/chat_join_request.py +62 -61
  13. telegrinder/bot/cute_types/chat_member_updated.py +157 -160
  14. telegrinder/bot/cute_types/inline_query.py +44 -43
  15. telegrinder/bot/cute_types/message.py +2590 -2637
  16. telegrinder/bot/cute_types/pre_checkout_query.py +42 -0
  17. telegrinder/bot/cute_types/update.py +112 -104
  18. telegrinder/bot/cute_types/utils.py +62 -95
  19. telegrinder/bot/dispatch/__init__.py +59 -55
  20. telegrinder/bot/dispatch/abc.py +76 -77
  21. telegrinder/bot/dispatch/context.py +96 -98
  22. telegrinder/bot/dispatch/dispatch.py +254 -202
  23. telegrinder/bot/dispatch/handler/__init__.py +13 -13
  24. telegrinder/bot/dispatch/handler/abc.py +23 -24
  25. telegrinder/bot/dispatch/handler/audio_reply.py +44 -44
  26. telegrinder/bot/dispatch/handler/base.py +57 -57
  27. telegrinder/bot/dispatch/handler/document_reply.py +44 -44
  28. telegrinder/bot/dispatch/handler/func.py +129 -135
  29. telegrinder/bot/dispatch/handler/media_group_reply.py +44 -43
  30. telegrinder/bot/dispatch/handler/message_reply.py +36 -36
  31. telegrinder/bot/dispatch/handler/photo_reply.py +44 -44
  32. telegrinder/bot/dispatch/handler/sticker_reply.py +37 -37
  33. telegrinder/bot/dispatch/handler/video_reply.py +44 -44
  34. telegrinder/bot/dispatch/middleware/__init__.py +3 -3
  35. telegrinder/bot/dispatch/middleware/abc.py +97 -22
  36. telegrinder/bot/dispatch/middleware/global_middleware.py +70 -0
  37. telegrinder/bot/dispatch/process.py +151 -157
  38. telegrinder/bot/dispatch/return_manager/__init__.py +15 -13
  39. telegrinder/bot/dispatch/return_manager/abc.py +104 -108
  40. telegrinder/bot/dispatch/return_manager/callback_query.py +20 -20
  41. telegrinder/bot/dispatch/return_manager/inline_query.py +15 -15
  42. telegrinder/bot/dispatch/return_manager/message.py +36 -36
  43. telegrinder/bot/dispatch/return_manager/pre_checkout_query.py +20 -0
  44. telegrinder/bot/dispatch/view/__init__.py +15 -13
  45. telegrinder/bot/dispatch/view/abc.py +45 -41
  46. telegrinder/bot/dispatch/view/base.py +231 -200
  47. telegrinder/bot/dispatch/view/box.py +140 -129
  48. telegrinder/bot/dispatch/view/callback_query.py +16 -17
  49. telegrinder/bot/dispatch/view/chat_join_request.py +11 -16
  50. telegrinder/bot/dispatch/view/chat_member.py +37 -39
  51. telegrinder/bot/dispatch/view/inline_query.py +16 -17
  52. telegrinder/bot/dispatch/view/message.py +43 -44
  53. telegrinder/bot/dispatch/view/pre_checkout_query.py +16 -0
  54. telegrinder/bot/dispatch/view/raw.py +116 -114
  55. telegrinder/bot/dispatch/waiter_machine/__init__.py +17 -17
  56. telegrinder/bot/dispatch/waiter_machine/actions.py +14 -13
  57. telegrinder/bot/dispatch/waiter_machine/hasher/__init__.py +8 -8
  58. telegrinder/bot/dispatch/waiter_machine/hasher/callback.py +55 -55
  59. telegrinder/bot/dispatch/waiter_machine/hasher/hasher.py +59 -57
  60. telegrinder/bot/dispatch/waiter_machine/hasher/message.py +51 -51
  61. telegrinder/bot/dispatch/waiter_machine/hasher/state.py +20 -19
  62. telegrinder/bot/dispatch/waiter_machine/machine.py +251 -172
  63. telegrinder/bot/dispatch/waiter_machine/middleware.py +94 -89
  64. telegrinder/bot/dispatch/waiter_machine/short_state.py +57 -68
  65. telegrinder/bot/polling/__init__.py +4 -4
  66. telegrinder/bot/polling/abc.py +25 -25
  67. telegrinder/bot/polling/polling.py +139 -131
  68. telegrinder/bot/rules/__init__.py +85 -62
  69. telegrinder/bot/rules/abc.py +213 -206
  70. telegrinder/bot/rules/callback_data.py +122 -163
  71. telegrinder/bot/rules/chat_join.py +45 -43
  72. telegrinder/bot/rules/command.py +126 -126
  73. telegrinder/bot/rules/enum_text.py +33 -36
  74. telegrinder/bot/rules/func.py +28 -26
  75. telegrinder/bot/rules/fuzzy.py +24 -24
  76. telegrinder/bot/rules/id.py +24 -0
  77. telegrinder/bot/rules/inline.py +58 -56
  78. telegrinder/bot/rules/integer.py +21 -20
  79. telegrinder/bot/rules/is_from.py +127 -127
  80. telegrinder/bot/rules/logic.py +18 -0
  81. telegrinder/bot/rules/markup.py +42 -43
  82. telegrinder/bot/rules/mention.py +14 -14
  83. telegrinder/bot/rules/message.py +15 -17
  84. telegrinder/bot/rules/message_entities.py +33 -35
  85. telegrinder/bot/rules/node.py +33 -27
  86. telegrinder/bot/rules/payload.py +81 -0
  87. telegrinder/bot/rules/payment_invoice.py +29 -0
  88. telegrinder/bot/rules/regex.py +36 -37
  89. telegrinder/bot/rules/rule_enum.py +72 -72
  90. telegrinder/bot/rules/start.py +42 -42
  91. telegrinder/bot/rules/state.py +35 -37
  92. telegrinder/bot/rules/text.py +38 -33
  93. telegrinder/bot/rules/update.py +15 -15
  94. telegrinder/bot/scenario/__init__.py +5 -5
  95. telegrinder/bot/scenario/abc.py +17 -19
  96. telegrinder/bot/scenario/checkbox.py +174 -176
  97. telegrinder/bot/scenario/choice.py +48 -51
  98. telegrinder/client/__init__.py +12 -4
  99. telegrinder/client/abc.py +100 -75
  100. telegrinder/client/aiohttp.py +134 -130
  101. telegrinder/client/form_data.py +31 -0
  102. telegrinder/client/sonic.py +212 -0
  103. telegrinder/model.py +208 -315
  104. telegrinder/modules.py +239 -237
  105. telegrinder/msgspec_json.py +14 -14
  106. telegrinder/msgspec_utils.py +478 -410
  107. telegrinder/node/__init__.py +86 -25
  108. telegrinder/node/attachment.py +163 -87
  109. telegrinder/node/base.py +288 -160
  110. telegrinder/node/callback_query.py +54 -53
  111. telegrinder/node/command.py +34 -33
  112. telegrinder/node/composer.py +163 -198
  113. telegrinder/node/container.py +33 -27
  114. telegrinder/node/either.py +82 -0
  115. telegrinder/node/event.py +54 -65
  116. telegrinder/node/file.py +51 -0
  117. telegrinder/node/me.py +15 -16
  118. telegrinder/node/payload.py +78 -0
  119. telegrinder/node/polymorphic.py +67 -48
  120. telegrinder/node/rule.py +72 -76
  121. telegrinder/node/scope.py +36 -38
  122. telegrinder/node/source.py +87 -71
  123. telegrinder/node/text.py +53 -41
  124. telegrinder/node/tools/__init__.py +3 -3
  125. telegrinder/node/tools/generator.py +36 -40
  126. telegrinder/py.typed +0 -0
  127. telegrinder/rules.py +1 -62
  128. telegrinder/tools/__init__.py +152 -93
  129. telegrinder/tools/adapter/__init__.py +19 -0
  130. telegrinder/tools/adapter/abc.py +49 -0
  131. telegrinder/tools/adapter/dataclass.py +56 -0
  132. telegrinder/{bot/rules → tools}/adapter/errors.py +5 -5
  133. telegrinder/{bot/rules → tools}/adapter/event.py +63 -65
  134. telegrinder/{bot/rules → tools}/adapter/node.py +46 -48
  135. telegrinder/{bot/rules → tools}/adapter/raw_event.py +27 -27
  136. telegrinder/{bot/rules → tools}/adapter/raw_update.py +30 -30
  137. telegrinder/tools/buttons.py +106 -80
  138. telegrinder/tools/callback_data_serilization/__init__.py +5 -0
  139. telegrinder/tools/callback_data_serilization/abc.py +51 -0
  140. telegrinder/tools/callback_data_serilization/json_ser.py +60 -0
  141. telegrinder/tools/callback_data_serilization/msgpack_ser.py +172 -0
  142. telegrinder/tools/error_handler/__init__.py +7 -7
  143. telegrinder/tools/error_handler/abc.py +30 -33
  144. telegrinder/tools/error_handler/error.py +9 -9
  145. telegrinder/tools/error_handler/error_handler.py +179 -193
  146. telegrinder/tools/formatting/__init__.py +83 -63
  147. telegrinder/tools/formatting/deep_links.py +541 -0
  148. telegrinder/tools/formatting/{html.py → html_formatter.py} +266 -294
  149. telegrinder/tools/formatting/spec_html_formats.py +71 -117
  150. telegrinder/tools/functional.py +8 -12
  151. telegrinder/tools/global_context/__init__.py +7 -7
  152. telegrinder/tools/global_context/abc.py +63 -63
  153. telegrinder/tools/global_context/global_context.py +387 -412
  154. telegrinder/tools/global_context/telegrinder_ctx.py +27 -27
  155. telegrinder/tools/i18n/__init__.py +7 -7
  156. telegrinder/tools/i18n/abc.py +30 -30
  157. telegrinder/tools/i18n/middleware/__init__.py +3 -3
  158. telegrinder/tools/i18n/middleware/abc.py +22 -25
  159. telegrinder/tools/i18n/simple.py +43 -43
  160. telegrinder/tools/input_file_directory.py +30 -0
  161. telegrinder/tools/keyboard.py +128 -128
  162. telegrinder/tools/lifespan.py +105 -0
  163. telegrinder/tools/limited_dict.py +32 -37
  164. telegrinder/tools/loop_wrapper/__init__.py +4 -4
  165. telegrinder/tools/loop_wrapper/abc.py +20 -15
  166. telegrinder/tools/loop_wrapper/loop_wrapper.py +169 -224
  167. telegrinder/tools/magic.py +307 -157
  168. telegrinder/tools/parse_mode.py +6 -6
  169. telegrinder/tools/state_storage/__init__.py +4 -4
  170. telegrinder/tools/state_storage/abc.py +31 -35
  171. telegrinder/tools/state_storage/memory.py +25 -25
  172. telegrinder/tools/strings.py +13 -0
  173. telegrinder/types/__init__.py +268 -260
  174. telegrinder/types/enums.py +711 -701
  175. telegrinder/types/input_file.py +51 -0
  176. telegrinder/types/methods.py +5055 -4633
  177. telegrinder/types/objects.py +7058 -6950
  178. telegrinder/verification_utils.py +30 -32
  179. {telegrinder-0.3.4.dist-info → telegrinder-0.4.0.dist-info}/LICENSE +22 -22
  180. telegrinder-0.4.0.dist-info/METADATA +144 -0
  181. telegrinder-0.4.0.dist-info/RECORD +182 -0
  182. {telegrinder-0.3.4.dist-info → telegrinder-0.4.0.dist-info}/WHEEL +1 -1
  183. telegrinder/bot/rules/adapter/__init__.py +0 -17
  184. telegrinder/bot/rules/adapter/abc.py +0 -31
  185. telegrinder/node/message.py +0 -14
  186. telegrinder/node/update.py +0 -15
  187. telegrinder/tools/formatting/links.py +0 -38
  188. telegrinder/tools/kb_set/__init__.py +0 -4
  189. telegrinder/tools/kb_set/base.py +0 -15
  190. telegrinder/tools/kb_set/yaml.py +0 -63
  191. telegrinder-0.3.4.dist-info/METADATA +0 -110
  192. telegrinder-0.3.4.dist-info/RECORD +0 -165
@@ -1,42 +1,42 @@
1
- import typing
2
-
3
- from telegrinder.bot.dispatch.context import Context
4
- from telegrinder.types.enums import MessageEntityType
5
-
6
- from .is_from import IsPrivate
7
- from .markup import Markup
8
- from .message import MessageRule
9
- from .message_entities import MessageEntities
10
-
11
-
12
- class StartCommand(
13
- MessageRule,
14
- requires=[
15
- IsPrivate(),
16
- MessageEntities(MessageEntityType.BOT_COMMAND),
17
- Markup(["/start <param>", "/start"]),
18
- ],
19
- ):
20
- def __init__(
21
- self,
22
- validator: typing.Callable[[str], typing.Any | None] | None = None,
23
- *,
24
- param_required: bool = False,
25
- alias: str | None = None,
26
- ) -> None:
27
- self.param_required = param_required
28
- self.validator = validator
29
- self.alias = alias
30
-
31
- def check(self, ctx: Context) -> bool:
32
- param: str | None = ctx.pop("param", None)
33
- validated_param = self.validator(param) if self.validator and param is not None else param
34
-
35
- if self.param_required and validated_param is None:
36
- return False
37
-
38
- ctx.set(self.alias or "param", validated_param)
39
- return True
40
-
41
-
42
- __all__ = ("StartCommand",)
1
+ import typing
2
+
3
+ from telegrinder.bot.dispatch.context import Context
4
+ from telegrinder.types.enums import MessageEntityType
5
+
6
+ from .is_from import IsPrivate
7
+ from .markup import Markup
8
+ from .message import MessageRule
9
+ from .message_entities import MessageEntities
10
+
11
+
12
+ class StartCommand(
13
+ MessageRule,
14
+ requires=[
15
+ IsPrivate(),
16
+ MessageEntities(MessageEntityType.BOT_COMMAND),
17
+ Markup(["/start <param>", "/start"]),
18
+ ],
19
+ ):
20
+ def __init__(
21
+ self,
22
+ validator: typing.Callable[[str], typing.Any | None] | None = None,
23
+ *,
24
+ param_required: bool = False,
25
+ alias: str | None = None,
26
+ ) -> None:
27
+ self.param_required = param_required
28
+ self.validator = validator
29
+ self.alias = alias
30
+
31
+ def check(self, ctx: Context) -> bool:
32
+ param: str | None = ctx.pop("param", None)
33
+ validated_param = self.validator(param) if self.validator and param is not None else param
34
+
35
+ if self.param_required and validated_param is None:
36
+ return False
37
+
38
+ ctx.set(self.alias or "param", validated_param)
39
+ return True
40
+
41
+
42
+ __all__ = ("StartCommand",)
@@ -1,37 +1,35 @@
1
- import dataclasses
2
- import enum
3
- import typing
4
-
5
- from telegrinder.bot.dispatch.context import Context
6
- from telegrinder.bot.rules.abc import ABCRule
7
- from telegrinder.node.source import Source
8
-
9
- if typing.TYPE_CHECKING:
10
- from telegrinder.tools.state_storage.abc import ABCStateStorage
11
-
12
- Payload = typing.TypeVar("Payload")
13
-
14
-
15
- class StateMeta(enum.Enum):
16
- NO_STATE = enum.auto()
17
- ANY = enum.auto()
18
-
19
-
20
- @dataclasses.dataclass(frozen=True, slots=True, repr=False)
21
- class State(ABCRule, typing.Generic[Payload]):
22
- storage: "ABCStateStorage[Payload]"
23
- key: str | StateMeta | enum.Enum
24
-
25
- async def check(self, source: Source, ctx: Context) -> bool:
26
- state = await self.storage.get(source.from_user.id)
27
- if not state:
28
- return self.key == StateMeta.NO_STATE
29
-
30
- if self.key != StateMeta.ANY and self.key != state.unwrap().key:
31
- return False
32
-
33
- ctx["state"] = state.unwrap()
34
- return True
35
-
36
-
37
- __all__ = ("State", "StateMeta")
1
+ import dataclasses
2
+ import enum
3
+ import typing
4
+
5
+ from telegrinder.bot.dispatch.context import Context
6
+ from telegrinder.bot.rules.abc import ABCRule
7
+ from telegrinder.node.source import Source
8
+
9
+ if typing.TYPE_CHECKING:
10
+ from telegrinder.tools.state_storage.abc import ABCStateStorage
11
+
12
+
13
+ class StateMeta(enum.Enum):
14
+ NO_STATE = enum.auto()
15
+ ANY = enum.auto()
16
+
17
+
18
+ @dataclasses.dataclass(frozen=True, slots=True, repr=False)
19
+ class State[Payload](ABCRule):
20
+ storage: "ABCStateStorage[Payload]"
21
+ key: str | StateMeta | enum.Enum
22
+
23
+ async def check(self, source: Source, ctx: Context) -> bool:
24
+ state = await self.storage.get(source.from_user.id)
25
+ if not state:
26
+ return self.key == StateMeta.NO_STATE
27
+
28
+ if self.key != StateMeta.ANY and self.key != state.unwrap().key:
29
+ return False
30
+
31
+ ctx["state"] = state.unwrap()
32
+ return True
33
+
34
+
35
+ __all__ = ("State", "StateMeta")
@@ -1,33 +1,38 @@
1
- import typing
2
-
3
- from telegrinder import node
4
- from telegrinder.tools.i18n.abc import ABCTranslator
5
-
6
- from .abc import ABCRule, with_caching_translations
7
- from .node import NodeRule
8
-
9
-
10
- class HasText(NodeRule):
11
- def __init__(self) -> None:
12
- super().__init__(node.text.Text)
13
-
14
-
15
- class Text(ABCRule):
16
- def __init__(self, texts: str | list[str], *, ignore_case: bool = False) -> None:
17
- if not isinstance(texts, list):
18
- texts = [texts]
19
- self.texts = texts if not ignore_case else list(map(str.lower, texts))
20
- self.ignore_case = ignore_case
21
-
22
- def check(self, text: node.text.Text) -> bool:
23
- return (text if not self.ignore_case else text.lower()) in self.texts
24
-
25
- @with_caching_translations
26
- async def translate(self, translator: ABCTranslator) -> typing.Self:
27
- return self.__class__(
28
- texts=[translator.get(text) for text in self.texts],
29
- ignore_case=self.ignore_case,
30
- )
31
-
32
-
33
- __all__ = ("HasText", "Text")
1
+ import typing
2
+
3
+ from telegrinder import node
4
+ from telegrinder.tools.i18n.abc import ABCTranslator
5
+
6
+ from .abc import ABCRule, with_caching_translations
7
+ from .node import NodeRule
8
+
9
+
10
+ class HasText(NodeRule):
11
+ def __init__(self) -> None:
12
+ super().__init__(node.as_node(node.text.Text))
13
+
14
+
15
+ class HasCaption(NodeRule):
16
+ def __init__(self) -> None:
17
+ super().__init__(node.as_node(node.text.Caption))
18
+
19
+
20
+ class Text(ABCRule):
21
+ def __init__(self, texts: str | list[str], /, *, ignore_case: bool = False) -> None:
22
+ if not isinstance(texts, list):
23
+ texts = [texts]
24
+ self.texts = texts if not ignore_case else list(map(str.lower, texts))
25
+ self.ignore_case = ignore_case
26
+
27
+ def check(self, text: node.either.Either[node.text.Text, node.text.Caption]) -> bool:
28
+ return (text if not self.ignore_case else text.lower()) in self.texts
29
+
30
+ @with_caching_translations
31
+ async def translate(self, translator: ABCTranslator) -> typing.Self:
32
+ return self.__class__(
33
+ [translator.get(text) for text in self.texts],
34
+ ignore_case=self.ignore_case,
35
+ )
36
+
37
+
38
+ __all__ = ("HasCaption", "HasText", "Text")
@@ -1,15 +1,15 @@
1
- from telegrinder.bot.cute_types.update import UpdateCute
2
- from telegrinder.types.enums import UpdateType
3
-
4
- from .abc import ABCRule
5
-
6
-
7
- class IsUpdateType(ABCRule):
8
- def __init__(self, update_type: UpdateType, /) -> None:
9
- self.update_type = update_type
10
-
11
- def check(self, event: UpdateCute) -> bool:
12
- return event.update_type == self.update_type
13
-
14
-
15
- __all__ = ("IsUpdateType",)
1
+ from telegrinder.bot.cute_types.update import UpdateCute
2
+ from telegrinder.types.enums import UpdateType
3
+
4
+ from .abc import ABCRule
5
+
6
+
7
+ class IsUpdateType(ABCRule):
8
+ def __init__(self, update_type: UpdateType, /) -> None:
9
+ self.update_type = update_type
10
+
11
+ def check(self, event: UpdateCute) -> bool:
12
+ return event.update_type == self.update_type
13
+
14
+
15
+ __all__ = ("IsUpdateType",)
@@ -1,5 +1,5 @@
1
- from .abc import ABCScenario
2
- from .checkbox import Checkbox
3
- from .choice import Choice
4
-
5
- __all__ = ("ABCScenario", "Checkbox", "Choice")
1
+ from .abc import ABCScenario
2
+ from .checkbox import Checkbox
3
+ from .choice import Choice
4
+
5
+ __all__ = ("ABCScenario", "Checkbox", "Choice")
@@ -1,19 +1,17 @@
1
- import typing
2
- from abc import ABC, abstractmethod
3
-
4
- from telegrinder.bot.cute_types.base import BaseCute
5
-
6
- if typing.TYPE_CHECKING:
7
- from telegrinder.api import API
8
- from telegrinder.bot.dispatch.view.abc import ABCStateView
9
-
10
- EventT = typing.TypeVar("EventT", bound=BaseCute)
11
-
12
-
13
- class ABCScenario(ABC, typing.Generic[EventT]):
14
- @abstractmethod
15
- def wait(self, api: "API", view: "ABCStateView[EventT]") -> typing.Any:
16
- pass
17
-
18
-
19
- __all__ = ("ABCScenario",)
1
+ import typing
2
+ from abc import ABC, abstractmethod
3
+
4
+ from telegrinder.bot.cute_types.base import BaseCute
5
+
6
+ if typing.TYPE_CHECKING:
7
+ from telegrinder.api import API
8
+ from telegrinder.bot.dispatch.view.abc import ABCStateView
9
+
10
+
11
+ class ABCScenario[Event: BaseCute](ABC):
12
+ @abstractmethod
13
+ def wait(self, api: "API", view: "ABCStateView[Event]") -> typing.Any:
14
+ pass
15
+
16
+
17
+ __all__ = ("ABCScenario",)