telegrinder 0.3.3.post1__py3-none-any.whl → 0.3.4.post1__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 (165) hide show
  1. telegrinder/__init__.py +144 -144
  2. telegrinder/api/__init__.py +8 -8
  3. telegrinder/api/api.py +93 -93
  4. telegrinder/api/error.py +16 -16
  5. telegrinder/api/response.py +20 -20
  6. telegrinder/api/token.py +36 -36
  7. telegrinder/bot/__init__.py +66 -66
  8. telegrinder/bot/bot.py +76 -76
  9. telegrinder/bot/cute_types/__init__.py +17 -17
  10. telegrinder/bot/cute_types/base.py +258 -258
  11. telegrinder/bot/cute_types/callback_query.py +385 -385
  12. telegrinder/bot/cute_types/chat_join_request.py +61 -61
  13. telegrinder/bot/cute_types/chat_member_updated.py +160 -160
  14. telegrinder/bot/cute_types/inline_query.py +43 -43
  15. telegrinder/bot/cute_types/message.py +2637 -2637
  16. telegrinder/bot/cute_types/update.py +104 -109
  17. telegrinder/bot/cute_types/utils.py +95 -95
  18. telegrinder/bot/dispatch/__init__.py +55 -55
  19. telegrinder/bot/dispatch/abc.py +77 -77
  20. telegrinder/bot/dispatch/context.py +98 -98
  21. telegrinder/bot/dispatch/dispatch.py +202 -202
  22. telegrinder/bot/dispatch/handler/__init__.py +13 -13
  23. telegrinder/bot/dispatch/handler/abc.py +24 -24
  24. telegrinder/bot/dispatch/handler/audio_reply.py +44 -44
  25. telegrinder/bot/dispatch/handler/base.py +57 -57
  26. telegrinder/bot/dispatch/handler/document_reply.py +44 -44
  27. telegrinder/bot/dispatch/handler/func.py +135 -135
  28. telegrinder/bot/dispatch/handler/media_group_reply.py +43 -43
  29. telegrinder/bot/dispatch/handler/message_reply.py +36 -36
  30. telegrinder/bot/dispatch/handler/photo_reply.py +44 -44
  31. telegrinder/bot/dispatch/handler/sticker_reply.py +37 -37
  32. telegrinder/bot/dispatch/handler/video_reply.py +44 -44
  33. telegrinder/bot/dispatch/middleware/__init__.py +3 -3
  34. telegrinder/bot/dispatch/middleware/abc.py +22 -16
  35. telegrinder/bot/dispatch/process.py +157 -132
  36. telegrinder/bot/dispatch/return_manager/__init__.py +13 -13
  37. telegrinder/bot/dispatch/return_manager/abc.py +108 -108
  38. telegrinder/bot/dispatch/return_manager/callback_query.py +20 -20
  39. telegrinder/bot/dispatch/return_manager/inline_query.py +15 -15
  40. telegrinder/bot/dispatch/return_manager/message.py +36 -36
  41. telegrinder/bot/dispatch/view/__init__.py +13 -13
  42. telegrinder/bot/dispatch/view/abc.py +41 -41
  43. telegrinder/bot/dispatch/view/base.py +200 -200
  44. telegrinder/bot/dispatch/view/box.py +129 -129
  45. telegrinder/bot/dispatch/view/callback_query.py +17 -17
  46. telegrinder/bot/dispatch/view/chat_join_request.py +16 -16
  47. telegrinder/bot/dispatch/view/chat_member.py +39 -39
  48. telegrinder/bot/dispatch/view/inline_query.py +17 -17
  49. telegrinder/bot/dispatch/view/message.py +44 -44
  50. telegrinder/bot/dispatch/view/raw.py +114 -114
  51. telegrinder/bot/dispatch/waiter_machine/__init__.py +17 -17
  52. telegrinder/bot/dispatch/waiter_machine/actions.py +13 -13
  53. telegrinder/bot/dispatch/waiter_machine/hasher/__init__.py +8 -8
  54. telegrinder/bot/dispatch/waiter_machine/hasher/callback.py +55 -55
  55. telegrinder/bot/dispatch/waiter_machine/hasher/hasher.py +57 -57
  56. telegrinder/bot/dispatch/waiter_machine/hasher/message.py +51 -51
  57. telegrinder/bot/dispatch/waiter_machine/hasher/state.py +19 -19
  58. telegrinder/bot/dispatch/waiter_machine/machine.py +172 -167
  59. telegrinder/bot/dispatch/waiter_machine/middleware.py +89 -89
  60. telegrinder/bot/dispatch/waiter_machine/short_state.py +68 -68
  61. telegrinder/bot/polling/__init__.py +4 -4
  62. telegrinder/bot/polling/abc.py +25 -25
  63. telegrinder/bot/polling/polling.py +131 -131
  64. telegrinder/bot/rules/__init__.py +62 -62
  65. telegrinder/bot/rules/abc.py +213 -213
  66. telegrinder/bot/rules/adapter/__init__.py +12 -9
  67. telegrinder/bot/rules/adapter/abc.py +31 -29
  68. telegrinder/bot/rules/adapter/errors.py +5 -5
  69. telegrinder/bot/rules/adapter/event.py +65 -67
  70. telegrinder/bot/rules/adapter/node.py +48 -48
  71. telegrinder/bot/rules/adapter/raw_event.py +27 -0
  72. telegrinder/bot/rules/adapter/raw_update.py +30 -30
  73. telegrinder/bot/rules/callback_data.py +170 -170
  74. telegrinder/bot/rules/chat_join.py +46 -46
  75. telegrinder/bot/rules/command.py +126 -126
  76. telegrinder/bot/rules/enum_text.py +36 -36
  77. telegrinder/bot/rules/func.py +26 -26
  78. telegrinder/bot/rules/fuzzy.py +24 -24
  79. telegrinder/bot/rules/inline.py +60 -60
  80. telegrinder/bot/rules/integer.py +20 -20
  81. telegrinder/bot/rules/is_from.py +127 -127
  82. telegrinder/bot/rules/markup.py +43 -43
  83. telegrinder/bot/rules/mention.py +14 -14
  84. telegrinder/bot/rules/message.py +17 -17
  85. telegrinder/bot/rules/message_entities.py +35 -35
  86. telegrinder/bot/rules/node.py +27 -27
  87. telegrinder/bot/rules/regex.py +37 -37
  88. telegrinder/bot/rules/rule_enum.py +72 -72
  89. telegrinder/bot/rules/start.py +42 -42
  90. telegrinder/bot/rules/state.py +37 -37
  91. telegrinder/bot/rules/text.py +33 -33
  92. telegrinder/bot/rules/update.py +15 -15
  93. telegrinder/bot/scenario/__init__.py +5 -5
  94. telegrinder/bot/scenario/abc.py +19 -19
  95. telegrinder/bot/scenario/checkbox.py +176 -167
  96. telegrinder/bot/scenario/choice.py +51 -46
  97. telegrinder/client/__init__.py +4 -4
  98. telegrinder/client/abc.py +75 -75
  99. telegrinder/client/aiohttp.py +130 -130
  100. telegrinder/model.py +320 -295
  101. telegrinder/modules.py +237 -237
  102. telegrinder/msgspec_json.py +14 -14
  103. telegrinder/msgspec_utils.py +410 -410
  104. telegrinder/node/__init__.py +0 -0
  105. telegrinder/node/attachment.py +87 -87
  106. telegrinder/node/base.py +166 -166
  107. telegrinder/node/callback_query.py +53 -53
  108. telegrinder/node/command.py +33 -33
  109. telegrinder/node/composer.py +198 -198
  110. telegrinder/node/container.py +27 -27
  111. telegrinder/node/event.py +65 -65
  112. telegrinder/node/me.py +16 -16
  113. telegrinder/node/message.py +14 -14
  114. telegrinder/node/polymorphic.py +48 -48
  115. telegrinder/node/rule.py +76 -76
  116. telegrinder/node/scope.py +38 -38
  117. telegrinder/node/source.py +71 -71
  118. telegrinder/node/text.py +41 -41
  119. telegrinder/node/tools/__init__.py +3 -3
  120. telegrinder/node/tools/generator.py +40 -40
  121. telegrinder/node/update.py +15 -15
  122. telegrinder/rules.py +0 -0
  123. telegrinder/tools/__init__.py +74 -74
  124. telegrinder/tools/buttons.py +79 -79
  125. telegrinder/tools/error_handler/__init__.py +7 -7
  126. telegrinder/tools/error_handler/abc.py +33 -33
  127. telegrinder/tools/error_handler/error.py +9 -9
  128. telegrinder/tools/error_handler/error_handler.py +193 -193
  129. telegrinder/tools/formatting/__init__.py +46 -46
  130. telegrinder/tools/formatting/html.py +283 -283
  131. telegrinder/tools/formatting/links.py +33 -33
  132. telegrinder/tools/formatting/spec_html_formats.py +111 -111
  133. telegrinder/tools/functional.py +12 -12
  134. telegrinder/tools/global_context/__init__.py +7 -7
  135. telegrinder/tools/global_context/abc.py +63 -63
  136. telegrinder/tools/global_context/global_context.py +412 -412
  137. telegrinder/tools/global_context/telegrinder_ctx.py +27 -27
  138. telegrinder/tools/i18n/__init__.py +7 -7
  139. telegrinder/tools/i18n/abc.py +30 -30
  140. telegrinder/tools/i18n/middleware/__init__.py +3 -3
  141. telegrinder/tools/i18n/middleware/abc.py +25 -25
  142. telegrinder/tools/i18n/simple.py +43 -43
  143. telegrinder/tools/kb_set/__init__.py +4 -4
  144. telegrinder/tools/kb_set/base.py +15 -15
  145. telegrinder/tools/kb_set/yaml.py +63 -63
  146. telegrinder/tools/keyboard.py +132 -132
  147. telegrinder/tools/limited_dict.py +37 -37
  148. telegrinder/tools/loop_wrapper/__init__.py +4 -4
  149. telegrinder/tools/loop_wrapper/abc.py +15 -15
  150. telegrinder/tools/loop_wrapper/loop_wrapper.py +224 -224
  151. telegrinder/tools/magic.py +157 -157
  152. telegrinder/tools/parse_mode.py +6 -6
  153. telegrinder/tools/state_storage/__init__.py +4 -4
  154. telegrinder/tools/state_storage/abc.py +35 -35
  155. telegrinder/tools/state_storage/memory.py +25 -25
  156. telegrinder/types/__init__.py +260 -260
  157. telegrinder/types/enums.py +701 -701
  158. telegrinder/types/methods.py +4633 -4633
  159. telegrinder/types/objects.py +6950 -8561
  160. telegrinder/verification_utils.py +32 -32
  161. {telegrinder-0.3.3.post1.dist-info → telegrinder-0.3.4.post1.dist-info}/LICENSE +22 -22
  162. {telegrinder-0.3.3.post1.dist-info → telegrinder-0.3.4.post1.dist-info}/METADATA +1 -1
  163. telegrinder-0.3.4.post1.dist-info/RECORD +165 -0
  164. telegrinder-0.3.3.post1.dist-info/RECORD +0 -164
  165. {telegrinder-0.3.3.post1.dist-info → telegrinder-0.3.4.post1.dist-info}/WHEEL +0 -0
