telegrinder 0.3.1__py3-none-any.whl → 0.3.3__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 (164) 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 -234
  11. telegrinder/bot/cute_types/callback_query.py +385 -382
  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 -53
  15. telegrinder/bot/cute_types/message.py +2637 -2631
  16. telegrinder/bot/cute_types/update.py +109 -75
  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 -92
  21. telegrinder/bot/dispatch/dispatch.py +202 -201
  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 -123
  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 +16 -16
  35. telegrinder/bot/dispatch/process.py +132 -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 -211
  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 -118
  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 +167 -170
  59. telegrinder/bot/dispatch/waiter_machine/middleware.py +89 -89
  60. telegrinder/bot/dispatch/waiter_machine/short_state.py +68 -65
  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 -238
  66. telegrinder/bot/rules/adapter/__init__.py +9 -9
  67. telegrinder/bot/rules/adapter/abc.py +29 -29
  68. telegrinder/bot/rules/adapter/errors.py +5 -5
  69. telegrinder/bot/rules/adapter/event.py +67 -76
  70. telegrinder/bot/rules/adapter/node.py +48 -48
  71. telegrinder/bot/rules/adapter/raw_update.py +30 -30
  72. telegrinder/bot/rules/callback_data.py +170 -171
  73. telegrinder/bot/rules/chat_join.py +46 -48
  74. telegrinder/bot/rules/command.py +126 -126
  75. telegrinder/bot/rules/enum_text.py +36 -36
  76. telegrinder/bot/rules/func.py +26 -26
  77. telegrinder/bot/rules/fuzzy.py +24 -24
  78. telegrinder/bot/rules/inline.py +60 -60
  79. telegrinder/bot/rules/integer.py +20 -20
  80. telegrinder/bot/rules/is_from.py +127 -127
  81. telegrinder/bot/rules/markup.py +43 -43
  82. telegrinder/bot/rules/mention.py +14 -14
  83. telegrinder/bot/rules/message.py +17 -17
  84. telegrinder/bot/rules/message_entities.py +35 -35
  85. telegrinder/bot/rules/node.py +27 -27
  86. telegrinder/bot/rules/regex.py +37 -37
  87. telegrinder/bot/rules/rule_enum.py +72 -72
  88. telegrinder/bot/rules/start.py +42 -42
  89. telegrinder/bot/rules/state.py +37 -37
  90. telegrinder/bot/rules/text.py +33 -33
  91. telegrinder/bot/rules/update.py +15 -15
  92. telegrinder/bot/scenario/__init__.py +5 -5
  93. telegrinder/bot/scenario/abc.py +19 -19
  94. telegrinder/bot/scenario/checkbox.py +167 -147
  95. telegrinder/bot/scenario/choice.py +46 -44
  96. telegrinder/client/__init__.py +4 -4
  97. telegrinder/client/abc.py +75 -75
  98. telegrinder/client/aiohttp.py +130 -130
  99. telegrinder/model.py +295 -244
  100. telegrinder/modules.py +237 -237
  101. telegrinder/msgspec_json.py +14 -14
  102. telegrinder/msgspec_utils.py +410 -410
  103. telegrinder/node/__init__.py +7 -3
  104. telegrinder/node/attachment.py +87 -87
  105. telegrinder/node/base.py +166 -144
  106. telegrinder/node/callback_query.py +53 -14
  107. telegrinder/node/command.py +33 -33
  108. telegrinder/node/composer.py +198 -184
  109. telegrinder/node/container.py +27 -27
  110. telegrinder/node/event.py +65 -73
  111. telegrinder/node/me.py +16 -16
  112. telegrinder/node/message.py +14 -14
  113. telegrinder/node/polymorphic.py +48 -52
  114. telegrinder/node/rule.py +76 -76
  115. telegrinder/node/scope.py +38 -38
  116. telegrinder/node/source.py +71 -71
  117. telegrinder/node/text.py +41 -21
  118. telegrinder/node/tools/__init__.py +3 -3
  119. telegrinder/node/tools/generator.py +40 -40
  120. telegrinder/node/update.py +15 -15
  121. telegrinder/rules.py +0 -0
  122. telegrinder/tools/__init__.py +74 -74
  123. telegrinder/tools/buttons.py +79 -79
  124. telegrinder/tools/error_handler/__init__.py +7 -7
  125. telegrinder/tools/error_handler/abc.py +33 -33
  126. telegrinder/tools/error_handler/error.py +9 -9
  127. telegrinder/tools/error_handler/error_handler.py +193 -193
  128. telegrinder/tools/formatting/__init__.py +46 -46
  129. telegrinder/tools/formatting/html.py +283 -283
  130. telegrinder/tools/formatting/links.py +33 -33
  131. telegrinder/tools/formatting/spec_html_formats.py +111 -111
  132. telegrinder/tools/functional.py +12 -12
  133. telegrinder/tools/global_context/__init__.py +7 -7
  134. telegrinder/tools/global_context/abc.py +63 -63
  135. telegrinder/tools/global_context/global_context.py +412 -412
  136. telegrinder/tools/global_context/telegrinder_ctx.py +27 -27
  137. telegrinder/tools/i18n/__init__.py +7 -7
  138. telegrinder/tools/i18n/abc.py +30 -30
  139. telegrinder/tools/i18n/middleware/__init__.py +3 -3
  140. telegrinder/tools/i18n/middleware/abc.py +25 -25
  141. telegrinder/tools/i18n/simple.py +43 -43
  142. telegrinder/tools/kb_set/__init__.py +4 -4
  143. telegrinder/tools/kb_set/base.py +15 -15
  144. telegrinder/tools/kb_set/yaml.py +63 -63
  145. telegrinder/tools/keyboard.py +132 -132
  146. telegrinder/tools/limited_dict.py +37 -37
  147. telegrinder/tools/loop_wrapper/__init__.py +4 -4
  148. telegrinder/tools/loop_wrapper/abc.py +15 -15
  149. telegrinder/tools/loop_wrapper/loop_wrapper.py +224 -216
  150. telegrinder/tools/magic.py +157 -157
  151. telegrinder/tools/parse_mode.py +6 -6
  152. telegrinder/tools/state_storage/__init__.py +4 -4
  153. telegrinder/tools/state_storage/abc.py +35 -35
  154. telegrinder/tools/state_storage/memory.py +25 -25
  155. telegrinder/types/__init__.py +260 -260
  156. telegrinder/types/enums.py +701 -701
  157. telegrinder/types/methods.py +4633 -4633
  158. telegrinder/types/objects.py +8561 -6541
  159. telegrinder/verification_utils.py +32 -32
  160. {telegrinder-0.3.1.dist-info → telegrinder-0.3.3.dist-info}/LICENSE +22 -22
  161. {telegrinder-0.3.1.dist-info → telegrinder-0.3.3.dist-info}/METADATA +1 -1
  162. telegrinder-0.3.3.dist-info/RECORD +164 -0
  163. telegrinder-0.3.1.dist-info/RECORD +0 -164
  164. {telegrinder-0.3.1.dist-info → telegrinder-0.3.3.dist-info}/WHEEL +0 -0
@@ -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",)