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.

Files changed (165) hide show
  1. telegrinder/__init__.py +144 -144
  2. telegrinder/api/__init__.py +8 -8
  3. telegrinder/api/api.py +93 -93
  4. telegrinder/api/error.py +16 -16
  5. telegrinder/api/response.py +20 -20
  6. telegrinder/api/token.py +36 -36
  7. telegrinder/bot/__init__.py +66 -66
  8. telegrinder/bot/bot.py +76 -76
  9. telegrinder/bot/cute_types/__init__.py +17 -17
  10. telegrinder/bot/cute_types/base.py +258 -258
  11. telegrinder/bot/cute_types/callback_query.py +385 -385
  12. telegrinder/bot/cute_types/chat_join_request.py +61 -61
  13. telegrinder/bot/cute_types/chat_member_updated.py +160 -160
  14. telegrinder/bot/cute_types/inline_query.py +43 -43
  15. telegrinder/bot/cute_types/message.py +2637 -2637
  16. telegrinder/bot/cute_types/update.py +104 -109
  17. telegrinder/bot/cute_types/utils.py +95 -95
  18. telegrinder/bot/dispatch/__init__.py +55 -55
  19. telegrinder/bot/dispatch/abc.py +77 -77
  20. telegrinder/bot/dispatch/context.py +98 -98
  21. telegrinder/bot/dispatch/dispatch.py +202 -202
  22. telegrinder/bot/dispatch/handler/__init__.py +13 -13
  23. telegrinder/bot/dispatch/handler/abc.py +24 -24
  24. telegrinder/bot/dispatch/handler/audio_reply.py +44 -44
  25. telegrinder/bot/dispatch/handler/base.py +57 -57
  26. telegrinder/bot/dispatch/handler/document_reply.py +44 -44
  27. telegrinder/bot/dispatch/handler/func.py +135 -135
  28. telegrinder/bot/dispatch/handler/media_group_reply.py +43 -43
  29. telegrinder/bot/dispatch/handler/message_reply.py +36 -36
  30. telegrinder/bot/dispatch/handler/photo_reply.py +44 -44
  31. telegrinder/bot/dispatch/handler/sticker_reply.py +37 -37
  32. telegrinder/bot/dispatch/handler/video_reply.py +44 -44
  33. telegrinder/bot/dispatch/middleware/__init__.py +3 -3
  34. telegrinder/bot/dispatch/middleware/abc.py +22 -16
  35. telegrinder/bot/dispatch/process.py +157 -132
  36. telegrinder/bot/dispatch/return_manager/__init__.py +13 -13
  37. telegrinder/bot/dispatch/return_manager/abc.py +108 -108
  38. telegrinder/bot/dispatch/return_manager/callback_query.py +20 -20
  39. telegrinder/bot/dispatch/return_manager/inline_query.py +15 -15
  40. telegrinder/bot/dispatch/return_manager/message.py +36 -36
  41. telegrinder/bot/dispatch/view/__init__.py +13 -13
  42. telegrinder/bot/dispatch/view/abc.py +41 -41
  43. telegrinder/bot/dispatch/view/base.py +200 -200
  44. telegrinder/bot/dispatch/view/box.py +129 -129
  45. telegrinder/bot/dispatch/view/callback_query.py +17 -17
  46. telegrinder/bot/dispatch/view/chat_join_request.py +16 -16
  47. telegrinder/bot/dispatch/view/chat_member.py +39 -39
  48. telegrinder/bot/dispatch/view/inline_query.py +17 -17
  49. telegrinder/bot/dispatch/view/message.py +44 -44
  50. telegrinder/bot/dispatch/view/raw.py +114 -114
  51. telegrinder/bot/dispatch/waiter_machine/__init__.py +17 -17
  52. telegrinder/bot/dispatch/waiter_machine/actions.py +13 -13
  53. telegrinder/bot/dispatch/waiter_machine/hasher/__init__.py +8 -8
  54. telegrinder/bot/dispatch/waiter_machine/hasher/callback.py +55 -55
  55. telegrinder/bot/dispatch/waiter_machine/hasher/hasher.py +57 -57
  56. telegrinder/bot/dispatch/waiter_machine/hasher/message.py +51 -51
  57. telegrinder/bot/dispatch/waiter_machine/hasher/state.py +19 -19
  58. telegrinder/bot/dispatch/waiter_machine/machine.py +172 -167
  59. telegrinder/bot/dispatch/waiter_machine/middleware.py +89 -89
  60. telegrinder/bot/dispatch/waiter_machine/short_state.py +68 -68
  61. telegrinder/bot/polling/__init__.py +4 -4
  62. telegrinder/bot/polling/abc.py +25 -25
  63. telegrinder/bot/polling/polling.py +131 -131
  64. telegrinder/bot/rules/__init__.py +62 -62
  65. telegrinder/bot/rules/abc.py +213 -213
  66. telegrinder/bot/rules/adapter/__init__.py +12 -9
  67. telegrinder/bot/rules/adapter/abc.py +31 -29
  68. telegrinder/bot/rules/adapter/errors.py +5 -5
  69. telegrinder/bot/rules/adapter/event.py +65 -67
  70. telegrinder/bot/rules/adapter/node.py +48 -48
  71. telegrinder/bot/rules/adapter/raw_event.py +27 -0
  72. telegrinder/bot/rules/adapter/raw_update.py +30 -30
  73. telegrinder/bot/rules/callback_data.py +170 -170
  74. telegrinder/bot/rules/chat_join.py +46 -46
  75. telegrinder/bot/rules/command.py +126 -126
  76. telegrinder/bot/rules/enum_text.py +36 -36
  77. telegrinder/bot/rules/func.py +26 -26
  78. telegrinder/bot/rules/fuzzy.py +24 -24
  79. telegrinder/bot/rules/inline.py +60 -60
  80. telegrinder/bot/rules/integer.py +20 -20
  81. telegrinder/bot/rules/is_from.py +127 -127
  82. telegrinder/bot/rules/markup.py +43 -43
  83. telegrinder/bot/rules/mention.py +14 -14
  84. telegrinder/bot/rules/message.py +17 -17
  85. telegrinder/bot/rules/message_entities.py +35 -35
  86. telegrinder/bot/rules/node.py +27 -27
  87. telegrinder/bot/rules/regex.py +37 -37
  88. telegrinder/bot/rules/rule_enum.py +72 -72
  89. telegrinder/bot/rules/start.py +42 -42
  90. telegrinder/bot/rules/state.py +37 -37
  91. telegrinder/bot/rules/text.py +33 -33
  92. telegrinder/bot/rules/update.py +15 -15
  93. telegrinder/bot/scenario/__init__.py +5 -5
  94. telegrinder/bot/scenario/abc.py +19 -19
  95. telegrinder/bot/scenario/checkbox.py +176 -167
  96. telegrinder/bot/scenario/choice.py +51 -46
  97. telegrinder/client/__init__.py +4 -4
  98. telegrinder/client/abc.py +75 -75
  99. telegrinder/client/aiohttp.py +130 -130
  100. telegrinder/model.py +320 -295
  101. telegrinder/modules.py +237 -237
  102. telegrinder/msgspec_json.py +14 -14
  103. telegrinder/msgspec_utils.py +410 -410
  104. telegrinder/node/__init__.py +0 -0
  105. telegrinder/node/attachment.py +87 -87
  106. telegrinder/node/base.py +166 -166
  107. telegrinder/node/callback_query.py +53 -53
  108. telegrinder/node/command.py +33 -33
  109. telegrinder/node/composer.py +198 -198
  110. telegrinder/node/container.py +27 -27
  111. telegrinder/node/event.py +65 -65
  112. telegrinder/node/me.py +16 -16
  113. telegrinder/node/message.py +14 -14
  114. telegrinder/node/polymorphic.py +48 -48
  115. telegrinder/node/rule.py +76 -76
  116. telegrinder/node/scope.py +38 -38
  117. telegrinder/node/source.py +71 -71
  118. telegrinder/node/text.py +41 -41
  119. telegrinder/node/tools/__init__.py +3 -3
  120. telegrinder/node/tools/generator.py +40 -40
  121. telegrinder/node/update.py +15 -15
  122. telegrinder/rules.py +0 -0
  123. telegrinder/tools/__init__.py +74 -74
  124. telegrinder/tools/buttons.py +79 -79
  125. telegrinder/tools/error_handler/__init__.py +7 -7
  126. telegrinder/tools/error_handler/abc.py +33 -33
  127. telegrinder/tools/error_handler/error.py +9 -9
  128. telegrinder/tools/error_handler/error_handler.py +193 -193
  129. telegrinder/tools/formatting/__init__.py +46 -46
  130. telegrinder/tools/formatting/html.py +283 -283
  131. telegrinder/tools/formatting/links.py +33 -33
  132. telegrinder/tools/formatting/spec_html_formats.py +111 -111
  133. telegrinder/tools/functional.py +12 -12
  134. telegrinder/tools/global_context/__init__.py +7 -7
  135. telegrinder/tools/global_context/abc.py +63 -63
  136. telegrinder/tools/global_context/global_context.py +412 -412
  137. telegrinder/tools/global_context/telegrinder_ctx.py +27 -27
  138. telegrinder/tools/i18n/__init__.py +7 -7
  139. telegrinder/tools/i18n/abc.py +30 -30
  140. telegrinder/tools/i18n/middleware/__init__.py +3 -3
  141. telegrinder/tools/i18n/middleware/abc.py +25 -25
  142. telegrinder/tools/i18n/simple.py +43 -43
  143. telegrinder/tools/kb_set/__init__.py +4 -4
  144. telegrinder/tools/kb_set/base.py +15 -15
  145. telegrinder/tools/kb_set/yaml.py +63 -63
  146. telegrinder/tools/keyboard.py +132 -132
  147. telegrinder/tools/limited_dict.py +37 -37
  148. telegrinder/tools/loop_wrapper/__init__.py +4 -4
  149. telegrinder/tools/loop_wrapper/abc.py +15 -15
  150. telegrinder/tools/loop_wrapper/loop_wrapper.py +224 -224
  151. telegrinder/tools/magic.py +157 -157
  152. telegrinder/tools/parse_mode.py +6 -6
  153. telegrinder/tools/state_storage/__init__.py +4 -4
  154. telegrinder/tools/state_storage/abc.py +35 -35
  155. telegrinder/tools/state_storage/memory.py +25 -25
  156. telegrinder/types/__init__.py +260 -260
  157. telegrinder/types/enums.py +701 -701
  158. telegrinder/types/methods.py +4633 -4633
  159. telegrinder/types/objects.py +6950 -8561
  160. telegrinder/verification_utils.py +32 -32
  161. {telegrinder-0.3.3.post1.dist-info → telegrinder-0.3.4.post1.dist-info}/LICENSE +22 -22
  162. {telegrinder-0.3.3.post1.dist-info → telegrinder-0.3.4.post1.dist-info}/METADATA +1 -1
  163. telegrinder-0.3.4.post1.dist-info/RECORD +165 -0
  164. telegrinder-0.3.3.post1.dist-info/RECORD +0 -164
  165. {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",)