@@ -1,40 +1,40 @@
1
- import inspect
2
- import typing
3
-
4
- from telegrinder.node.base import ComposeError, Node
5
- from telegrinder.node.container import ContainerNode
6
-
7
- T = typing.TypeVar("T")
8
-
9
-
10
- def cast_false_to_none(value: T) -> T | None:
11
- if value is False:
12
- return None
13
- return value
14
-
15
-
16
- def error_on_none(value: T | None) -> T:
17
- if value is None:
18
- raise ComposeError
19
- return value
20
-
21
-
22
- def generate_node(
23
- subnodes: tuple[type[Node], ...],
24
- func: typing.Callable[..., typing.Any],
25
- casts: tuple[typing.Callable[[typing.Any], typing.Any], ...] = (cast_false_to_none, error_on_none),
26
- ) -> type[Node]:
27
- async def compose(cls, **kw) -> typing.Any:
28
- result = func(*ContainerNode.compose(**kw)) # type: ignore
29
- if inspect.isawaitable(result):
30
- result = await result
31
- for cast in casts:
32
- result = cast(result)
33
- return result
34
-
35
- container = ContainerNode.link_nodes(list(subnodes))
36
- compose.__annotations__ = container.get_subnodes()
37
- return type("_ContainerNode", (container,), {"compose": classmethod(compose)})
38
-
39
-
40
- __all__ = ("generate_node",)
1
+ import inspect
2
+ import typing
3
+
4
+ from telegrinder.node.base import ComposeError, Node
5
+ from telegrinder.node.container import ContainerNode
6
+
7
+ T = typing.TypeVar("T")
8
+
9
+
10
+ def cast_false_to_none(value: T) -> T | None:
11
+ if value is False:
12
+ return None
13
+ return value
14
+
15
+
16
+ def error_on_none(value: T | None) -> T:
17
+ if value is None:
18
+ raise ComposeError
19
+ return value
20
+
21
+
22
+ def generate_node(
23
+ subnodes: tuple[type[Node], ...],
24
+ func: typing.Callable[..., typing.Any],
25
+ casts: tuple[typing.Callable[[typing.Any], typing.Any], ...] = (cast_false_to_none, error_on_none),
26
+ ) -> type[Node]:
27
+ async def compose(cls, **kw) -> typing.Any:
28
+ result = func(*ContainerNode.compose(**kw)) # type: ignore
29
+ if inspect.isawaitable(result):
30
+ result = await result
31
+ for cast in casts:
32
+ result = cast(result)
33
+ return result
34
+
35
+ container = ContainerNode.link_nodes(list(subnodes))
36
+ compose.__annotations__ = container.get_subnodes()
37
+ return type("_ContainerNode", (container,), {"compose": classmethod(compose)})
38
+
39
+
40
+ __all__ = ("generate_node",)
@@ -1,15 +1,15 @@
1
- from telegrinder.api.api import API
2
- from telegrinder.bot.cute_types import UpdateCute
3
- from telegrinder.node.base import ScalarNode
4
- from telegrinder.types.objects import Update
5
-
6
-
7
- class UpdateNode(ScalarNode, UpdateCute):
8
- @classmethod
9
- def compose(cls, update: Update, api: API) -> UpdateCute:
10
- if isinstance(update, UpdateCute):
11
- return update
12
- return UpdateCute.from_update(update, api)
13
-
14
-
15
- __all__ = ("UpdateNode",)
1
+ from telegrinder.api.api import API
2
+ from telegrinder.bot.cute_types import UpdateCute
3
+ from telegrinder.node.base import ScalarNode
4
+ from telegrinder.types.objects import Update
5
+
6
+
7
+ class UpdateNode(ScalarNode, UpdateCute):
8
+ @classmethod
9
+ def compose(cls, update: Update, api: API) -> UpdateCute:
10
+ if isinstance(update, UpdateCute):
11
+ return update
12
+ return UpdateCute.from_update(update, api)
13
+
14
+
15
+ __all__ = ("UpdateNode",)
telegrinder/rules.py CHANGED
File without changes
@@ -1,75 +1,75 @@
1
- from .buttons import BaseButton
2
- from .error_handler import ABCErrorHandler, Catcher, CatcherError, ErrorHandler
3
- from .formatting import (
4
- BaseSpecFormat,
5
- ChannelBoostLink,
6
- FormatString,
7
- HTMLFormatter,
8
- InviteChatLink,
9
- Link,
10
- Mention,
11
- PreCode,
12
- ResolveDomain,
13
- SpecialFormat,
14
- StartBotLink,
15
- StartGroupLink,
16
- TgEmoji,
17
- block_quote,
18
- bold,
19
- channel_boost_link,
20
- code_inline,
21
- escape,
22
- get_channel_boost_link,
23
- get_invite_chat_link,
24
- get_mention_link,
25
- get_resolve_domain_link,
26
- get_start_bot_link,
27
- get_start_group_link,
28
- invite_chat_link,
29
- italic,
30
- link,
31
- mention,
32
- pre_code,
33
- resolve_domain,
34
- spoiler,
35
- start_bot_link,
36
- start_group_link,
37
- strike,
38
- tg_emoji,
39
- underline,
40
- )
41
- from .global_context import (
42
- ABCGlobalContext,
43
- CtxVar,
44
- GlobalContext,
45
- GlobalCtxVar,
46
- TelegrinderContext,
47
- ctx_var,
48
- )
49
- from .i18n import (
50
- ABCI18n,
51
- ABCTranslator,
52
- ABCTranslatorMiddleware,
53
- I18nEnum,
54
- SimpleI18n,
55
- SimpleTranslator,
56
- )
57
- from .kb_set import KeyboardSetBase, KeyboardSetYAML
58
- from .keyboard import (
59
- AnyMarkup,
60
- Button,
61
- InlineButton,
62
- InlineKeyboard,
63
- Keyboard,
64
- RowButtons,
65
- )
66
- from .limited_dict import LimitedDict
67
- from .loop_wrapper import ABCLoopWrapper, DelayedTask, Lifespan, LoopWrapper
68
- from .magic import impl, magic_bundle, resolve_arg_names
69
- from .parse_mode import ParseMode
70
- from .state_storage import ABCStateStorage, MemoryStateStorage, StateData
71
-
72
- __all__ = (
1
+ from .buttons import BaseButton
2
+ from .error_handler import ABCErrorHandler, Catcher, CatcherError, ErrorHandler
3
+ from .formatting import (
4
+ BaseSpecFormat,
5
+ ChannelBoostLink,
6
+ FormatString,
7
+ HTMLFormatter,
8
+ InviteChatLink,
9
+ Link,
10
+ Mention,
11
+ PreCode,
12
+ ResolveDomain,
13
+ SpecialFormat,
14
+ StartBotLink,
15
+ StartGroupLink,
16
+ TgEmoji,
17
+ block_quote,
18
+ bold,
19
+ channel_boost_link,
20
+ code_inline,
21
+ escape,
22
+ get_channel_boost_link,
23
+ get_invite_chat_link,
24
+ get_mention_link,
25
+ get_resolve_domain_link,
26
+ get_start_bot_link,
27
+ get_start_group_link,
28
+ invite_chat_link,
29
+ italic,
30
+ link,
31
+ mention,
32
+ pre_code,
33
+ resolve_domain,
34
+ spoiler,
35
+ start_bot_link,
36
+ start_group_link,
37
+ strike,
38
+ tg_emoji,
39
+ underline,
40
+ )
41
+ from .global_context import (
42
+ ABCGlobalContext,
43
+ CtxVar,
44
+ GlobalContext,
45
+ GlobalCtxVar,
46
+ TelegrinderContext,
47
+ ctx_var,
48
+ )
49
+ from .i18n import (
50
+ ABCI18n,
51
+ ABCTranslator,
52
+ ABCTranslatorMiddleware,
53
+ I18nEnum,
54
+ SimpleI18n,
55
+ SimpleTranslator,
56
+ )
57
+ from .kb_set import KeyboardSetBase, KeyboardSetYAML
58
+ from .keyboard import (
59
+ AnyMarkup,
60
+ Button,
61
+ InlineButton,
62
+ InlineKeyboard,
63
+ Keyboard,
64
+ RowButtons,
65
+ )
66
+ from .limited_dict import LimitedDict
67
+ from .loop_wrapper import ABCLoopWrapper, DelayedTask, Lifespan, LoopWrapper
68
+ from .magic import impl, magic_bundle, resolve_arg_names
69
+ from .parse_mode import ParseMode
70
+ from .state_storage import ABCStateStorage, MemoryStateStorage, StateData
71
+
72
+ __all__ = (
73
73
  "ABCErrorHandler",
74
74
  "ABCGlobalContext",
75
75
  "ABCI18n",
@@ -142,5 +142,5 @@ __all__ = (
142
142
  "start_group_link",
143
143
  "strike",
144
144
  "tg_emoji",
145
- "underline",
146
- )
145
+ "underline",
146
+ )
@@ -1,83 +1,83 @@
1
- import dataclasses
2
- import typing
3
-
4
- import msgspec
5
-
6
- from telegrinder.msgspec_utils import DataclassInstance, encoder
7
- from telegrinder.types.objects import (
8
- CallbackGame,
9
- KeyboardButtonPollType,
10
- KeyboardButtonRequestChat,
11
- KeyboardButtonRequestUsers,
12
- LoginUrl,
13
- SwitchInlineQueryChosenChat,
14
- WebAppInfo,
15
- )
16
-
17
- KeyboardButton = typing.TypeVar("KeyboardButton", bound="BaseButton")
18
-
19
-
20
- @dataclasses.dataclass
21
- class BaseButton:
22
- def get_data(self) -> dict[str, typing.Any]:
23
- return {
24
- k: v if k != "callback_data" or isinstance(v, str) else encoder.encode(v)
25
- for k, v in dataclasses.asdict(self).items()
26
- if v is not None
27
- }
28
-
29
-
30
- class RowButtons(typing.Generic[KeyboardButton]):
31
- buttons: list[KeyboardButton]
32
- auto_row: bool
33
-
34
- def __init__(self, *buttons: KeyboardButton, auto_row: bool = True) -> None:
35
- self.buttons = list(buttons)
36
- self.auto_row = auto_row
37
-
38
- def get_data(self) -> list[dict[str, typing.Any]]:
39
- return [b.get_data() for b in self.buttons]
40
-
41
-
42
- @dataclasses.dataclass(slots=True)
43
- class Button(BaseButton):
44
- text: str
45
- request_contact: bool = dataclasses.field(default=False, kw_only=True)
46
- request_location: bool = dataclasses.field(default=False, kw_only=True)
47
- request_chat: dict[str, typing.Any] | KeyboardButtonRequestChat | None = dataclasses.field(
48
- default=None, kw_only=True
49
- )
50
- request_user: dict[str, typing.Any] | KeyboardButtonRequestUsers | None = dataclasses.field(
51
- default=None, kw_only=True
52
- )
53
- request_poll: dict[str, typing.Any] | KeyboardButtonPollType | None = dataclasses.field(
54
- default=None, kw_only=True
55
- )
56
- web_app: dict[str, typing.Any] | WebAppInfo | None = dataclasses.field(default=None, kw_only=True)
57
-
58
-
59
- @dataclasses.dataclass(slots=True)
60
- class InlineButton(BaseButton):
61
- text: str
62
- url: str | None = dataclasses.field(default=None, kw_only=True)
63
- login_url: dict[str, typing.Any] | LoginUrl | None = dataclasses.field(default=None, kw_only=True)
64
- pay: bool | None = dataclasses.field(default=None, kw_only=True)
65
- callback_data: str | dict[str, typing.Any] | DataclassInstance | msgspec.Struct | None = (
66
- dataclasses.field(default=None, kw_only=True)
67
- )
68
- callback_game: dict[str, typing.Any] | CallbackGame | None = dataclasses.field(default=None, kw_only=True)
69
- switch_inline_query: str | None = dataclasses.field(default=None, kw_only=True)
70
- switch_inline_query_current_chat: str | None = dataclasses.field(default=None, kw_only=True)
71
- switch_inline_query_chosen_chat: dict[str, typing.Any] | SwitchInlineQueryChosenChat | None = (
72
- dataclasses.field(default=None, kw_only=True)
73
- )
74
- web_app: dict[str, typing.Any] | WebAppInfo | None = dataclasses.field(default=None, kw_only=True)
75
-
76
-
77
- __all__ = (
1
+ import dataclasses
2
+ import typing
3
+
4
+ import msgspec
5
+
6
+ from telegrinder.msgspec_utils import DataclassInstance, encoder
7
+ from telegrinder.types.objects import (
8
+ CallbackGame,
9
+ KeyboardButtonPollType,
10
+ KeyboardButtonRequestChat,
11
+ KeyboardButtonRequestUsers,
12
+ LoginUrl,
13
+ SwitchInlineQueryChosenChat,
14
+ WebAppInfo,
15
+ )
16
+
17
+ KeyboardButton = typing.TypeVar("KeyboardButton", bound="BaseButton")
18
+
19
+
20
+ @dataclasses.dataclass
21
+ class BaseButton:
22
+ def get_data(self) -> dict[str, typing.Any]:
23
+ return {
24
+ k: v if k != "callback_data" or isinstance(v, str) else encoder.encode(v)
25
+ for k, v in dataclasses.asdict(self).items()
26
+ if v is not None
27
+ }
28
+
29
+
30
+ class RowButtons(typing.Generic[KeyboardButton]):
31
+ buttons: list[KeyboardButton]
32
+ auto_row: bool
33
+
34
+ def __init__(self, *buttons: KeyboardButton, auto_row: bool = True) -> None:
35
+ self.buttons = list(buttons)
36
+ self.auto_row = auto_row
37
+
38
+ def get_data(self) -> list[dict[str, typing.Any]]:
39
+ return [b.get_data() for b in self.buttons]
40
+
41
+
42
+ @dataclasses.dataclass(slots=True)
43
+ class Button(BaseButton):
44
+ text: str
45
+ request_contact: bool = dataclasses.field(default=False, kw_only=True)
46
+ request_location: bool = dataclasses.field(default=False, kw_only=True)
47
+ request_chat: dict[str, typing.Any] | KeyboardButtonRequestChat | None = dataclasses.field(
48
+ default=None, kw_only=True
49
+ )
50
+ request_user: dict[str, typing.Any] | KeyboardButtonRequestUsers | None = dataclasses.field(
51
+ default=None, kw_only=True
52
+ )
53
+ request_poll: dict[str, typing.Any] | KeyboardButtonPollType | None = dataclasses.field(
54
+ default=None, kw_only=True
55
+ )
56
+ web_app: dict[str, typing.Any] | WebAppInfo | None = dataclasses.field(default=None, kw_only=True)
57
+
58
+
59
+ @dataclasses.dataclass(slots=True)
60
+ class InlineButton(BaseButton):
61
+ text: str
62
+ url: str | None = dataclasses.field(default=None, kw_only=True)
63
+ login_url: dict[str, typing.Any] | LoginUrl | None = dataclasses.field(default=None, kw_only=True)
64
+ pay: bool | None = dataclasses.field(default=None, kw_only=True)
65
+ callback_data: str | dict[str, typing.Any] | DataclassInstance | msgspec.Struct | None = (
66
+ dataclasses.field(default=None, kw_only=True)
67
+ )
68
+ callback_game: dict[str, typing.Any] | CallbackGame | None = dataclasses.field(default=None, kw_only=True)
69
+ switch_inline_query: str | None = dataclasses.field(default=None, kw_only=True)
70
+ switch_inline_query_current_chat: str | None = dataclasses.field(default=None, kw_only=True)
71
+ switch_inline_query_chosen_chat: dict[str, typing.Any] | SwitchInlineQueryChosenChat | None = (
72
+ dataclasses.field(default=None, kw_only=True)
73
+ )
74
+ web_app: dict[str, typing.Any] | WebAppInfo | None = dataclasses.field(default=None, kw_only=True)
75
+
76
+
77
+ __all__ = (
78
78
  "BaseButton",
79
79
  "Button",
80
80
  "DataclassInstance",
81
81
  "InlineButton",
82
- "RowButtons",
83
- )
82
+ "RowButtons",
83
+ )
@@ -1,10 +1,10 @@
1
- from .abc import ABCErrorHandler
2
- from .error import CatcherError
3
- from .error_handler import Catcher, ErrorHandler
4
-
5
- __all__ = (
1
+ from .abc import ABCErrorHandler
2
+ from .error import CatcherError
3
+ from .error_handler import Catcher, ErrorHandler
4
+
5
+ __all__ = (
6
6
  "ABCErrorHandler",
7
7
  "Catcher",
8
8
  "CatcherError",
9
- "ErrorHandler",
10
- )
9
+ "ErrorHandler",
10
+ )
@@ -1,33 +1,33 @@
1
- import typing
2
- from abc import ABC, abstractmethod
3
-
4
- from fntypes.result import Result
5
-
6
- from telegrinder.api import API
7
- from telegrinder.bot.dispatch.context import Context
8
-
9
- Event = typing.TypeVar("Event")
10
- Handler = typing.Callable[..., typing.Awaitable[typing.Any]]
11
-
12
-
13
- class ABCErrorHandler(ABC, typing.Generic[Event]):
14
- @abstractmethod
15
- def __call__(
16
- self,
17
- *args: typing.Any,
18
- **kwargs: typing.Any,
19
- ) -> typing.Callable[[typing.Callable[..., typing.Any]], typing.Callable[..., typing.Any]]:
20
- """Decorator for registering callback as a catcher for the error handler."""
21
-
22
- @abstractmethod
23
- async def run(
24
- self,
25
- handler: Handler,
26
- event: Event,
27
- api: API,
28
- ctx: Context,
29
- ) -> Result[typing.Any, typing.Any]:
30
- """Run the error handler."""
31
-
32
-
33
- __all__ = ("ABCErrorHandler",)
1
+ import typing
2
+ from abc import ABC, abstractmethod
3
+
4
+ from fntypes.result import Result
5
+
6
+ from telegrinder.api import API
7
+ from telegrinder.bot.dispatch.context import Context
8
+
9
+ Event = typing.TypeVar("Event")
10
+ Handler = typing.Callable[..., typing.Awaitable[typing.Any]]
11
+
12
+
13
+ class ABCErrorHandler(ABC, typing.Generic[Event]):
14
+ @abstractmethod
15
+ def __call__(
16
+ self,
17
+ *args: typing.Any,
18
+ **kwargs: typing.Any,
19
+ ) -> typing.Callable[[typing.Callable[..., typing.Any]], typing.Callable[..., typing.Any]]:
20
+ """Decorator for registering callback as a catcher for the error handler."""
21
+
22
+ @abstractmethod
23
+ async def run(
24
+ self,
25
+ handler: Handler,
26
+ event: Event,
27
+ api: API,
28
+ ctx: Context,
29
+ ) -> Result[typing.Any, typing.Any]:
30
+ """Run the error handler."""
31
+
32
+
33
+ __all__ = ("ABCErrorHandler",)
@@ -1,9 +1,9 @@
1
- class CatcherError(BaseException):
2
- __slots__ = ("exc", "message")
3
-
4
- def __init__(self, exc: BaseException, message: str) -> None:
5
- self.exc = exc
6
- self.message = message
7
-
8
-
9
- __all__ = ("CatcherError",)
1
+ class CatcherError(BaseException):
2
+ __slots__ = ("exc", "message")
3
+
4
+ def __init__(self, exc: BaseException, message: str) -> None:
5
+ self.exc = exc
6
+ self.message = message
7
+
8
+
9
+ __all__ = ("CatcherError",)