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.
- telegrinder/__init__.py +148 -149
- telegrinder/api/__init__.py +9 -8
- telegrinder/api/api.py +101 -93
- telegrinder/api/error.py +20 -16
- telegrinder/api/response.py +20 -20
- telegrinder/api/token.py +36 -36
- telegrinder/bot/__init__.py +72 -66
- telegrinder/bot/bot.py +83 -76
- telegrinder/bot/cute_types/__init__.py +19 -17
- telegrinder/bot/cute_types/base.py +184 -258
- telegrinder/bot/cute_types/callback_query.py +400 -385
- telegrinder/bot/cute_types/chat_join_request.py +62 -61
- telegrinder/bot/cute_types/chat_member_updated.py +157 -160
- telegrinder/bot/cute_types/inline_query.py +44 -43
- telegrinder/bot/cute_types/message.py +2590 -2637
- telegrinder/bot/cute_types/pre_checkout_query.py +42 -0
- telegrinder/bot/cute_types/update.py +112 -104
- telegrinder/bot/cute_types/utils.py +62 -95
- telegrinder/bot/dispatch/__init__.py +59 -55
- telegrinder/bot/dispatch/abc.py +76 -77
- telegrinder/bot/dispatch/context.py +96 -98
- telegrinder/bot/dispatch/dispatch.py +254 -202
- telegrinder/bot/dispatch/handler/__init__.py +13 -13
- telegrinder/bot/dispatch/handler/abc.py +23 -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 +129 -135
- telegrinder/bot/dispatch/handler/media_group_reply.py +44 -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 +97 -22
- telegrinder/bot/dispatch/middleware/global_middleware.py +70 -0
- telegrinder/bot/dispatch/process.py +151 -157
- telegrinder/bot/dispatch/return_manager/__init__.py +15 -13
- telegrinder/bot/dispatch/return_manager/abc.py +104 -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/return_manager/pre_checkout_query.py +20 -0
- telegrinder/bot/dispatch/view/__init__.py +15 -13
- telegrinder/bot/dispatch/view/abc.py +45 -41
- telegrinder/bot/dispatch/view/base.py +231 -200
- telegrinder/bot/dispatch/view/box.py +140 -129
- telegrinder/bot/dispatch/view/callback_query.py +16 -17
- telegrinder/bot/dispatch/view/chat_join_request.py +11 -16
- telegrinder/bot/dispatch/view/chat_member.py +37 -39
- telegrinder/bot/dispatch/view/inline_query.py +16 -17
- telegrinder/bot/dispatch/view/message.py +43 -44
- telegrinder/bot/dispatch/view/pre_checkout_query.py +16 -0
- telegrinder/bot/dispatch/view/raw.py +116 -114
- telegrinder/bot/dispatch/waiter_machine/__init__.py +17 -17
- telegrinder/bot/dispatch/waiter_machine/actions.py +14 -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 +59 -57
- telegrinder/bot/dispatch/waiter_machine/hasher/message.py +51 -51
- telegrinder/bot/dispatch/waiter_machine/hasher/state.py +20 -19
- telegrinder/bot/dispatch/waiter_machine/machine.py +251 -172
- telegrinder/bot/dispatch/waiter_machine/middleware.py +94 -89
- telegrinder/bot/dispatch/waiter_machine/short_state.py +57 -68
- telegrinder/bot/polling/__init__.py +4 -4
- telegrinder/bot/polling/abc.py +25 -25
- telegrinder/bot/polling/polling.py +139 -131
- telegrinder/bot/rules/__init__.py +85 -62
- telegrinder/bot/rules/abc.py +213 -206
- telegrinder/bot/rules/callback_data.py +122 -163
- telegrinder/bot/rules/chat_join.py +45 -43
- telegrinder/bot/rules/command.py +126 -126
- telegrinder/bot/rules/enum_text.py +33 -36
- telegrinder/bot/rules/func.py +28 -26
- telegrinder/bot/rules/fuzzy.py +24 -24
- telegrinder/bot/rules/id.py +24 -0
- telegrinder/bot/rules/inline.py +58 -56
- telegrinder/bot/rules/integer.py +21 -20
- telegrinder/bot/rules/is_from.py +127 -127
- telegrinder/bot/rules/logic.py +18 -0
- telegrinder/bot/rules/markup.py +42 -43
- telegrinder/bot/rules/mention.py +14 -14
- telegrinder/bot/rules/message.py +15 -17
- telegrinder/bot/rules/message_entities.py +33 -35
- telegrinder/bot/rules/node.py +33 -27
- telegrinder/bot/rules/payload.py +81 -0
- telegrinder/bot/rules/payment_invoice.py +29 -0
- telegrinder/bot/rules/regex.py +36 -37
- telegrinder/bot/rules/rule_enum.py +72 -72
- telegrinder/bot/rules/start.py +42 -42
- telegrinder/bot/rules/state.py +35 -37
- telegrinder/bot/rules/text.py +38 -33
- telegrinder/bot/rules/update.py +15 -15
- telegrinder/bot/scenario/__init__.py +5 -5
- telegrinder/bot/scenario/abc.py +17 -19
- telegrinder/bot/scenario/checkbox.py +174 -176
- telegrinder/bot/scenario/choice.py +48 -51
- telegrinder/client/__init__.py +12 -4
- telegrinder/client/abc.py +100 -75
- telegrinder/client/aiohttp.py +134 -130
- telegrinder/client/form_data.py +31 -0
- telegrinder/client/sonic.py +212 -0
- telegrinder/model.py +208 -315
- telegrinder/modules.py +239 -237
- telegrinder/msgspec_json.py +14 -14
- telegrinder/msgspec_utils.py +478 -410
- telegrinder/node/__init__.py +86 -25
- telegrinder/node/attachment.py +163 -87
- telegrinder/node/base.py +288 -160
- telegrinder/node/callback_query.py +54 -53
- telegrinder/node/command.py +34 -33
- telegrinder/node/composer.py +163 -198
- telegrinder/node/container.py +33 -27
- telegrinder/node/either.py +82 -0
- telegrinder/node/event.py +54 -65
- telegrinder/node/file.py +51 -0
- telegrinder/node/me.py +15 -16
- telegrinder/node/payload.py +78 -0
- telegrinder/node/polymorphic.py +67 -48
- telegrinder/node/rule.py +72 -76
- telegrinder/node/scope.py +36 -38
- telegrinder/node/source.py +87 -71
- telegrinder/node/text.py +53 -41
- telegrinder/node/tools/__init__.py +3 -3
- telegrinder/node/tools/generator.py +36 -40
- telegrinder/py.typed +0 -0
- telegrinder/rules.py +1 -62
- telegrinder/tools/__init__.py +152 -93
- telegrinder/tools/adapter/__init__.py +19 -0
- telegrinder/tools/adapter/abc.py +49 -0
- telegrinder/tools/adapter/dataclass.py +56 -0
- telegrinder/{bot/rules → tools}/adapter/errors.py +5 -5
- telegrinder/{bot/rules → tools}/adapter/event.py +63 -65
- telegrinder/{bot/rules → tools}/adapter/node.py +46 -48
- telegrinder/{bot/rules → tools}/adapter/raw_event.py +27 -27
- telegrinder/{bot/rules → tools}/adapter/raw_update.py +30 -30
- telegrinder/tools/buttons.py +106 -80
- telegrinder/tools/callback_data_serilization/__init__.py +5 -0
- telegrinder/tools/callback_data_serilization/abc.py +51 -0
- telegrinder/tools/callback_data_serilization/json_ser.py +60 -0
- telegrinder/tools/callback_data_serilization/msgpack_ser.py +172 -0
- telegrinder/tools/error_handler/__init__.py +7 -7
- telegrinder/tools/error_handler/abc.py +30 -33
- telegrinder/tools/error_handler/error.py +9 -9
- telegrinder/tools/error_handler/error_handler.py +179 -193
- telegrinder/tools/formatting/__init__.py +83 -63
- telegrinder/tools/formatting/deep_links.py +541 -0
- telegrinder/tools/formatting/{html.py → html_formatter.py} +266 -294
- telegrinder/tools/formatting/spec_html_formats.py +71 -117
- telegrinder/tools/functional.py +8 -12
- telegrinder/tools/global_context/__init__.py +7 -7
- telegrinder/tools/global_context/abc.py +63 -63
- telegrinder/tools/global_context/global_context.py +387 -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 +22 -25
- telegrinder/tools/i18n/simple.py +43 -43
- telegrinder/tools/input_file_directory.py +30 -0
- telegrinder/tools/keyboard.py +128 -128
- telegrinder/tools/lifespan.py +105 -0
- telegrinder/tools/limited_dict.py +32 -37
- telegrinder/tools/loop_wrapper/__init__.py +4 -4
- telegrinder/tools/loop_wrapper/abc.py +20 -15
- telegrinder/tools/loop_wrapper/loop_wrapper.py +169 -224
- telegrinder/tools/magic.py +307 -157
- telegrinder/tools/parse_mode.py +6 -6
- telegrinder/tools/state_storage/__init__.py +4 -4
- telegrinder/tools/state_storage/abc.py +31 -35
- telegrinder/tools/state_storage/memory.py +25 -25
- telegrinder/tools/strings.py +13 -0
- telegrinder/types/__init__.py +268 -260
- telegrinder/types/enums.py +711 -701
- telegrinder/types/input_file.py +51 -0
- telegrinder/types/methods.py +5055 -4633
- telegrinder/types/objects.py +7058 -6950
- telegrinder/verification_utils.py +30 -32
- {telegrinder-0.3.4.dist-info → telegrinder-0.4.0.dist-info}/LICENSE +22 -22
- telegrinder-0.4.0.dist-info/METADATA +144 -0
- telegrinder-0.4.0.dist-info/RECORD +182 -0
- {telegrinder-0.3.4.dist-info → telegrinder-0.4.0.dist-info}/WHEEL +1 -1
- telegrinder/bot/rules/adapter/__init__.py +0 -17
- telegrinder/bot/rules/adapter/abc.py +0 -31
- telegrinder/node/message.py +0 -14
- telegrinder/node/update.py +0 -15
- telegrinder/tools/formatting/links.py +0 -38
- telegrinder/tools/kb_set/__init__.py +0 -4
- telegrinder/tools/kb_set/base.py +0 -15
- telegrinder/tools/kb_set/yaml.py +0 -63
- telegrinder-0.3.4.dist-info/METADATA +0 -110
- telegrinder-0.3.4.dist-info/RECORD +0 -165
|
@@ -1,157 +1,151 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
from
|
|
6
|
-
|
|
7
|
-
from telegrinder.
|
|
8
|
-
from telegrinder.bot.
|
|
9
|
-
from telegrinder.bot.dispatch.
|
|
10
|
-
from telegrinder.
|
|
11
|
-
from telegrinder.
|
|
12
|
-
from telegrinder.
|
|
13
|
-
from telegrinder.
|
|
14
|
-
from telegrinder.
|
|
15
|
-
from telegrinder.
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
from telegrinder.bot.
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
return
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
for
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
update:
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
#
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
result
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
await node_col.close_all()
|
|
153
|
-
|
|
154
|
-
return result
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
__all__ = ("check_rule", "process_inner")
|
|
1
|
+
import typing
|
|
2
|
+
|
|
3
|
+
from fntypes.option import Nothing, Some
|
|
4
|
+
|
|
5
|
+
from telegrinder.api.api import API
|
|
6
|
+
from telegrinder.bot.cute_types.update import UpdateCute
|
|
7
|
+
from telegrinder.bot.dispatch.context import Context
|
|
8
|
+
from telegrinder.bot.dispatch.middleware.abc import ABCMiddleware, run_middleware
|
|
9
|
+
from telegrinder.bot.dispatch.return_manager.abc import ABCReturnManager
|
|
10
|
+
from telegrinder.model import Model
|
|
11
|
+
from telegrinder.modules import logger
|
|
12
|
+
from telegrinder.node.composer import CONTEXT_STORE_NODES_KEY, NodeScope, compose_nodes
|
|
13
|
+
from telegrinder.tools.adapter.abc import run_adapter
|
|
14
|
+
from telegrinder.tools.i18n.abc import I18nEnum
|
|
15
|
+
from telegrinder.types.objects import Update
|
|
16
|
+
|
|
17
|
+
if typing.TYPE_CHECKING:
|
|
18
|
+
from telegrinder.bot.dispatch.handler.abc import ABCHandler
|
|
19
|
+
from telegrinder.bot.rules.abc import ABCRule
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
async def process_inner[Event: Model](
|
|
23
|
+
api: API,
|
|
24
|
+
event: Event,
|
|
25
|
+
raw_event: Update,
|
|
26
|
+
ctx: Context,
|
|
27
|
+
middlewares: list[ABCMiddleware[Event]],
|
|
28
|
+
handlers: list["ABCHandler[Event]"],
|
|
29
|
+
return_manager: ABCReturnManager[Event] | None = None,
|
|
30
|
+
) -> bool:
|
|
31
|
+
logger.debug("Processing {!r}...", event.__class__.__name__)
|
|
32
|
+
ctx[CONTEXT_STORE_NODES_KEY] = {} # For per-event shared nodes
|
|
33
|
+
|
|
34
|
+
logger.debug("Run pre middlewares...")
|
|
35
|
+
for m in middlewares:
|
|
36
|
+
result = await run_middleware(m.pre, api, event, raw_event=raw_event, ctx=ctx, adapter=m.adapter)
|
|
37
|
+
logger.debug("Middleware {!r} returned: {!r}", m, result)
|
|
38
|
+
if result is False:
|
|
39
|
+
return False
|
|
40
|
+
|
|
41
|
+
found = False
|
|
42
|
+
responses = []
|
|
43
|
+
ctx_copy = ctx.copy()
|
|
44
|
+
|
|
45
|
+
for handler in handlers:
|
|
46
|
+
adapted_event = event
|
|
47
|
+
|
|
48
|
+
if await handler.check(api, raw_event, ctx):
|
|
49
|
+
if handler.adapter is not None:
|
|
50
|
+
match await run_adapter(handler.adapter, api, raw_event, ctx):
|
|
51
|
+
case Some(value):
|
|
52
|
+
adapted_event = value
|
|
53
|
+
case Nothing():
|
|
54
|
+
continue
|
|
55
|
+
|
|
56
|
+
found = True
|
|
57
|
+
logger.debug("Handler {!r} matched, run...", handler)
|
|
58
|
+
response = await handler.run(api, adapted_event, ctx)
|
|
59
|
+
logger.debug("Handler {!r} returned: {!r}", handler, response)
|
|
60
|
+
responses.append(response)
|
|
61
|
+
|
|
62
|
+
if return_manager is not None:
|
|
63
|
+
await return_manager.run(response, event, ctx)
|
|
64
|
+
if handler.final:
|
|
65
|
+
break
|
|
66
|
+
|
|
67
|
+
ctx = ctx_copy
|
|
68
|
+
|
|
69
|
+
logger.debug("Run post middlewares...")
|
|
70
|
+
ctx.set("responses", responses)
|
|
71
|
+
|
|
72
|
+
for m in middlewares:
|
|
73
|
+
await run_middleware(
|
|
74
|
+
m.post,
|
|
75
|
+
api,
|
|
76
|
+
event,
|
|
77
|
+
raw_event=raw_event,
|
|
78
|
+
ctx=ctx,
|
|
79
|
+
adapter=m.adapter,
|
|
80
|
+
)
|
|
81
|
+
|
|
82
|
+
for session in ctx.get(CONTEXT_STORE_NODES_KEY, {}).values():
|
|
83
|
+
await session.close(scopes=(NodeScope.PER_EVENT,))
|
|
84
|
+
|
|
85
|
+
logger.debug(
|
|
86
|
+
"{} handlers, returns {!r}",
|
|
87
|
+
"No found" if not found else "Found",
|
|
88
|
+
found,
|
|
89
|
+
)
|
|
90
|
+
return found
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
async def check_rule(
|
|
94
|
+
api: API,
|
|
95
|
+
rule: "ABCRule",
|
|
96
|
+
update: Update,
|
|
97
|
+
ctx: Context,
|
|
98
|
+
) -> bool:
|
|
99
|
+
"""Checks requirements, adapts update.
|
|
100
|
+
Returns check result.
|
|
101
|
+
"""
|
|
102
|
+
update_cute = None if not isinstance(update, UpdateCute) else update
|
|
103
|
+
|
|
104
|
+
# Running adapter
|
|
105
|
+
match await run_adapter(rule.adapter, api, update, ctx):
|
|
106
|
+
case Some(val):
|
|
107
|
+
adapted_value = val
|
|
108
|
+
case Nothing():
|
|
109
|
+
return False
|
|
110
|
+
|
|
111
|
+
# Preparing update
|
|
112
|
+
if isinstance(adapted_value, UpdateCute):
|
|
113
|
+
update_cute = adapted_value
|
|
114
|
+
elif isinstance(adapted_val := ctx.get(rule.adapter.ADAPTED_VALUE_KEY or ""), UpdateCute):
|
|
115
|
+
update_cute = adapted_val
|
|
116
|
+
else:
|
|
117
|
+
update_cute = UpdateCute.from_update(update, bound_api=api)
|
|
118
|
+
|
|
119
|
+
# Running subrules to fetch requirements
|
|
120
|
+
ctx_copy = ctx.copy()
|
|
121
|
+
for requirement in rule.requires:
|
|
122
|
+
if not await check_rule(api, requirement, update_cute, ctx_copy):
|
|
123
|
+
return False
|
|
124
|
+
|
|
125
|
+
# Translating translatable rules
|
|
126
|
+
if I18nEnum.I18N in ctx:
|
|
127
|
+
rule = await rule.translate(ctx[I18nEnum.I18N])
|
|
128
|
+
|
|
129
|
+
ctx |= ctx_copy
|
|
130
|
+
|
|
131
|
+
# Composing required nodes
|
|
132
|
+
nodes = rule.required_nodes
|
|
133
|
+
node_col = None
|
|
134
|
+
if nodes:
|
|
135
|
+
result = await compose_nodes(nodes, ctx, data={Update: update, API: api})
|
|
136
|
+
if not result:
|
|
137
|
+
logger.debug(f"Cannot compose nodes for rule, error: {str(result.error)}")
|
|
138
|
+
return False
|
|
139
|
+
node_col = result.value
|
|
140
|
+
|
|
141
|
+
# Running check
|
|
142
|
+
result = await rule.bounding_check(ctx, adapted_value=adapted_value, node_col=node_col)
|
|
143
|
+
|
|
144
|
+
# Closing node sessions if there are any
|
|
145
|
+
if node_col is not None:
|
|
146
|
+
await node_col.close_all()
|
|
147
|
+
|
|
148
|
+
return result
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
__all__ = ("check_rule", "process_inner")
|
|
@@ -1,19 +1,21 @@
|
|
|
1
|
-
from telegrinder.bot.dispatch.return_manager.abc import (
|
|
2
|
-
ABCReturnManager,
|
|
3
|
-
BaseReturnManager,
|
|
4
|
-
Manager,
|
|
5
|
-
register_manager,
|
|
6
|
-
)
|
|
7
|
-
from telegrinder.bot.dispatch.return_manager.callback_query import CallbackQueryReturnManager
|
|
8
|
-
from telegrinder.bot.dispatch.return_manager.inline_query import InlineQueryReturnManager
|
|
9
|
-
from telegrinder.bot.dispatch.return_manager.message import MessageReturnManager
|
|
10
|
-
|
|
11
|
-
|
|
1
|
+
from telegrinder.bot.dispatch.return_manager.abc import (
|
|
2
|
+
ABCReturnManager,
|
|
3
|
+
BaseReturnManager,
|
|
4
|
+
Manager,
|
|
5
|
+
register_manager,
|
|
6
|
+
)
|
|
7
|
+
from telegrinder.bot.dispatch.return_manager.callback_query import CallbackQueryReturnManager
|
|
8
|
+
from telegrinder.bot.dispatch.return_manager.inline_query import InlineQueryReturnManager
|
|
9
|
+
from telegrinder.bot.dispatch.return_manager.message import MessageReturnManager
|
|
10
|
+
from telegrinder.bot.dispatch.return_manager.pre_checkout_query import PreCheckoutQueryManager
|
|
11
|
+
|
|
12
|
+
__all__ = (
|
|
12
13
|
"ABCReturnManager",
|
|
13
14
|
"BaseReturnManager",
|
|
14
15
|
"CallbackQueryReturnManager",
|
|
15
16
|
"InlineQueryReturnManager",
|
|
16
17
|
"Manager",
|
|
17
18
|
"MessageReturnManager",
|
|
18
|
-
"
|
|
19
|
-
|
|
19
|
+
"PreCheckoutQueryManager",
|
|
20
|
+
"register_manager",
|
|
21
|
+
)
|
|
@@ -1,112 +1,108 @@
|
|
|
1
|
-
import dataclasses
|
|
2
|
-
import types
|
|
3
|
-
import typing
|
|
4
|
-
from abc import ABC, abstractmethod
|
|
5
|
-
|
|
6
|
-
from telegrinder.bot.dispatch.context import Context
|
|
7
|
-
from telegrinder.model import Model
|
|
8
|
-
from telegrinder.modules import logger
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
return wrapper
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
__all__ = (
|
|
1
|
+
import dataclasses
|
|
2
|
+
import types
|
|
3
|
+
import typing
|
|
4
|
+
from abc import ABC, abstractmethod
|
|
5
|
+
|
|
6
|
+
from telegrinder.bot.dispatch.context import Context
|
|
7
|
+
from telegrinder.model import Model
|
|
8
|
+
from telegrinder.modules import logger
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def get_union_types(t: types.UnionType | typing.Any) -> tuple[type[typing.Any], ...] | None:
|
|
12
|
+
if type(t) in (types.UnionType, typing._UnionGenericAlias): # type: ignore
|
|
13
|
+
return tuple(typing.get_origin(x) or x for x in typing.get_args(t))
|
|
14
|
+
return None
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def register_manager(return_type: type[typing.Any] | types.UnionType):
|
|
18
|
+
def wrapper(func: typing.Callable[..., typing.Awaitable[typing.Any]]):
|
|
19
|
+
return Manager(get_union_types(return_type) or (return_type,), func) # type: ignore
|
|
20
|
+
|
|
21
|
+
return wrapper
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
@dataclasses.dataclass(frozen=True, slots=True)
|
|
25
|
+
class Manager:
|
|
26
|
+
types: tuple[type, ...]
|
|
27
|
+
callback: typing.Callable[..., typing.Awaitable[typing.Any]]
|
|
28
|
+
|
|
29
|
+
async def __call__(self, *args: typing.Any, **kwargs: typing.Any) -> None:
|
|
30
|
+
await self.callback(*args, **kwargs)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class ABCReturnManager[Event: Model](ABC):
|
|
34
|
+
@abstractmethod
|
|
35
|
+
async def run(self, response: typing.Any, event: Event, ctx: Context) -> None:
|
|
36
|
+
pass
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class BaseReturnManager[Event: Model](ABCReturnManager[Event]):
|
|
40
|
+
def __repr__(self) -> str:
|
|
41
|
+
return "<{}: {}>".format(
|
|
42
|
+
self.__class__.__name__,
|
|
43
|
+
", ".join(x.callback.__name__ + "=" + repr(x) for x in self.managers),
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
@property
|
|
47
|
+
def managers(self) -> list[Manager]:
|
|
48
|
+
managers = self.__dict__.get("managers")
|
|
49
|
+
if managers is not None:
|
|
50
|
+
return managers
|
|
51
|
+
managers_lst = [
|
|
52
|
+
manager
|
|
53
|
+
for manager in (vars(BaseReturnManager) | vars(self.__class__)).values()
|
|
54
|
+
if isinstance(manager, Manager)
|
|
55
|
+
]
|
|
56
|
+
self.__dict__["managers"] = managers_lst
|
|
57
|
+
return managers_lst
|
|
58
|
+
|
|
59
|
+
@register_manager(Context)
|
|
60
|
+
@staticmethod
|
|
61
|
+
async def ctx_manager(value: Context, event: Event, ctx: Context) -> None:
|
|
62
|
+
"""Basic manager for returning context from handler."""
|
|
63
|
+
ctx.update(value)
|
|
64
|
+
|
|
65
|
+
async def run(self, response: typing.Any, event: Event, ctx: Context) -> None:
|
|
66
|
+
logger.debug("Run return manager for response: {!r}", response)
|
|
67
|
+
for manager in self.managers:
|
|
68
|
+
if typing.Any in manager.types or any(type(response) is x for x in manager.types):
|
|
69
|
+
logger.debug("Run manager {!r}...", manager.callback.__name__)
|
|
70
|
+
await manager(response, event, ctx)
|
|
71
|
+
|
|
72
|
+
@typing.overload
|
|
73
|
+
def register_manager[T](
|
|
74
|
+
self,
|
|
75
|
+
return_type: type[T],
|
|
76
|
+
) -> typing.Callable[[typing.Callable[[T, Event, Context], typing.Awaitable[typing.Any]]], Manager]: ...
|
|
77
|
+
|
|
78
|
+
@typing.overload
|
|
79
|
+
def register_manager[T](
|
|
80
|
+
self,
|
|
81
|
+
return_type: tuple[type[T], ...],
|
|
82
|
+
) -> typing.Callable[
|
|
83
|
+
[typing.Callable[[tuple[T, ...], Event, Context], typing.Awaitable[typing.Any]]],
|
|
84
|
+
Manager,
|
|
85
|
+
]: ...
|
|
86
|
+
|
|
87
|
+
def register_manager[T](
|
|
88
|
+
self,
|
|
89
|
+
return_type: type[T] | tuple[type[T], ...],
|
|
90
|
+
) -> typing.Callable[
|
|
91
|
+
[typing.Callable[[T | tuple[T, ...], Event, Context], typing.Awaitable[typing.Any]]],
|
|
92
|
+
Manager,
|
|
93
|
+
]:
|
|
94
|
+
def wrapper(func: typing.Callable[[T, Event, Context], typing.Awaitable]) -> Manager:
|
|
95
|
+
manager = Manager(get_union_types(return_type) or (return_type,), func) # type: ignore
|
|
96
|
+
self.managers.append(manager)
|
|
97
|
+
return manager
|
|
98
|
+
|
|
99
|
+
return wrapper
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
__all__ = (
|
|
107
103
|
"ABCReturnManager",
|
|
108
104
|
"BaseReturnManager",
|
|
109
105
|
"Manager",
|
|
110
106
|
"get_union_types",
|
|
111
|
-
"register_manager",
|
|
112
|
-
)
|
|
107
|
+
"register_manager",
|
|
108
|
+
)
|
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
import typing
|
|
2
|
-
|
|
3
|
-
from telegrinder.bot.cute_types.callback_query import CallbackQueryCute
|
|
4
|
-
from telegrinder.bot.dispatch.context import Context
|
|
5
|
-
from telegrinder.bot.dispatch.return_manager.abc import BaseReturnManager, register_manager
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
class CallbackQueryReturnManager(BaseReturnManager[CallbackQueryCute]):
|
|
9
|
-
@register_manager(str)
|
|
10
|
-
@staticmethod
|
|
11
|
-
async def str_manager(value: str, event: CallbackQueryCute, ctx: Context) -> None:
|
|
12
|
-
await event.answer(value)
|
|
13
|
-
|
|
14
|
-
@register_manager(dict[str, typing.Any])
|
|
15
|
-
@staticmethod
|
|
16
|
-
async def dict_manager(value: dict[str, typing.Any], event: CallbackQueryCute, ctx: Context) -> None:
|
|
17
|
-
await event.answer(**value)
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
__all__ = ("CallbackQueryReturnManager",)
|
|
1
|
+
import typing
|
|
2
|
+
|
|
3
|
+
from telegrinder.bot.cute_types.callback_query import CallbackQueryCute
|
|
4
|
+
from telegrinder.bot.dispatch.context import Context
|
|
5
|
+
from telegrinder.bot.dispatch.return_manager.abc import BaseReturnManager, register_manager
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class CallbackQueryReturnManager(BaseReturnManager[CallbackQueryCute]):
|
|
9
|
+
@register_manager(str)
|
|
10
|
+
@staticmethod
|
|
11
|
+
async def str_manager(value: str, event: CallbackQueryCute, ctx: Context) -> None:
|
|
12
|
+
await event.answer(value)
|
|
13
|
+
|
|
14
|
+
@register_manager(dict[str, typing.Any])
|
|
15
|
+
@staticmethod
|
|
16
|
+
async def dict_manager(value: dict[str, typing.Any], event: CallbackQueryCute, ctx: Context) -> None:
|
|
17
|
+
await event.answer(**value)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
__all__ = ("CallbackQueryReturnManager",)
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import typing
|
|
2
|
-
|
|
3
|
-
from telegrinder.bot.cute_types.inline_query import InlineQueryCute
|
|
4
|
-
from telegrinder.bot.dispatch.context import Context
|
|
5
|
-
from telegrinder.bot.dispatch.return_manager.abc import BaseReturnManager, register_manager
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
class InlineQueryReturnManager(BaseReturnManager[InlineQueryCute]):
|
|
9
|
-
@register_manager(dict[str, typing.Any])
|
|
10
|
-
@staticmethod
|
|
11
|
-
async def dict_manager(value: dict[str, typing.Any], event: InlineQueryCute, ctx: Context) -> None:
|
|
12
|
-
await event.answer(**value)
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
__all__ = ("InlineQueryReturnManager",)
|
|
1
|
+
import typing
|
|
2
|
+
|
|
3
|
+
from telegrinder.bot.cute_types.inline_query import InlineQueryCute
|
|
4
|
+
from telegrinder.bot.dispatch.context import Context
|
|
5
|
+
from telegrinder.bot.dispatch.return_manager.abc import BaseReturnManager, register_manager
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class InlineQueryReturnManager(BaseReturnManager[InlineQueryCute]):
|
|
9
|
+
@register_manager(dict[str, typing.Any])
|
|
10
|
+
@staticmethod
|
|
11
|
+
async def dict_manager(value: dict[str, typing.Any], event: InlineQueryCute, ctx: Context) -> None:
|
|
12
|
+
await event.answer(**value)
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
__all__ = ("InlineQueryReturnManager",)
|