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
telegrinder/bot/rules/abc.py
CHANGED
|
@@ -1,207 +1,214 @@
|
|
|
1
|
-
import inspect
|
|
2
|
-
from abc import ABC, abstractmethod
|
|
3
|
-
from functools import cached_property
|
|
4
|
-
|
|
5
|
-
import typing_extensions as typing
|
|
6
|
-
|
|
7
|
-
from telegrinder.bot.cute_types import MessageCute, UpdateCute
|
|
8
|
-
from telegrinder.bot.dispatch.context import Context
|
|
9
|
-
from telegrinder.bot.dispatch.process import check_rule
|
|
10
|
-
from telegrinder.
|
|
11
|
-
from telegrinder.
|
|
12
|
-
from telegrinder.node
|
|
13
|
-
from telegrinder.tools.
|
|
14
|
-
from telegrinder.tools.
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
translation
|
|
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
|
-
requirements
|
|
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
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
)
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
def
|
|
119
|
-
return self
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
self
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
kw[k] =
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
1
|
+
import inspect
|
|
2
|
+
from abc import ABC, abstractmethod
|
|
3
|
+
from functools import cached_property
|
|
4
|
+
|
|
5
|
+
import typing_extensions as typing
|
|
6
|
+
|
|
7
|
+
from telegrinder.bot.cute_types import MessageCute, UpdateCute
|
|
8
|
+
from telegrinder.bot.dispatch.context import Context
|
|
9
|
+
from telegrinder.bot.dispatch.process import check_rule
|
|
10
|
+
from telegrinder.node.base import NodeType, get_nodes, is_node
|
|
11
|
+
from telegrinder.tools.adapter import ABCAdapter
|
|
12
|
+
from telegrinder.tools.adapter.node import Event
|
|
13
|
+
from telegrinder.tools.adapter.raw_update import RawUpdateAdapter
|
|
14
|
+
from telegrinder.tools.i18n.abc import ABCTranslator
|
|
15
|
+
from telegrinder.tools.magic import (
|
|
16
|
+
cache_translation,
|
|
17
|
+
get_annotations,
|
|
18
|
+
get_cached_translation,
|
|
19
|
+
get_default_args,
|
|
20
|
+
)
|
|
21
|
+
from telegrinder.types.objects import Update as UpdateObject
|
|
22
|
+
|
|
23
|
+
if typing.TYPE_CHECKING:
|
|
24
|
+
from telegrinder.node.composer import NodeCollection
|
|
25
|
+
|
|
26
|
+
AdaptTo = typing.TypeVar("AdaptTo", default=typing.Any, contravariant=True)
|
|
27
|
+
|
|
28
|
+
type CheckResult = bool | typing.Awaitable[bool]
|
|
29
|
+
|
|
30
|
+
Message: typing.TypeAlias = MessageCute
|
|
31
|
+
Update: typing.TypeAlias = UpdateCute
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def with_caching_translations(func: typing.Callable[..., typing.Any]):
|
|
35
|
+
"""Should be used as decorator for .translate method. Caches rule translations."""
|
|
36
|
+
|
|
37
|
+
async def wrapper(self: "ABCRule", translator: ABCTranslator):
|
|
38
|
+
if translation := get_cached_translation(self, translator.locale):
|
|
39
|
+
return translation
|
|
40
|
+
translation = await func(self, translator)
|
|
41
|
+
cache_translation(self, translator.locale, translation)
|
|
42
|
+
return translation
|
|
43
|
+
|
|
44
|
+
return wrapper
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
class ABCRule(ABC, typing.Generic[AdaptTo]):
|
|
48
|
+
adapter: ABCAdapter[UpdateObject, AdaptTo]
|
|
49
|
+
requires: list["ABCRule"] = []
|
|
50
|
+
|
|
51
|
+
if typing.TYPE_CHECKING:
|
|
52
|
+
|
|
53
|
+
@abstractmethod
|
|
54
|
+
def check(self, *args: typing.Any, **kwargs: typing.Any) -> CheckResult:
|
|
55
|
+
pass
|
|
56
|
+
else:
|
|
57
|
+
adapter = RawUpdateAdapter()
|
|
58
|
+
|
|
59
|
+
@abstractmethod
|
|
60
|
+
def check(self, *args, **kwargs):
|
|
61
|
+
pass
|
|
62
|
+
|
|
63
|
+
def __init_subclass__(
|
|
64
|
+
cls,
|
|
65
|
+
*,
|
|
66
|
+
requires: list["ABCRule"] | None = None,
|
|
67
|
+
adapter: ABCAdapter[UpdateObject, AdaptTo] | None = None,
|
|
68
|
+
) -> None:
|
|
69
|
+
"""Merges requirements from inherited classes and rule-specific requirements."""
|
|
70
|
+
if adapter is not None:
|
|
71
|
+
cls.adapter = adapter
|
|
72
|
+
|
|
73
|
+
requirements = []
|
|
74
|
+
for base in inspect.getmro(cls):
|
|
75
|
+
if issubclass(base, ABCRule) and base != cls:
|
|
76
|
+
requirements.extend(base.requires or ()) # type: ignore
|
|
77
|
+
|
|
78
|
+
requirements.extend(requires or ())
|
|
79
|
+
cls.requires = list(dict.fromkeys(requirements))
|
|
80
|
+
|
|
81
|
+
def __and__(self, other: "ABCRule") -> "AndRule":
|
|
82
|
+
"""And Rule.
|
|
83
|
+
|
|
84
|
+
```python
|
|
85
|
+
rule = HasText() & HasCaption()
|
|
86
|
+
rule #> AndRule(HasText(), HasCaption()) -> True if all rules in an AndRule are True, otherwise False.
|
|
87
|
+
```
|
|
88
|
+
"""
|
|
89
|
+
return AndRule(self, other)
|
|
90
|
+
|
|
91
|
+
def __or__(self, other: "ABCRule") -> "OrRule":
|
|
92
|
+
"""Or Rule.
|
|
93
|
+
|
|
94
|
+
```python
|
|
95
|
+
rule = HasText() | HasCaption()
|
|
96
|
+
rule #> OrRule(HasText(), HasCaption()) -> True if any rule in an OrRule are True, otherwise False.
|
|
97
|
+
```
|
|
98
|
+
"""
|
|
99
|
+
return OrRule(self, other)
|
|
100
|
+
|
|
101
|
+
def __invert__(self) -> "NotRule":
|
|
102
|
+
"""Not Rule.
|
|
103
|
+
|
|
104
|
+
```python
|
|
105
|
+
rule = ~HasText()
|
|
106
|
+
rule # NotRule(HasText()) -> True if rule returned False, otherwise False.
|
|
107
|
+
```
|
|
108
|
+
"""
|
|
109
|
+
return NotRule(self)
|
|
110
|
+
|
|
111
|
+
def __repr__(self) -> str:
|
|
112
|
+
return "<{}: adapter={!r}>".format(
|
|
113
|
+
self.__class__.__name__,
|
|
114
|
+
self.adapter,
|
|
115
|
+
)
|
|
116
|
+
|
|
117
|
+
@cached_property
|
|
118
|
+
def required_nodes(self) -> dict[str, type[NodeType]]:
|
|
119
|
+
return get_nodes(self.check)
|
|
120
|
+
|
|
121
|
+
def as_optional(self) -> "ABCRule":
|
|
122
|
+
return self | Always()
|
|
123
|
+
|
|
124
|
+
def should_fail(self) -> "ABCRule":
|
|
125
|
+
return self & Never()
|
|
126
|
+
|
|
127
|
+
async def bounding_check(
|
|
128
|
+
self,
|
|
129
|
+
ctx: Context,
|
|
130
|
+
*,
|
|
131
|
+
adapted_value: AdaptTo,
|
|
132
|
+
node_col: "NodeCollection | None" = None,
|
|
133
|
+
) -> bool:
|
|
134
|
+
bound_check_rule = self.check
|
|
135
|
+
kw = {}
|
|
136
|
+
node_col_values = node_col.values if node_col is not None else {}
|
|
137
|
+
temp_ctx = get_default_args(bound_check_rule) | ctx
|
|
138
|
+
|
|
139
|
+
for i, (k, v) in enumerate(get_annotations(bound_check_rule).items()):
|
|
140
|
+
if (isinstance(adapted_value, Event) and i == 0) or ( # First arg is Event
|
|
141
|
+
isinstance(v, type) and isinstance(adapted_value, v)
|
|
142
|
+
):
|
|
143
|
+
kw[k] = adapted_value if not isinstance(adapted_value, Event) else adapted_value.obj
|
|
144
|
+
elif is_node(v):
|
|
145
|
+
assert k in node_col_values, "Node is undefined, error while bounding."
|
|
146
|
+
kw[k] = node_col_values[k]
|
|
147
|
+
elif k in temp_ctx:
|
|
148
|
+
kw[k] = temp_ctx[k]
|
|
149
|
+
elif v is Context:
|
|
150
|
+
kw[k] = ctx
|
|
151
|
+
else:
|
|
152
|
+
raise LookupError(
|
|
153
|
+
f"Cannot bound {k!r} of type {v!r} to '{self.__class__.__qualname__}.check()', "
|
|
154
|
+
"because it cannot be resolved."
|
|
155
|
+
)
|
|
156
|
+
|
|
157
|
+
result = bound_check_rule(**kw) # type: ignore
|
|
158
|
+
if inspect.isawaitable(result):
|
|
159
|
+
result = await result
|
|
160
|
+
return result
|
|
161
|
+
|
|
162
|
+
async def translate(self, translator: ABCTranslator) -> typing.Self:
|
|
163
|
+
return self
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
class AndRule(ABCRule):
|
|
167
|
+
def __init__(self, *rules: ABCRule) -> None:
|
|
168
|
+
self.rules = rules
|
|
169
|
+
|
|
170
|
+
async def check(self, event: Update, ctx: Context) -> bool:
|
|
171
|
+
ctx_copy = ctx.copy()
|
|
172
|
+
for rule in self.rules:
|
|
173
|
+
if not await check_rule(event.ctx_api, rule, event, ctx_copy):
|
|
174
|
+
return False
|
|
175
|
+
ctx |= ctx_copy
|
|
176
|
+
return True
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
class OrRule(ABCRule):
|
|
180
|
+
def __init__(self, *rules: ABCRule) -> None:
|
|
181
|
+
self.rules = rules
|
|
182
|
+
|
|
183
|
+
async def check(self, event: Update, ctx: Context) -> bool:
|
|
184
|
+
for rule in self.rules:
|
|
185
|
+
ctx_copy = ctx.copy()
|
|
186
|
+
if await check_rule(event.ctx_api, rule, event, ctx_copy):
|
|
187
|
+
ctx |= ctx_copy
|
|
188
|
+
return True
|
|
189
|
+
return False
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
class NotRule(ABCRule):
|
|
193
|
+
def __init__(self, rule: ABCRule) -> None:
|
|
194
|
+
self.rule = rule
|
|
195
|
+
|
|
196
|
+
async def check(self, event: Update, ctx: Context) -> bool:
|
|
197
|
+
ctx_copy = ctx.copy()
|
|
198
|
+
return not await check_rule(event.ctx_api, self.rule, event, ctx_copy)
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
class Never(ABCRule):
|
|
202
|
+
async def check(self) -> typing.Literal[False]:
|
|
203
|
+
return False
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
class Always(ABCRule):
|
|
207
|
+
async def check(self) -> typing.Literal[True]:
|
|
208
|
+
return True
|
|
209
|
+
|
|
210
|
+
|
|
211
|
+
__all__ = (
|
|
205
212
|
"ABCRule",
|
|
206
213
|
"Always",
|
|
207
214
|
"AndRule",
|
|
@@ -209,5 +216,5 @@ __all__ = (
|
|
|
209
216
|
"Never",
|
|
210
217
|
"NotRule",
|
|
211
218
|
"OrRule",
|
|
212
|
-
"with_caching_translations",
|
|
213
|
-
)
|
|
219
|
+
"with_caching_translations",
|
|
220
|
+
)
|