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.
- telegrinder/__init__.py +144 -144
- telegrinder/api/__init__.py +8 -8
- telegrinder/api/api.py +93 -93
- telegrinder/api/error.py +16 -16
- telegrinder/api/response.py +20 -20
- telegrinder/api/token.py +36 -36
- telegrinder/bot/__init__.py +66 -66
- telegrinder/bot/bot.py +76 -76
- telegrinder/bot/cute_types/__init__.py +17 -17
- telegrinder/bot/cute_types/base.py +258 -258
- telegrinder/bot/cute_types/callback_query.py +385 -385
- telegrinder/bot/cute_types/chat_join_request.py +61 -61
- telegrinder/bot/cute_types/chat_member_updated.py +160 -160
- telegrinder/bot/cute_types/inline_query.py +43 -43
- telegrinder/bot/cute_types/message.py +2637 -2637
- telegrinder/bot/cute_types/update.py +104 -109
- telegrinder/bot/cute_types/utils.py +95 -95
- telegrinder/bot/dispatch/__init__.py +55 -55
- telegrinder/bot/dispatch/abc.py +77 -77
- telegrinder/bot/dispatch/context.py +98 -98
- telegrinder/bot/dispatch/dispatch.py +202 -202
- telegrinder/bot/dispatch/handler/__init__.py +13 -13
- telegrinder/bot/dispatch/handler/abc.py +24 -24
- telegrinder/bot/dispatch/handler/audio_reply.py +44 -44
- telegrinder/bot/dispatch/handler/base.py +57 -57
- telegrinder/bot/dispatch/handler/document_reply.py +44 -44
- telegrinder/bot/dispatch/handler/func.py +135 -135
- telegrinder/bot/dispatch/handler/media_group_reply.py +43 -43
- telegrinder/bot/dispatch/handler/message_reply.py +36 -36
- telegrinder/bot/dispatch/handler/photo_reply.py +44 -44
- telegrinder/bot/dispatch/handler/sticker_reply.py +37 -37
- telegrinder/bot/dispatch/handler/video_reply.py +44 -44
- telegrinder/bot/dispatch/middleware/__init__.py +3 -3
- telegrinder/bot/dispatch/middleware/abc.py +22 -16
- telegrinder/bot/dispatch/process.py +157 -132
- telegrinder/bot/dispatch/return_manager/__init__.py +13 -13
- telegrinder/bot/dispatch/return_manager/abc.py +108 -108
- telegrinder/bot/dispatch/return_manager/callback_query.py +20 -20
- telegrinder/bot/dispatch/return_manager/inline_query.py +15 -15
- telegrinder/bot/dispatch/return_manager/message.py +36 -36
- telegrinder/bot/dispatch/view/__init__.py +13 -13
- telegrinder/bot/dispatch/view/abc.py +41 -41
- telegrinder/bot/dispatch/view/base.py +200 -200
- telegrinder/bot/dispatch/view/box.py +129 -129
- telegrinder/bot/dispatch/view/callback_query.py +17 -17
- telegrinder/bot/dispatch/view/chat_join_request.py +16 -16
- telegrinder/bot/dispatch/view/chat_member.py +39 -39
- telegrinder/bot/dispatch/view/inline_query.py +17 -17
- telegrinder/bot/dispatch/view/message.py +44 -44
- telegrinder/bot/dispatch/view/raw.py +114 -114
- telegrinder/bot/dispatch/waiter_machine/__init__.py +17 -17
- telegrinder/bot/dispatch/waiter_machine/actions.py +13 -13
- telegrinder/bot/dispatch/waiter_machine/hasher/__init__.py +8 -8
- telegrinder/bot/dispatch/waiter_machine/hasher/callback.py +55 -55
- telegrinder/bot/dispatch/waiter_machine/hasher/hasher.py +57 -57
- telegrinder/bot/dispatch/waiter_machine/hasher/message.py +51 -51
- telegrinder/bot/dispatch/waiter_machine/hasher/state.py +19 -19
- telegrinder/bot/dispatch/waiter_machine/machine.py +172 -167
- telegrinder/bot/dispatch/waiter_machine/middleware.py +89 -89
- telegrinder/bot/dispatch/waiter_machine/short_state.py +68 -68
- telegrinder/bot/polling/__init__.py +4 -4
- telegrinder/bot/polling/abc.py +25 -25
- telegrinder/bot/polling/polling.py +131 -131
- telegrinder/bot/rules/__init__.py +62 -62
- telegrinder/bot/rules/abc.py +213 -213
- telegrinder/bot/rules/adapter/__init__.py +12 -9
- telegrinder/bot/rules/adapter/abc.py +31 -29
- telegrinder/bot/rules/adapter/errors.py +5 -5
- telegrinder/bot/rules/adapter/event.py +65 -67
- telegrinder/bot/rules/adapter/node.py +48 -48
- telegrinder/bot/rules/adapter/raw_event.py +27 -0
- telegrinder/bot/rules/adapter/raw_update.py +30 -30
- telegrinder/bot/rules/callback_data.py +170 -170
- telegrinder/bot/rules/chat_join.py +46 -46
- telegrinder/bot/rules/command.py +126 -126
- telegrinder/bot/rules/enum_text.py +36 -36
- telegrinder/bot/rules/func.py +26 -26
- telegrinder/bot/rules/fuzzy.py +24 -24
- telegrinder/bot/rules/inline.py +60 -60
- telegrinder/bot/rules/integer.py +20 -20
- telegrinder/bot/rules/is_from.py +127 -127
- telegrinder/bot/rules/markup.py +43 -43
- telegrinder/bot/rules/mention.py +14 -14
- telegrinder/bot/rules/message.py +17 -17
- telegrinder/bot/rules/message_entities.py +35 -35
- telegrinder/bot/rules/node.py +27 -27
- telegrinder/bot/rules/regex.py +37 -37
- telegrinder/bot/rules/rule_enum.py +72 -72
- telegrinder/bot/rules/start.py +42 -42
- telegrinder/bot/rules/state.py +37 -37
- telegrinder/bot/rules/text.py +33 -33
- telegrinder/bot/rules/update.py +15 -15
- telegrinder/bot/scenario/__init__.py +5 -5
- telegrinder/bot/scenario/abc.py +19 -19
- telegrinder/bot/scenario/checkbox.py +176 -167
- telegrinder/bot/scenario/choice.py +51 -46
- telegrinder/client/__init__.py +4 -4
- telegrinder/client/abc.py +75 -75
- telegrinder/client/aiohttp.py +130 -130
- telegrinder/model.py +320 -295
- telegrinder/modules.py +237 -237
- telegrinder/msgspec_json.py +14 -14
- telegrinder/msgspec_utils.py +410 -410
- telegrinder/node/__init__.py +0 -0
- telegrinder/node/attachment.py +87 -87
- telegrinder/node/base.py +166 -166
- telegrinder/node/callback_query.py +53 -53
- telegrinder/node/command.py +33 -33
- telegrinder/node/composer.py +198 -198
- telegrinder/node/container.py +27 -27
- telegrinder/node/event.py +65 -65
- telegrinder/node/me.py +16 -16
- telegrinder/node/message.py +14 -14
- telegrinder/node/polymorphic.py +48 -48
- telegrinder/node/rule.py +76 -76
- telegrinder/node/scope.py +38 -38
- telegrinder/node/source.py +71 -71
- telegrinder/node/text.py +41 -41
- telegrinder/node/tools/__init__.py +3 -3
- telegrinder/node/tools/generator.py +40 -40
- telegrinder/node/update.py +15 -15
- telegrinder/rules.py +0 -0
- telegrinder/tools/__init__.py +74 -74
- telegrinder/tools/buttons.py +79 -79
- telegrinder/tools/error_handler/__init__.py +7 -7
- telegrinder/tools/error_handler/abc.py +33 -33
- telegrinder/tools/error_handler/error.py +9 -9
- telegrinder/tools/error_handler/error_handler.py +193 -193
- telegrinder/tools/formatting/__init__.py +46 -46
- telegrinder/tools/formatting/html.py +283 -283
- telegrinder/tools/formatting/links.py +33 -33
- telegrinder/tools/formatting/spec_html_formats.py +111 -111
- telegrinder/tools/functional.py +12 -12
- telegrinder/tools/global_context/__init__.py +7 -7
- telegrinder/tools/global_context/abc.py +63 -63
- telegrinder/tools/global_context/global_context.py +412 -412
- telegrinder/tools/global_context/telegrinder_ctx.py +27 -27
- telegrinder/tools/i18n/__init__.py +7 -7
- telegrinder/tools/i18n/abc.py +30 -30
- telegrinder/tools/i18n/middleware/__init__.py +3 -3
- telegrinder/tools/i18n/middleware/abc.py +25 -25
- telegrinder/tools/i18n/simple.py +43 -43
- telegrinder/tools/kb_set/__init__.py +4 -4
- telegrinder/tools/kb_set/base.py +15 -15
- telegrinder/tools/kb_set/yaml.py +63 -63
- telegrinder/tools/keyboard.py +132 -132
- telegrinder/tools/limited_dict.py +37 -37
- telegrinder/tools/loop_wrapper/__init__.py +4 -4
- telegrinder/tools/loop_wrapper/abc.py +15 -15
- telegrinder/tools/loop_wrapper/loop_wrapper.py +224 -224
- telegrinder/tools/magic.py +157 -157
- telegrinder/tools/parse_mode.py +6 -6
- telegrinder/tools/state_storage/__init__.py +4 -4
- telegrinder/tools/state_storage/abc.py +35 -35
- telegrinder/tools/state_storage/memory.py +25 -25
- telegrinder/types/__init__.py +260 -260
- telegrinder/types/enums.py +701 -701
- telegrinder/types/methods.py +4633 -4633
- telegrinder/types/objects.py +6950 -8561
- telegrinder/verification_utils.py +32 -32
- {telegrinder-0.3.3.post1.dist-info → telegrinder-0.3.4.post1.dist-info}/LICENSE +22 -22
- {telegrinder-0.3.3.post1.dist-info → telegrinder-0.3.4.post1.dist-info}/METADATA +1 -1
- telegrinder-0.3.4.post1.dist-info/RECORD +165 -0
- telegrinder-0.3.3.post1.dist-info/RECORD +0 -164
- {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",)
|
telegrinder/node/update.py
CHANGED
|
@@ -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
|
telegrinder/tools/__init__.py
CHANGED
|
@@ -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
|
+
)
|
telegrinder/tools/buttons.py
CHANGED
|
@@ -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",)
|