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,200 +1,200 @@
|
|
|
1
|
-
import typing
|
|
2
|
-
from abc import ABC, abstractmethod
|
|
3
|
-
from functools import cached_property
|
|
4
|
-
|
|
5
|
-
from fntypes.option import Nothing, Some
|
|
6
|
-
|
|
7
|
-
from telegrinder.api.api import API
|
|
8
|
-
from telegrinder.bot.cute_types.base import BaseCute
|
|
9
|
-
from telegrinder.bot.dispatch.handler.abc import ABCHandler
|
|
10
|
-
from telegrinder.bot.dispatch.handler.func import Func, FuncHandler
|
|
11
|
-
from telegrinder.bot.dispatch.middleware.abc import ABCMiddleware
|
|
12
|
-
from telegrinder.bot.dispatch.process import process_inner
|
|
13
|
-
from telegrinder.bot.dispatch.return_manager.abc import ABCReturnManager
|
|
14
|
-
from telegrinder.bot.dispatch.view.abc import ABCStateView, ABCView
|
|
15
|
-
from telegrinder.bot.rules.abc import ABCRule
|
|
16
|
-
from telegrinder.model import Model
|
|
17
|
-
from telegrinder.msgspec_utils import Option
|
|
18
|
-
from telegrinder.tools.error_handler.error_handler import ABCErrorHandler, ErrorHandler
|
|
19
|
-
from telegrinder.types.objects import Update
|
|
20
|
-
|
|
21
|
-
P = typing.ParamSpec("P")
|
|
22
|
-
R = typing.TypeVar("R", covariant=True)
|
|
23
|
-
Event = typing.TypeVar("Event", bound=BaseCute)
|
|
24
|
-
ErrorHandlerT = typing.TypeVar("ErrorHandlerT", bound=ABCErrorHandler)
|
|
25
|
-
MiddlewareT = typing.TypeVar("MiddlewareT", bound=ABCMiddleware)
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
def get_event_model_class(view: "BaseView[Event]") -> Option[type[Event]]:
|
|
29
|
-
for base in view.__class__.__bases__ + (view.__class__,):
|
|
30
|
-
if "__orig_bases__" not in base.__dict__:
|
|
31
|
-
continue
|
|
32
|
-
|
|
33
|
-
for orig_base in base.__dict__["__orig_bases__"]:
|
|
34
|
-
origin_base = typing.get_origin(orig_base) or orig_base
|
|
35
|
-
if not isinstance(origin_base, type) and not issubclass(origin_base, object):
|
|
36
|
-
continue
|
|
37
|
-
|
|
38
|
-
for generic_type in typing.get_args(orig_base):
|
|
39
|
-
orig_generic_type = typing.get_origin(generic_type) or generic_type
|
|
40
|
-
if isinstance(orig_generic_type, type) and issubclass(orig_generic_type, BaseCute):
|
|
41
|
-
return Some(generic_type)
|
|
42
|
-
|
|
43
|
-
return Nothing()
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
class BaseView(ABCView, typing.Generic[Event]):
|
|
47
|
-
auto_rules: list[ABCRule]
|
|
48
|
-
handlers: list[ABCHandler[Event]]
|
|
49
|
-
middlewares: list[ABCMiddleware[Event]]
|
|
50
|
-
return_manager: ABCReturnManager[Event] | None = None
|
|
51
|
-
|
|
52
|
-
@staticmethod
|
|
53
|
-
def get_raw_event(update: Update) -> Option[Model]:
|
|
54
|
-
return getattr(update, update.update_type.value)
|
|
55
|
-
|
|
56
|
-
@cached_property
|
|
57
|
-
def event_model_class(self) -> Option[type[Event]]:
|
|
58
|
-
return get_event_model_class(self)
|
|
59
|
-
|
|
60
|
-
@typing.overload
|
|
61
|
-
@classmethod
|
|
62
|
-
def to_handler(
|
|
63
|
-
cls,
|
|
64
|
-
*rules: ABCRule,
|
|
65
|
-
) -> typing.Callable[
|
|
66
|
-
[Func[P, R]],
|
|
67
|
-
FuncHandler[Event, Func[P, R], ErrorHandler[Event]],
|
|
68
|
-
]: ...
|
|
69
|
-
|
|
70
|
-
@typing.overload
|
|
71
|
-
@classmethod
|
|
72
|
-
def to_handler(
|
|
73
|
-
cls,
|
|
74
|
-
*rules: ABCRule,
|
|
75
|
-
error_handler: ErrorHandlerT,
|
|
76
|
-
is_blocking: bool = True,
|
|
77
|
-
) -> typing.Callable[[Func[P, R]], FuncHandler[Event, Func[P, R], ErrorHandlerT]]: ...
|
|
78
|
-
|
|
79
|
-
@typing.overload
|
|
80
|
-
@classmethod
|
|
81
|
-
def to_handler(
|
|
82
|
-
cls,
|
|
83
|
-
*rules: ABCRule,
|
|
84
|
-
error_handler: typing.Literal[None] = None,
|
|
85
|
-
is_blocking: bool = True,
|
|
86
|
-
) -> typing.Callable[
|
|
87
|
-
[Func[P, R]],
|
|
88
|
-
FuncHandler[Event, Func[P, R], ErrorHandler[Event]],
|
|
89
|
-
]: ...
|
|
90
|
-
|
|
91
|
-
@classmethod
|
|
92
|
-
def to_handler(
|
|
93
|
-
cls,
|
|
94
|
-
*rules: ABCRule,
|
|
95
|
-
error_handler: ABCErrorHandler | None = None,
|
|
96
|
-
is_blocking: bool = True,
|
|
97
|
-
) -> typing.Callable[..., typing.Any]:
|
|
98
|
-
def wrapper(func):
|
|
99
|
-
return FuncHandler(
|
|
100
|
-
func,
|
|
101
|
-
list(rules),
|
|
102
|
-
is_blocking=is_blocking,
|
|
103
|
-
dataclass=None,
|
|
104
|
-
error_handler=error_handler or ErrorHandler(),
|
|
105
|
-
)
|
|
106
|
-
|
|
107
|
-
return wrapper
|
|
108
|
-
|
|
109
|
-
@typing.overload
|
|
110
|
-
def __call__(
|
|
111
|
-
self,
|
|
112
|
-
*rules: ABCRule,
|
|
113
|
-
) -> typing.Callable[
|
|
114
|
-
[Func[P, R]],
|
|
115
|
-
FuncHandler[Event, Func[P, R], ErrorHandler[Event]],
|
|
116
|
-
]: ...
|
|
117
|
-
|
|
118
|
-
@typing.overload
|
|
119
|
-
def __call__( # type: ignore
|
|
120
|
-
self,
|
|
121
|
-
*rules: ABCRule,
|
|
122
|
-
error_handler: ErrorHandlerT,
|
|
123
|
-
is_blocking: bool = True,
|
|
124
|
-
) -> typing.Callable[[Func[P, R]], FuncHandler[Event, Func[P, R], ErrorHandlerT]]: ...
|
|
125
|
-
|
|
126
|
-
@typing.overload
|
|
127
|
-
def __call__(
|
|
128
|
-
self,
|
|
129
|
-
*rules: ABCRule,
|
|
130
|
-
error_handler: typing.Literal[None] = None,
|
|
131
|
-
is_blocking: bool = True,
|
|
132
|
-
) -> typing.Callable[
|
|
133
|
-
[Func[P, R]],
|
|
134
|
-
FuncHandler[Event, Func[P, R], ErrorHandler[Event]],
|
|
135
|
-
]: ...
|
|
136
|
-
|
|
137
|
-
def __call__(
|
|
138
|
-
self,
|
|
139
|
-
*rules: ABCRule,
|
|
140
|
-
error_handler: ABCErrorHandler | None = None,
|
|
141
|
-
is_blocking: bool = True,
|
|
142
|
-
) -> typing.Callable[..., typing.Any]:
|
|
143
|
-
def wrapper(func):
|
|
144
|
-
func_handler = FuncHandler(
|
|
145
|
-
func,
|
|
146
|
-
[*self.auto_rules, *rules],
|
|
147
|
-
is_blocking=is_blocking,
|
|
148
|
-
dataclass=None,
|
|
149
|
-
error_handler=error_handler or ErrorHandler(),
|
|
150
|
-
)
|
|
151
|
-
self.handlers.append(func_handler)
|
|
152
|
-
return func_handler
|
|
153
|
-
|
|
154
|
-
return wrapper
|
|
155
|
-
|
|
156
|
-
def register_middleware(self, *args: typing.Any, **kwargs: typing.Any):
|
|
157
|
-
def wrapper(cls: type[MiddlewareT]) -> type[MiddlewareT]:
|
|
158
|
-
self.middlewares.append(cls(*args, **kwargs))
|
|
159
|
-
return cls
|
|
160
|
-
|
|
161
|
-
return wrapper
|
|
162
|
-
|
|
163
|
-
async def check(self, event: Update) -> bool:
|
|
164
|
-
match self.get_raw_event(event):
|
|
165
|
-
case Some(e) if issubclass(
|
|
166
|
-
self.event_model_class.expect(
|
|
167
|
-
"{!r} has no event model class in generic.".format(self.__class__.__qualname__),
|
|
168
|
-
),
|
|
169
|
-
e.__class__,
|
|
170
|
-
) and (self.handlers or self.middlewares):
|
|
171
|
-
return True
|
|
172
|
-
case _:
|
|
173
|
-
return False
|
|
174
|
-
|
|
175
|
-
async def process(self, event: Update, api: API) -> bool:
|
|
176
|
-
return await process_inner(
|
|
177
|
-
api,
|
|
178
|
-
self.event_model_class.unwrap().from_update(
|
|
179
|
-
update=self.get_raw_event(event).unwrap(),
|
|
180
|
-
bound_api=api,
|
|
181
|
-
),
|
|
182
|
-
event,
|
|
183
|
-
self.middlewares,
|
|
184
|
-
self.handlers,
|
|
185
|
-
self.return_manager,
|
|
186
|
-
)
|
|
187
|
-
|
|
188
|
-
def load(self, external: typing.Self) -> None:
|
|
189
|
-
self.auto_rules.extend(external.auto_rules)
|
|
190
|
-
self.handlers.extend(external.handlers)
|
|
191
|
-
self.middlewares.extend(external.middlewares)
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
class BaseStateView(ABCStateView[Event], BaseView[Event], ABC, typing.Generic[Event]):
|
|
195
|
-
@abstractmethod
|
|
196
|
-
def get_state_key(self, event: Event) -> int | None:
|
|
197
|
-
pass
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
__all__ = ("ABCStateView", "ABCView", "BaseStateView", "BaseView")
|
|
1
|
+
import typing
|
|
2
|
+
from abc import ABC, abstractmethod
|
|
3
|
+
from functools import cached_property
|
|
4
|
+
|
|
5
|
+
from fntypes.option import Nothing, Some
|
|
6
|
+
|
|
7
|
+
from telegrinder.api.api import API
|
|
8
|
+
from telegrinder.bot.cute_types.base import BaseCute
|
|
9
|
+
from telegrinder.bot.dispatch.handler.abc import ABCHandler
|
|
10
|
+
from telegrinder.bot.dispatch.handler.func import Func, FuncHandler
|
|
11
|
+
from telegrinder.bot.dispatch.middleware.abc import ABCMiddleware
|
|
12
|
+
from telegrinder.bot.dispatch.process import process_inner
|
|
13
|
+
from telegrinder.bot.dispatch.return_manager.abc import ABCReturnManager
|
|
14
|
+
from telegrinder.bot.dispatch.view.abc import ABCStateView, ABCView
|
|
15
|
+
from telegrinder.bot.rules.abc import ABCRule
|
|
16
|
+
from telegrinder.model import Model
|
|
17
|
+
from telegrinder.msgspec_utils import Option
|
|
18
|
+
from telegrinder.tools.error_handler.error_handler import ABCErrorHandler, ErrorHandler
|
|
19
|
+
from telegrinder.types.objects import Update
|
|
20
|
+
|
|
21
|
+
P = typing.ParamSpec("P")
|
|
22
|
+
R = typing.TypeVar("R", covariant=True)
|
|
23
|
+
Event = typing.TypeVar("Event", bound=BaseCute)
|
|
24
|
+
ErrorHandlerT = typing.TypeVar("ErrorHandlerT", bound=ABCErrorHandler)
|
|
25
|
+
MiddlewareT = typing.TypeVar("MiddlewareT", bound=ABCMiddleware)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def get_event_model_class(view: "BaseView[Event]") -> Option[type[Event]]:
|
|
29
|
+
for base in view.__class__.__bases__ + (view.__class__,):
|
|
30
|
+
if "__orig_bases__" not in base.__dict__:
|
|
31
|
+
continue
|
|
32
|
+
|
|
33
|
+
for orig_base in base.__dict__["__orig_bases__"]:
|
|
34
|
+
origin_base = typing.get_origin(orig_base) or orig_base
|
|
35
|
+
if not isinstance(origin_base, type) and not issubclass(origin_base, object):
|
|
36
|
+
continue
|
|
37
|
+
|
|
38
|
+
for generic_type in typing.get_args(orig_base):
|
|
39
|
+
orig_generic_type = typing.get_origin(generic_type) or generic_type
|
|
40
|
+
if isinstance(orig_generic_type, type) and issubclass(orig_generic_type, BaseCute):
|
|
41
|
+
return Some(generic_type)
|
|
42
|
+
|
|
43
|
+
return Nothing()
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
class BaseView(ABCView, typing.Generic[Event]):
|
|
47
|
+
auto_rules: list[ABCRule]
|
|
48
|
+
handlers: list[ABCHandler[Event]]
|
|
49
|
+
middlewares: list[ABCMiddleware[Event]]
|
|
50
|
+
return_manager: ABCReturnManager[Event] | None = None
|
|
51
|
+
|
|
52
|
+
@staticmethod
|
|
53
|
+
def get_raw_event(update: Update) -> Option[Model]:
|
|
54
|
+
return getattr(update, update.update_type.value)
|
|
55
|
+
|
|
56
|
+
@cached_property
|
|
57
|
+
def event_model_class(self) -> Option[type[Event]]:
|
|
58
|
+
return get_event_model_class(self)
|
|
59
|
+
|
|
60
|
+
@typing.overload
|
|
61
|
+
@classmethod
|
|
62
|
+
def to_handler(
|
|
63
|
+
cls,
|
|
64
|
+
*rules: ABCRule,
|
|
65
|
+
) -> typing.Callable[
|
|
66
|
+
[Func[P, R]],
|
|
67
|
+
FuncHandler[Event, Func[P, R], ErrorHandler[Event]],
|
|
68
|
+
]: ...
|
|
69
|
+
|
|
70
|
+
@typing.overload
|
|
71
|
+
@classmethod
|
|
72
|
+
def to_handler(
|
|
73
|
+
cls,
|
|
74
|
+
*rules: ABCRule,
|
|
75
|
+
error_handler: ErrorHandlerT,
|
|
76
|
+
is_blocking: bool = True,
|
|
77
|
+
) -> typing.Callable[[Func[P, R]], FuncHandler[Event, Func[P, R], ErrorHandlerT]]: ...
|
|
78
|
+
|
|
79
|
+
@typing.overload
|
|
80
|
+
@classmethod
|
|
81
|
+
def to_handler(
|
|
82
|
+
cls,
|
|
83
|
+
*rules: ABCRule,
|
|
84
|
+
error_handler: typing.Literal[None] = None,
|
|
85
|
+
is_blocking: bool = True,
|
|
86
|
+
) -> typing.Callable[
|
|
87
|
+
[Func[P, R]],
|
|
88
|
+
FuncHandler[Event, Func[P, R], ErrorHandler[Event]],
|
|
89
|
+
]: ...
|
|
90
|
+
|
|
91
|
+
@classmethod
|
|
92
|
+
def to_handler(
|
|
93
|
+
cls,
|
|
94
|
+
*rules: ABCRule,
|
|
95
|
+
error_handler: ABCErrorHandler | None = None,
|
|
96
|
+
is_blocking: bool = True,
|
|
97
|
+
) -> typing.Callable[..., typing.Any]:
|
|
98
|
+
def wrapper(func):
|
|
99
|
+
return FuncHandler(
|
|
100
|
+
func,
|
|
101
|
+
list(rules),
|
|
102
|
+
is_blocking=is_blocking,
|
|
103
|
+
dataclass=None,
|
|
104
|
+
error_handler=error_handler or ErrorHandler(),
|
|
105
|
+
)
|
|
106
|
+
|
|
107
|
+
return wrapper
|
|
108
|
+
|
|
109
|
+
@typing.overload
|
|
110
|
+
def __call__(
|
|
111
|
+
self,
|
|
112
|
+
*rules: ABCRule,
|
|
113
|
+
) -> typing.Callable[
|
|
114
|
+
[Func[P, R]],
|
|
115
|
+
FuncHandler[Event, Func[P, R], ErrorHandler[Event]],
|
|
116
|
+
]: ...
|
|
117
|
+
|
|
118
|
+
@typing.overload
|
|
119
|
+
def __call__( # type: ignore
|
|
120
|
+
self,
|
|
121
|
+
*rules: ABCRule,
|
|
122
|
+
error_handler: ErrorHandlerT,
|
|
123
|
+
is_blocking: bool = True,
|
|
124
|
+
) -> typing.Callable[[Func[P, R]], FuncHandler[Event, Func[P, R], ErrorHandlerT]]: ...
|
|
125
|
+
|
|
126
|
+
@typing.overload
|
|
127
|
+
def __call__(
|
|
128
|
+
self,
|
|
129
|
+
*rules: ABCRule,
|
|
130
|
+
error_handler: typing.Literal[None] = None,
|
|
131
|
+
is_blocking: bool = True,
|
|
132
|
+
) -> typing.Callable[
|
|
133
|
+
[Func[P, R]],
|
|
134
|
+
FuncHandler[Event, Func[P, R], ErrorHandler[Event]],
|
|
135
|
+
]: ...
|
|
136
|
+
|
|
137
|
+
def __call__(
|
|
138
|
+
self,
|
|
139
|
+
*rules: ABCRule,
|
|
140
|
+
error_handler: ABCErrorHandler | None = None,
|
|
141
|
+
is_blocking: bool = True,
|
|
142
|
+
) -> typing.Callable[..., typing.Any]:
|
|
143
|
+
def wrapper(func):
|
|
144
|
+
func_handler = FuncHandler(
|
|
145
|
+
func,
|
|
146
|
+
[*self.auto_rules, *rules],
|
|
147
|
+
is_blocking=is_blocking,
|
|
148
|
+
dataclass=None,
|
|
149
|
+
error_handler=error_handler or ErrorHandler(),
|
|
150
|
+
)
|
|
151
|
+
self.handlers.append(func_handler)
|
|
152
|
+
return func_handler
|
|
153
|
+
|
|
154
|
+
return wrapper
|
|
155
|
+
|
|
156
|
+
def register_middleware(self, *args: typing.Any, **kwargs: typing.Any):
|
|
157
|
+
def wrapper(cls: type[MiddlewareT]) -> type[MiddlewareT]:
|
|
158
|
+
self.middlewares.append(cls(*args, **kwargs))
|
|
159
|
+
return cls
|
|
160
|
+
|
|
161
|
+
return wrapper
|
|
162
|
+
|
|
163
|
+
async def check(self, event: Update) -> bool:
|
|
164
|
+
match self.get_raw_event(event):
|
|
165
|
+
case Some(e) if issubclass(
|
|
166
|
+
self.event_model_class.expect(
|
|
167
|
+
"{!r} has no event model class in generic.".format(self.__class__.__qualname__),
|
|
168
|
+
),
|
|
169
|
+
e.__class__,
|
|
170
|
+
) and (self.handlers or self.middlewares):
|
|
171
|
+
return True
|
|
172
|
+
case _:
|
|
173
|
+
return False
|
|
174
|
+
|
|
175
|
+
async def process(self, event: Update, api: API) -> bool:
|
|
176
|
+
return await process_inner(
|
|
177
|
+
api,
|
|
178
|
+
self.event_model_class.unwrap().from_update(
|
|
179
|
+
update=self.get_raw_event(event).unwrap(),
|
|
180
|
+
bound_api=api,
|
|
181
|
+
),
|
|
182
|
+
event,
|
|
183
|
+
self.middlewares,
|
|
184
|
+
self.handlers,
|
|
185
|
+
self.return_manager,
|
|
186
|
+
)
|
|
187
|
+
|
|
188
|
+
def load(self, external: typing.Self) -> None:
|
|
189
|
+
self.auto_rules.extend(external.auto_rules)
|
|
190
|
+
self.handlers.extend(external.handlers)
|
|
191
|
+
self.middlewares.extend(external.middlewares)
|
|
192
|
+
|
|
193
|
+
|
|
194
|
+
class BaseStateView(ABCStateView[Event], BaseView[Event], ABC, typing.Generic[Event]):
|
|
195
|
+
@abstractmethod
|
|
196
|
+
def get_state_key(self, event: Event) -> int | None:
|
|
197
|
+
pass
|
|
198
|
+
|
|
199
|
+
|
|
200
|
+
__all__ = ("ABCStateView", "ABCView", "BaseStateView", "BaseView")
|
|
@@ -1,129 +1,129 @@
|
|
|
1
|
-
import dataclasses
|
|
2
|
-
|
|
3
|
-
import typing_extensions as typing
|
|
4
|
-
|
|
5
|
-
from telegrinder.bot.dispatch.view import (
|
|
6
|
-
callback_query,
|
|
7
|
-
chat_join_request,
|
|
8
|
-
chat_member,
|
|
9
|
-
inline_query,
|
|
10
|
-
message,
|
|
11
|
-
raw,
|
|
12
|
-
)
|
|
13
|
-
from telegrinder.bot.dispatch.view.abc import ABCEventRawView, ABCView
|
|
14
|
-
from telegrinder.types.enums import UpdateType
|
|
15
|
-
|
|
16
|
-
CallbackQueryView = typing.TypeVar(
|
|
17
|
-
"CallbackQueryView", bound=ABCView, default=callback_query.CallbackQueryView
|
|
18
|
-
)
|
|
19
|
-
ChatJoinRequestView = typing.TypeVar(
|
|
20
|
-
"ChatJoinRequestView", bound=ABCView, default=chat_join_request.ChatJoinRequestView
|
|
21
|
-
)
|
|
22
|
-
ChatMemberView = typing.TypeVar("ChatMemberView", bound=ABCView, default=chat_member.ChatMemberView)
|
|
23
|
-
InlineQueryView = typing.TypeVar("InlineQueryView", bound=ABCView, default=inline_query.InlineQueryView)
|
|
24
|
-
MessageView = typing.TypeVar("MessageView", bound=ABCView, default=message.MessageView)
|
|
25
|
-
RawEventView = typing.TypeVar("RawEventView", bound=ABCEventRawView, default=raw.RawEventView)
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
@dataclasses.dataclass(kw_only=True)
|
|
29
|
-
class ViewBox(
|
|
30
|
-
typing.Generic[
|
|
31
|
-
CallbackQueryView,
|
|
32
|
-
ChatJoinRequestView,
|
|
33
|
-
ChatMemberView,
|
|
34
|
-
InlineQueryView,
|
|
35
|
-
MessageView,
|
|
36
|
-
RawEventView,
|
|
37
|
-
],
|
|
38
|
-
):
|
|
39
|
-
callback_query_view: dataclasses.InitVar[CallbackQueryView | None] = None
|
|
40
|
-
chat_join_request_view: dataclasses.InitVar[ChatJoinRequestView | None] = None
|
|
41
|
-
chat_member_view: dataclasses.InitVar[ChatMemberView | None] = None
|
|
42
|
-
my_chat_member_view: dataclasses.InitVar[ChatMemberView | None] = None
|
|
43
|
-
inline_query_view: dataclasses.InitVar[InlineQueryView | None] = None
|
|
44
|
-
message_view: dataclasses.InitVar[MessageView | None] = None
|
|
45
|
-
business_message_view: dataclasses.InitVar[MessageView | None] = None
|
|
46
|
-
channel_post_view: dataclasses.InitVar[MessageView | None] = None
|
|
47
|
-
edited_message_view: dataclasses.InitVar[MessageView | None] = None
|
|
48
|
-
edited_business_message_view: dataclasses.InitVar[MessageView | None] = None
|
|
49
|
-
edited_channel_post_view: dataclasses.InitVar[MessageView | None] = None
|
|
50
|
-
any_message_view: dataclasses.InitVar[MessageView | None] = None
|
|
51
|
-
chat_member_updated_view: dataclasses.InitVar[ChatMemberView | None] = None
|
|
52
|
-
raw_event_view: dataclasses.InitVar[RawEventView | None] = None
|
|
53
|
-
|
|
54
|
-
def __post_init__(
|
|
55
|
-
self,
|
|
56
|
-
callback_query_view: CallbackQueryView | None = None,
|
|
57
|
-
chat_join_request_view: ChatJoinRequestView | None = None,
|
|
58
|
-
chat_member_view: ChatMemberView | None = None,
|
|
59
|
-
my_chat_member_view: ChatMemberView | None = None,
|
|
60
|
-
inline_query_view: InlineQueryView | None = None,
|
|
61
|
-
message_view: MessageView | None = None,
|
|
62
|
-
business_message_view: MessageView | None = None,
|
|
63
|
-
channel_post_view: MessageView | None = None,
|
|
64
|
-
edited_message_view: MessageView | None = None,
|
|
65
|
-
edited_business_message_view: MessageView | None = None,
|
|
66
|
-
edited_channel_post_view: MessageView | None = None,
|
|
67
|
-
any_message_view: MessageView | None = None,
|
|
68
|
-
chat_member_updated_view: ChatMemberView | None = None,
|
|
69
|
-
raw_event_view: RawEventView | None = None,
|
|
70
|
-
) -> None:
|
|
71
|
-
self.callback_query = typing.cast(
|
|
72
|
-
CallbackQueryView,
|
|
73
|
-
callback_query_view or callback_query.CallbackQueryView(),
|
|
74
|
-
)
|
|
75
|
-
self.chat_join_request = typing.cast(
|
|
76
|
-
ChatJoinRequestView,
|
|
77
|
-
chat_join_request_view or chat_join_request.ChatJoinRequestView(),
|
|
78
|
-
)
|
|
79
|
-
self.chat_member = typing.cast(
|
|
80
|
-
ChatMemberView,
|
|
81
|
-
chat_member_view or chat_member.ChatMemberView(update_type=UpdateType.CHAT_MEMBER),
|
|
82
|
-
)
|
|
83
|
-
self.my_chat_member = typing.cast(
|
|
84
|
-
ChatMemberView,
|
|
85
|
-
my_chat_member_view or chat_member.ChatMemberView(update_type=UpdateType.MY_CHAT_MEMBER),
|
|
86
|
-
)
|
|
87
|
-
self.inline_query = typing.cast(
|
|
88
|
-
InlineQueryView,
|
|
89
|
-
inline_query_view or inline_query.InlineQueryView(),
|
|
90
|
-
)
|
|
91
|
-
self.message = typing.cast(
|
|
92
|
-
MessageView,
|
|
93
|
-
message_view or message.MessageView(update_type=UpdateType.MESSAGE),
|
|
94
|
-
)
|
|
95
|
-
self.business_message = typing.cast(
|
|
96
|
-
MessageView,
|
|
97
|
-
business_message_view or message.MessageView(update_type=UpdateType.BUSINESS_MESSAGE),
|
|
98
|
-
)
|
|
99
|
-
self.channel_post = typing.cast(
|
|
100
|
-
MessageView,
|
|
101
|
-
channel_post_view or message.MessageView(update_type=UpdateType.CHANNEL_POST),
|
|
102
|
-
)
|
|
103
|
-
self.edited_message = typing.cast(
|
|
104
|
-
MessageView,
|
|
105
|
-
edited_message_view or message.MessageView(update_type=UpdateType.EDITED_MESSAGE),
|
|
106
|
-
)
|
|
107
|
-
self.edited_business_message = typing.cast(
|
|
108
|
-
MessageView,
|
|
109
|
-
edited_business_message_view
|
|
110
|
-
or message.MessageView(update_type=UpdateType.EDITED_BUSINESS_MESSAGE),
|
|
111
|
-
)
|
|
112
|
-
self.edited_channel_post = typing.cast(
|
|
113
|
-
MessageView,
|
|
114
|
-
edited_channel_post_view or message.MessageView(update_type=UpdateType.EDITED_CHANNEL_POST),
|
|
115
|
-
)
|
|
116
|
-
self.any_message = typing.cast(MessageView, any_message_view or message.MessageView())
|
|
117
|
-
self.chat_member_updated = typing.cast(
|
|
118
|
-
ChatMemberView,
|
|
119
|
-
chat_member_updated_view or chat_member.ChatMemberView(),
|
|
120
|
-
)
|
|
121
|
-
self.raw_event = typing.cast(RawEventView, raw_event_view or raw.RawEventView())
|
|
122
|
-
|
|
123
|
-
def get_views(self) -> dict[str, ABCView]:
|
|
124
|
-
"""Get all views."""
|
|
125
|
-
|
|
126
|
-
return {name: view for name, view in self.__dict__.items() if isinstance(view, ABCView)}
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
__all__ = ("ViewBox",)
|
|
1
|
+
import dataclasses
|
|
2
|
+
|
|
3
|
+
import typing_extensions as typing
|
|
4
|
+
|
|
5
|
+
from telegrinder.bot.dispatch.view import (
|
|
6
|
+
callback_query,
|
|
7
|
+
chat_join_request,
|
|
8
|
+
chat_member,
|
|
9
|
+
inline_query,
|
|
10
|
+
message,
|
|
11
|
+
raw,
|
|
12
|
+
)
|
|
13
|
+
from telegrinder.bot.dispatch.view.abc import ABCEventRawView, ABCView
|
|
14
|
+
from telegrinder.types.enums import UpdateType
|
|
15
|
+
|
|
16
|
+
CallbackQueryView = typing.TypeVar(
|
|
17
|
+
"CallbackQueryView", bound=ABCView, default=callback_query.CallbackQueryView
|
|
18
|
+
)
|
|
19
|
+
ChatJoinRequestView = typing.TypeVar(
|
|
20
|
+
"ChatJoinRequestView", bound=ABCView, default=chat_join_request.ChatJoinRequestView
|
|
21
|
+
)
|
|
22
|
+
ChatMemberView = typing.TypeVar("ChatMemberView", bound=ABCView, default=chat_member.ChatMemberView)
|
|
23
|
+
InlineQueryView = typing.TypeVar("InlineQueryView", bound=ABCView, default=inline_query.InlineQueryView)
|
|
24
|
+
MessageView = typing.TypeVar("MessageView", bound=ABCView, default=message.MessageView)
|
|
25
|
+
RawEventView = typing.TypeVar("RawEventView", bound=ABCEventRawView, default=raw.RawEventView)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
@dataclasses.dataclass(kw_only=True)
|
|
29
|
+
class ViewBox(
|
|
30
|
+
typing.Generic[
|
|
31
|
+
CallbackQueryView,
|
|
32
|
+
ChatJoinRequestView,
|
|
33
|
+
ChatMemberView,
|
|
34
|
+
InlineQueryView,
|
|
35
|
+
MessageView,
|
|
36
|
+
RawEventView,
|
|
37
|
+
],
|
|
38
|
+
):
|
|
39
|
+
callback_query_view: dataclasses.InitVar[CallbackQueryView | None] = None
|
|
40
|
+
chat_join_request_view: dataclasses.InitVar[ChatJoinRequestView | None] = None
|
|
41
|
+
chat_member_view: dataclasses.InitVar[ChatMemberView | None] = None
|
|
42
|
+
my_chat_member_view: dataclasses.InitVar[ChatMemberView | None] = None
|
|
43
|
+
inline_query_view: dataclasses.InitVar[InlineQueryView | None] = None
|
|
44
|
+
message_view: dataclasses.InitVar[MessageView | None] = None
|
|
45
|
+
business_message_view: dataclasses.InitVar[MessageView | None] = None
|
|
46
|
+
channel_post_view: dataclasses.InitVar[MessageView | None] = None
|
|
47
|
+
edited_message_view: dataclasses.InitVar[MessageView | None] = None
|
|
48
|
+
edited_business_message_view: dataclasses.InitVar[MessageView | None] = None
|
|
49
|
+
edited_channel_post_view: dataclasses.InitVar[MessageView | None] = None
|
|
50
|
+
any_message_view: dataclasses.InitVar[MessageView | None] = None
|
|
51
|
+
chat_member_updated_view: dataclasses.InitVar[ChatMemberView | None] = None
|
|
52
|
+
raw_event_view: dataclasses.InitVar[RawEventView | None] = None
|
|
53
|
+
|
|
54
|
+
def __post_init__(
|
|
55
|
+
self,
|
|
56
|
+
callback_query_view: CallbackQueryView | None = None,
|
|
57
|
+
chat_join_request_view: ChatJoinRequestView | None = None,
|
|
58
|
+
chat_member_view: ChatMemberView | None = None,
|
|
59
|
+
my_chat_member_view: ChatMemberView | None = None,
|
|
60
|
+
inline_query_view: InlineQueryView | None = None,
|
|
61
|
+
message_view: MessageView | None = None,
|
|
62
|
+
business_message_view: MessageView | None = None,
|
|
63
|
+
channel_post_view: MessageView | None = None,
|
|
64
|
+
edited_message_view: MessageView | None = None,
|
|
65
|
+
edited_business_message_view: MessageView | None = None,
|
|
66
|
+
edited_channel_post_view: MessageView | None = None,
|
|
67
|
+
any_message_view: MessageView | None = None,
|
|
68
|
+
chat_member_updated_view: ChatMemberView | None = None,
|
|
69
|
+
raw_event_view: RawEventView | None = None,
|
|
70
|
+
) -> None:
|
|
71
|
+
self.callback_query = typing.cast(
|
|
72
|
+
CallbackQueryView,
|
|
73
|
+
callback_query_view or callback_query.CallbackQueryView(),
|
|
74
|
+
)
|
|
75
|
+
self.chat_join_request = typing.cast(
|
|
76
|
+
ChatJoinRequestView,
|
|
77
|
+
chat_join_request_view or chat_join_request.ChatJoinRequestView(),
|
|
78
|
+
)
|
|
79
|
+
self.chat_member = typing.cast(
|
|
80
|
+
ChatMemberView,
|
|
81
|
+
chat_member_view or chat_member.ChatMemberView(update_type=UpdateType.CHAT_MEMBER),
|
|
82
|
+
)
|
|
83
|
+
self.my_chat_member = typing.cast(
|
|
84
|
+
ChatMemberView,
|
|
85
|
+
my_chat_member_view or chat_member.ChatMemberView(update_type=UpdateType.MY_CHAT_MEMBER),
|
|
86
|
+
)
|
|
87
|
+
self.inline_query = typing.cast(
|
|
88
|
+
InlineQueryView,
|
|
89
|
+
inline_query_view or inline_query.InlineQueryView(),
|
|
90
|
+
)
|
|
91
|
+
self.message = typing.cast(
|
|
92
|
+
MessageView,
|
|
93
|
+
message_view or message.MessageView(update_type=UpdateType.MESSAGE),
|
|
94
|
+
)
|
|
95
|
+
self.business_message = typing.cast(
|
|
96
|
+
MessageView,
|
|
97
|
+
business_message_view or message.MessageView(update_type=UpdateType.BUSINESS_MESSAGE),
|
|
98
|
+
)
|
|
99
|
+
self.channel_post = typing.cast(
|
|
100
|
+
MessageView,
|
|
101
|
+
channel_post_view or message.MessageView(update_type=UpdateType.CHANNEL_POST),
|
|
102
|
+
)
|
|
103
|
+
self.edited_message = typing.cast(
|
|
104
|
+
MessageView,
|
|
105
|
+
edited_message_view or message.MessageView(update_type=UpdateType.EDITED_MESSAGE),
|
|
106
|
+
)
|
|
107
|
+
self.edited_business_message = typing.cast(
|
|
108
|
+
MessageView,
|
|
109
|
+
edited_business_message_view
|
|
110
|
+
or message.MessageView(update_type=UpdateType.EDITED_BUSINESS_MESSAGE),
|
|
111
|
+
)
|
|
112
|
+
self.edited_channel_post = typing.cast(
|
|
113
|
+
MessageView,
|
|
114
|
+
edited_channel_post_view or message.MessageView(update_type=UpdateType.EDITED_CHANNEL_POST),
|
|
115
|
+
)
|
|
116
|
+
self.any_message = typing.cast(MessageView, any_message_view or message.MessageView())
|
|
117
|
+
self.chat_member_updated = typing.cast(
|
|
118
|
+
ChatMemberView,
|
|
119
|
+
chat_member_updated_view or chat_member.ChatMemberView(),
|
|
120
|
+
)
|
|
121
|
+
self.raw_event = typing.cast(RawEventView, raw_event_view or raw.RawEventView())
|
|
122
|
+
|
|
123
|
+
def get_views(self) -> dict[str, ABCView]:
|
|
124
|
+
"""Get all views."""
|
|
125
|
+
|
|
126
|
+
return {name: view for name, view in self.__dict__.items() if isinstance(view, ABCView)}
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
__all__ = ("ViewBox",)
|