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.

Files changed (192) hide show
  1. telegrinder/__init__.py +148 -149
  2. telegrinder/api/__init__.py +9 -8
  3. telegrinder/api/api.py +101 -93
  4. telegrinder/api/error.py +20 -16
  5. telegrinder/api/response.py +20 -20
  6. telegrinder/api/token.py +36 -36
  7. telegrinder/bot/__init__.py +72 -66
  8. telegrinder/bot/bot.py +83 -76
  9. telegrinder/bot/cute_types/__init__.py +19 -17
  10. telegrinder/bot/cute_types/base.py +184 -258
  11. telegrinder/bot/cute_types/callback_query.py +400 -385
  12. telegrinder/bot/cute_types/chat_join_request.py +62 -61
  13. telegrinder/bot/cute_types/chat_member_updated.py +157 -160
  14. telegrinder/bot/cute_types/inline_query.py +44 -43
  15. telegrinder/bot/cute_types/message.py +2590 -2637
  16. telegrinder/bot/cute_types/pre_checkout_query.py +42 -0
  17. telegrinder/bot/cute_types/update.py +112 -104
  18. telegrinder/bot/cute_types/utils.py +62 -95
  19. telegrinder/bot/dispatch/__init__.py +59 -55
  20. telegrinder/bot/dispatch/abc.py +76 -77
  21. telegrinder/bot/dispatch/context.py +96 -98
  22. telegrinder/bot/dispatch/dispatch.py +254 -202
  23. telegrinder/bot/dispatch/handler/__init__.py +13 -13
  24. telegrinder/bot/dispatch/handler/abc.py +23 -24
  25. telegrinder/bot/dispatch/handler/audio_reply.py +44 -44
  26. telegrinder/bot/dispatch/handler/base.py +57 -57
  27. telegrinder/bot/dispatch/handler/document_reply.py +44 -44
  28. telegrinder/bot/dispatch/handler/func.py +129 -135
  29. telegrinder/bot/dispatch/handler/media_group_reply.py +44 -43
  30. telegrinder/bot/dispatch/handler/message_reply.py +36 -36
  31. telegrinder/bot/dispatch/handler/photo_reply.py +44 -44
  32. telegrinder/bot/dispatch/handler/sticker_reply.py +37 -37
  33. telegrinder/bot/dispatch/handler/video_reply.py +44 -44
  34. telegrinder/bot/dispatch/middleware/__init__.py +3 -3
  35. telegrinder/bot/dispatch/middleware/abc.py +97 -22
  36. telegrinder/bot/dispatch/middleware/global_middleware.py +70 -0
  37. telegrinder/bot/dispatch/process.py +151 -157
  38. telegrinder/bot/dispatch/return_manager/__init__.py +15 -13
  39. telegrinder/bot/dispatch/return_manager/abc.py +104 -108
  40. telegrinder/bot/dispatch/return_manager/callback_query.py +20 -20
  41. telegrinder/bot/dispatch/return_manager/inline_query.py +15 -15
  42. telegrinder/bot/dispatch/return_manager/message.py +36 -36
  43. telegrinder/bot/dispatch/return_manager/pre_checkout_query.py +20 -0
  44. telegrinder/bot/dispatch/view/__init__.py +15 -13
  45. telegrinder/bot/dispatch/view/abc.py +45 -41
  46. telegrinder/bot/dispatch/view/base.py +231 -200
  47. telegrinder/bot/dispatch/view/box.py +140 -129
  48. telegrinder/bot/dispatch/view/callback_query.py +16 -17
  49. telegrinder/bot/dispatch/view/chat_join_request.py +11 -16
  50. telegrinder/bot/dispatch/view/chat_member.py +37 -39
  51. telegrinder/bot/dispatch/view/inline_query.py +16 -17
  52. telegrinder/bot/dispatch/view/message.py +43 -44
  53. telegrinder/bot/dispatch/view/pre_checkout_query.py +16 -0
  54. telegrinder/bot/dispatch/view/raw.py +116 -114
  55. telegrinder/bot/dispatch/waiter_machine/__init__.py +17 -17
  56. telegrinder/bot/dispatch/waiter_machine/actions.py +14 -13
  57. telegrinder/bot/dispatch/waiter_machine/hasher/__init__.py +8 -8
  58. telegrinder/bot/dispatch/waiter_machine/hasher/callback.py +55 -55
  59. telegrinder/bot/dispatch/waiter_machine/hasher/hasher.py +59 -57
  60. telegrinder/bot/dispatch/waiter_machine/hasher/message.py +51 -51
  61. telegrinder/bot/dispatch/waiter_machine/hasher/state.py +20 -19
  62. telegrinder/bot/dispatch/waiter_machine/machine.py +251 -172
  63. telegrinder/bot/dispatch/waiter_machine/middleware.py +94 -89
  64. telegrinder/bot/dispatch/waiter_machine/short_state.py +57 -68
  65. telegrinder/bot/polling/__init__.py +4 -4
  66. telegrinder/bot/polling/abc.py +25 -25
  67. telegrinder/bot/polling/polling.py +139 -131
  68. telegrinder/bot/rules/__init__.py +85 -62
  69. telegrinder/bot/rules/abc.py +213 -206
  70. telegrinder/bot/rules/callback_data.py +122 -163
  71. telegrinder/bot/rules/chat_join.py +45 -43
  72. telegrinder/bot/rules/command.py +126 -126
  73. telegrinder/bot/rules/enum_text.py +33 -36
  74. telegrinder/bot/rules/func.py +28 -26
  75. telegrinder/bot/rules/fuzzy.py +24 -24
  76. telegrinder/bot/rules/id.py +24 -0
  77. telegrinder/bot/rules/inline.py +58 -56
  78. telegrinder/bot/rules/integer.py +21 -20
  79. telegrinder/bot/rules/is_from.py +127 -127
  80. telegrinder/bot/rules/logic.py +18 -0
  81. telegrinder/bot/rules/markup.py +42 -43
  82. telegrinder/bot/rules/mention.py +14 -14
  83. telegrinder/bot/rules/message.py +15 -17
  84. telegrinder/bot/rules/message_entities.py +33 -35
  85. telegrinder/bot/rules/node.py +33 -27
  86. telegrinder/bot/rules/payload.py +81 -0
  87. telegrinder/bot/rules/payment_invoice.py +29 -0
  88. telegrinder/bot/rules/regex.py +36 -37
  89. telegrinder/bot/rules/rule_enum.py +72 -72
  90. telegrinder/bot/rules/start.py +42 -42
  91. telegrinder/bot/rules/state.py +35 -37
  92. telegrinder/bot/rules/text.py +38 -33
  93. telegrinder/bot/rules/update.py +15 -15
  94. telegrinder/bot/scenario/__init__.py +5 -5
  95. telegrinder/bot/scenario/abc.py +17 -19
  96. telegrinder/bot/scenario/checkbox.py +174 -176
  97. telegrinder/bot/scenario/choice.py +48 -51
  98. telegrinder/client/__init__.py +12 -4
  99. telegrinder/client/abc.py +100 -75
  100. telegrinder/client/aiohttp.py +134 -130
  101. telegrinder/client/form_data.py +31 -0
  102. telegrinder/client/sonic.py +212 -0
  103. telegrinder/model.py +208 -315
  104. telegrinder/modules.py +239 -237
  105. telegrinder/msgspec_json.py +14 -14
  106. telegrinder/msgspec_utils.py +478 -410
  107. telegrinder/node/__init__.py +86 -25
  108. telegrinder/node/attachment.py +163 -87
  109. telegrinder/node/base.py +288 -160
  110. telegrinder/node/callback_query.py +54 -53
  111. telegrinder/node/command.py +34 -33
  112. telegrinder/node/composer.py +163 -198
  113. telegrinder/node/container.py +33 -27
  114. telegrinder/node/either.py +82 -0
  115. telegrinder/node/event.py +54 -65
  116. telegrinder/node/file.py +51 -0
  117. telegrinder/node/me.py +15 -16
  118. telegrinder/node/payload.py +78 -0
  119. telegrinder/node/polymorphic.py +67 -48
  120. telegrinder/node/rule.py +72 -76
  121. telegrinder/node/scope.py +36 -38
  122. telegrinder/node/source.py +87 -71
  123. telegrinder/node/text.py +53 -41
  124. telegrinder/node/tools/__init__.py +3 -3
  125. telegrinder/node/tools/generator.py +36 -40
  126. telegrinder/py.typed +0 -0
  127. telegrinder/rules.py +1 -62
  128. telegrinder/tools/__init__.py +152 -93
  129. telegrinder/tools/adapter/__init__.py +19 -0
  130. telegrinder/tools/adapter/abc.py +49 -0
  131. telegrinder/tools/adapter/dataclass.py +56 -0
  132. telegrinder/{bot/rules → tools}/adapter/errors.py +5 -5
  133. telegrinder/{bot/rules → tools}/adapter/event.py +63 -65
  134. telegrinder/{bot/rules → tools}/adapter/node.py +46 -48
  135. telegrinder/{bot/rules → tools}/adapter/raw_event.py +27 -27
  136. telegrinder/{bot/rules → tools}/adapter/raw_update.py +30 -30
  137. telegrinder/tools/buttons.py +106 -80
  138. telegrinder/tools/callback_data_serilization/__init__.py +5 -0
  139. telegrinder/tools/callback_data_serilization/abc.py +51 -0
  140. telegrinder/tools/callback_data_serilization/json_ser.py +60 -0
  141. telegrinder/tools/callback_data_serilization/msgpack_ser.py +172 -0
  142. telegrinder/tools/error_handler/__init__.py +7 -7
  143. telegrinder/tools/error_handler/abc.py +30 -33
  144. telegrinder/tools/error_handler/error.py +9 -9
  145. telegrinder/tools/error_handler/error_handler.py +179 -193
  146. telegrinder/tools/formatting/__init__.py +83 -63
  147. telegrinder/tools/formatting/deep_links.py +541 -0
  148. telegrinder/tools/formatting/{html.py → html_formatter.py} +266 -294
  149. telegrinder/tools/formatting/spec_html_formats.py +71 -117
  150. telegrinder/tools/functional.py +8 -12
  151. telegrinder/tools/global_context/__init__.py +7 -7
  152. telegrinder/tools/global_context/abc.py +63 -63
  153. telegrinder/tools/global_context/global_context.py +387 -412
  154. telegrinder/tools/global_context/telegrinder_ctx.py +27 -27
  155. telegrinder/tools/i18n/__init__.py +7 -7
  156. telegrinder/tools/i18n/abc.py +30 -30
  157. telegrinder/tools/i18n/middleware/__init__.py +3 -3
  158. telegrinder/tools/i18n/middleware/abc.py +22 -25
  159. telegrinder/tools/i18n/simple.py +43 -43
  160. telegrinder/tools/input_file_directory.py +30 -0
  161. telegrinder/tools/keyboard.py +128 -128
  162. telegrinder/tools/lifespan.py +105 -0
  163. telegrinder/tools/limited_dict.py +32 -37
  164. telegrinder/tools/loop_wrapper/__init__.py +4 -4
  165. telegrinder/tools/loop_wrapper/abc.py +20 -15
  166. telegrinder/tools/loop_wrapper/loop_wrapper.py +169 -224
  167. telegrinder/tools/magic.py +307 -157
  168. telegrinder/tools/parse_mode.py +6 -6
  169. telegrinder/tools/state_storage/__init__.py +4 -4
  170. telegrinder/tools/state_storage/abc.py +31 -35
  171. telegrinder/tools/state_storage/memory.py +25 -25
  172. telegrinder/tools/strings.py +13 -0
  173. telegrinder/types/__init__.py +268 -260
  174. telegrinder/types/enums.py +711 -701
  175. telegrinder/types/input_file.py +51 -0
  176. telegrinder/types/methods.py +5055 -4633
  177. telegrinder/types/objects.py +7058 -6950
  178. telegrinder/verification_utils.py +30 -32
  179. {telegrinder-0.3.4.dist-info → telegrinder-0.4.0.dist-info}/LICENSE +22 -22
  180. telegrinder-0.4.0.dist-info/METADATA +144 -0
  181. telegrinder-0.4.0.dist-info/RECORD +182 -0
  182. {telegrinder-0.3.4.dist-info → telegrinder-0.4.0.dist-info}/WHEEL +1 -1
  183. telegrinder/bot/rules/adapter/__init__.py +0 -17
  184. telegrinder/bot/rules/adapter/abc.py +0 -31
  185. telegrinder/node/message.py +0 -14
  186. telegrinder/node/update.py +0 -15
  187. telegrinder/tools/formatting/links.py +0 -38
  188. telegrinder/tools/kb_set/__init__.py +0 -4
  189. telegrinder/tools/kb_set/base.py +0 -15
  190. telegrinder/tools/kb_set/yaml.py +0 -63
  191. telegrinder-0.3.4.dist-info/METADATA +0 -110
  192. telegrinder-0.3.4.dist-info/RECORD +0 -165
@@ -1,114 +1,116 @@
1
- import typing
2
-
3
- from telegrinder.api.api import API
4
- from telegrinder.bot.cute_types.update import UpdateCute
5
- from telegrinder.bot.dispatch.handler.func import Func, FuncHandler
6
- from telegrinder.bot.dispatch.process import process_inner
7
- from telegrinder.bot.dispatch.view.abc import ABCEventRawView
8
- from telegrinder.bot.dispatch.view.base import BaseView, ErrorHandlerT
9
- from telegrinder.bot.rules.abc import ABCRule
10
- from telegrinder.tools.error_handler.error_handler import ABCErrorHandler, ErrorHandler
11
- from telegrinder.types.enums import UpdateType
12
- from telegrinder.types.objects import Update
13
-
14
- T = typing.TypeVar("T", contravariant=True)
15
- R = typing.TypeVar("R", covariant=True)
16
- P = typing.ParamSpec("P")
17
-
18
-
19
- class RawEventView(ABCEventRawView[UpdateCute], BaseView[UpdateCute]):
20
- def __init__(self) -> None:
21
- self.auto_rules = []
22
- self.handlers = []
23
- self.middlewares = []
24
- self.return_manager = None
25
-
26
- @typing.overload
27
- def __call__(
28
- self,
29
- update_type: UpdateType,
30
- *rules: ABCRule,
31
- ) -> typing.Callable[
32
- [Func[P, R]],
33
- FuncHandler[UpdateCute, Func[P, R], ErrorHandler[UpdateCute]],
34
- ]: ...
35
-
36
- @typing.overload
37
- def __call__(
38
- self,
39
- update_type: UpdateType,
40
- *rules: ABCRule,
41
- dataclass: type[T],
42
- ) -> typing.Callable[[Func[P, R]], FuncHandler[UpdateCute, Func[P, R], ErrorHandler[T]]]: ...
43
-
44
- @typing.overload
45
- def __call__(
46
- self,
47
- update_type: UpdateType,
48
- *rules: ABCRule,
49
- error_handler: ErrorHandlerT,
50
- ) -> typing.Callable[
51
- [Func[P, R]],
52
- FuncHandler[UpdateCute, Func[P, R], ErrorHandlerT],
53
- ]: ...
54
-
55
- @typing.overload
56
- def __call__(
57
- self,
58
- update_type: UpdateType,
59
- *rules: ABCRule,
60
- dataclass: type[typing.Any],
61
- error_handler: ErrorHandlerT,
62
- is_blocking: bool = True,
63
- ) -> typing.Callable[[Func[P, R]], FuncHandler[UpdateCute, Func[P, R], ErrorHandlerT]]: ...
64
-
65
- @typing.overload
66
- def __call__(
67
- self,
68
- update_type: UpdateType,
69
- *rules: ABCRule,
70
- dataclass: None = None,
71
- error_handler: None = None,
72
- is_blocking: bool = True,
73
- ) -> typing.Callable[
74
- [Func[P, R]],
75
- FuncHandler[UpdateCute, Func[P, R], ErrorHandler[UpdateCute]],
76
- ]: ...
77
-
78
- def __call__( # type: ignore
79
- self,
80
- update_type: UpdateType,
81
- *rules: ABCRule,
82
- dataclass: type[typing.Any] | None = None,
83
- error_handler: ABCErrorHandler | None = None,
84
- is_blocking: bool = True,
85
- ):
86
- def wrapper(func):
87
- func_handler = FuncHandler(
88
- func,
89
- rules=[*self.auto_rules, *rules],
90
- is_blocking=is_blocking,
91
- dataclass=dataclass,
92
- error_handler=error_handler or ErrorHandler(),
93
- update_type=update_type,
94
- )
95
- self.handlers.append(func_handler)
96
- return func_handler
97
-
98
- return wrapper
99
-
100
- async def check(self, event: Update) -> bool:
101
- return bool(self.handlers) or bool(self.middlewares)
102
-
103
- async def process(self, event: Update, api: API) -> bool:
104
- return await process_inner(
105
- api,
106
- UpdateCute.from_update(event, bound_api=api),
107
- event,
108
- self.middlewares,
109
- self.handlers,
110
- self.return_manager,
111
- )
112
-
113
-
114
- __all__ = ("RawEventView",)
1
+ import typing
2
+
3
+ from telegrinder.api.api import API
4
+ from telegrinder.bot.cute_types.base import BaseCute
5
+ from telegrinder.bot.cute_types.update import UpdateCute
6
+ from telegrinder.bot.dispatch.context import Context
7
+ from telegrinder.bot.dispatch.handler.func import Func, FuncHandler
8
+ from telegrinder.bot.dispatch.process import process_inner
9
+ from telegrinder.bot.dispatch.view.abc import ABCEventRawView
10
+ from telegrinder.bot.dispatch.view.base import BaseView
11
+ from telegrinder.bot.rules.abc import ABCRule
12
+ from telegrinder.tools.error_handler.error_handler import ABCErrorHandler, ErrorHandler
13
+ from telegrinder.types.enums import UpdateType
14
+ from telegrinder.types.objects import Update
15
+
16
+
17
+ class RawEventView(ABCEventRawView[UpdateCute], BaseView[UpdateCute]):
18
+ @typing.overload
19
+ def __call__[**P, R](
20
+ self,
21
+ *rules: ABCRule,
22
+ update_type: UpdateType,
23
+ final: bool = True,
24
+ ) -> typing.Callable[
25
+ [Func[P, R]],
26
+ FuncHandler[BaseCute[typing.Any], Func[P, R], ErrorHandler[BaseCute[typing.Any]]],
27
+ ]: ...
28
+
29
+ @typing.overload
30
+ def __call__[**P, Dataclass, R](
31
+ self,
32
+ *rules: ABCRule,
33
+ dataclass: type[Dataclass],
34
+ final: bool = True,
35
+ ) -> typing.Callable[[Func[P, R]], FuncHandler[Dataclass, Func[P, R], ErrorHandler[Dataclass]]]: ...
36
+
37
+ @typing.overload
38
+ def __call__[**P, Dataclass, R](
39
+ self,
40
+ *rules: ABCRule,
41
+ update_type: UpdateType,
42
+ dataclass: type[Dataclass],
43
+ final: bool = True,
44
+ ) -> typing.Callable[[Func[P, R]], FuncHandler[Dataclass, Func[P, R], ErrorHandler[Dataclass]]]: ...
45
+
46
+ @typing.overload
47
+ def __call__[**P, ErrorHandlerT: ABCErrorHandler, R](
48
+ self,
49
+ *rules: ABCRule,
50
+ error_handler: ErrorHandlerT,
51
+ final: bool = True,
52
+ ) -> typing.Callable[
53
+ [Func[P, R]],
54
+ FuncHandler[BaseCute[typing.Any], Func[P, R], ErrorHandlerT],
55
+ ]: ...
56
+
57
+ @typing.overload
58
+ def __call__[**P, ErrorHandlerT: ABCErrorHandler, R](
59
+ self,
60
+ *rules: ABCRule,
61
+ error_handler: ErrorHandlerT,
62
+ update_type: UpdateType,
63
+ final: bool = True,
64
+ ) -> typing.Callable[
65
+ [Func[P, R]],
66
+ FuncHandler[BaseCute[typing.Any], Func[P, R], ErrorHandlerT],
67
+ ]: ...
68
+
69
+ @typing.overload
70
+ def __call__[**P, Dataclass, ErrorHandlerT: ABCErrorHandler, R](
71
+ self,
72
+ *rules: ABCRule,
73
+ update_type: UpdateType,
74
+ dataclass: type[Dataclass],
75
+ error_handler: ErrorHandlerT,
76
+ final: bool = True,
77
+ ) -> typing.Callable[[Func[P, R]], FuncHandler[Dataclass, Func[P, R], ErrorHandlerT]]: ...
78
+
79
+ def __call__(
80
+ self,
81
+ *rules: ABCRule,
82
+ update_type: UpdateType | None = None,
83
+ dataclass: type[typing.Any] | None = None,
84
+ error_handler: ABCErrorHandler | None = None,
85
+ final: bool = True,
86
+ ) -> typing.Callable[..., typing.Any]:
87
+ def wrapper(func: typing.Callable[..., typing.Any]):
88
+ func_handler = FuncHandler(
89
+ func,
90
+ rules=[*self.auto_rules, *rules],
91
+ final=final,
92
+ dataclass=dataclass,
93
+ error_handler=error_handler or ErrorHandler(),
94
+ update_type=update_type,
95
+ )
96
+ self.handlers.append(func_handler)
97
+ return func_handler
98
+
99
+ return wrapper
100
+
101
+ async def check(self, event: Update) -> bool:
102
+ return bool(self.handlers) or bool(self.middlewares)
103
+
104
+ async def process(self, event: Update, api: API, context: Context) -> bool:
105
+ return await process_inner(
106
+ api,
107
+ UpdateCute.from_update(event, bound_api=api),
108
+ event,
109
+ context,
110
+ self.middlewares,
111
+ self.handlers,
112
+ self.return_manager,
113
+ )
114
+
115
+
116
+ __all__ = ("RawEventView",)
@@ -1,18 +1,18 @@
1
- from telegrinder.bot.dispatch.waiter_machine.hasher import (
2
- CALLBACK_QUERY_FOR_MESSAGE,
3
- CALLBACK_QUERY_FROM_CHAT,
4
- CALLBACK_QUERY_IN_CHAT_FOR_MESSAGE,
5
- MESSAGE_FROM_USER,
6
- MESSAGE_FROM_USER_IN_CHAT,
7
- MESSAGE_IN_CHAT,
8
- Hasher,
9
- StateViewHasher,
10
- )
11
- from telegrinder.bot.dispatch.waiter_machine.machine import WaiterMachine, clear_wm_storage_worker
12
- from telegrinder.bot.dispatch.waiter_machine.middleware import WaiterMiddleware
13
- from telegrinder.bot.dispatch.waiter_machine.short_state import ShortState
14
-
15
- __all__ = (
1
+ from telegrinder.bot.dispatch.waiter_machine.hasher import (
2
+ CALLBACK_QUERY_FOR_MESSAGE,
3
+ CALLBACK_QUERY_FROM_CHAT,
4
+ CALLBACK_QUERY_IN_CHAT_FOR_MESSAGE,
5
+ MESSAGE_FROM_USER,
6
+ MESSAGE_FROM_USER_IN_CHAT,
7
+ MESSAGE_IN_CHAT,
8
+ Hasher,
9
+ StateViewHasher,
10
+ )
11
+ from telegrinder.bot.dispatch.waiter_machine.machine import WaiterMachine, clear_wm_storage_worker
12
+ from telegrinder.bot.dispatch.waiter_machine.middleware import WaiterMiddleware
13
+ from telegrinder.bot.dispatch.waiter_machine.short_state import ShortState
14
+
15
+ __all__ = (
16
16
  "CALLBACK_QUERY_FOR_MESSAGE",
17
17
  "CALLBACK_QUERY_FROM_CHAT",
18
18
  "CALLBACK_QUERY_IN_CHAT_FOR_MESSAGE",
@@ -24,5 +24,5 @@ __all__ = (
24
24
  "StateViewHasher",
25
25
  "WaiterMachine",
26
26
  "WaiterMiddleware",
27
- "clear_wm_storage_worker",
28
- )
27
+ "clear_wm_storage_worker",
28
+ )
@@ -1,13 +1,14 @@
1
- import typing
2
-
3
- from telegrinder.bot.dispatch.handler.abc import ABCHandler
4
-
5
- from .short_state import EventModel, ShortState
6
-
7
-
8
- class WaiterActions(typing.TypedDict, typing.Generic[EventModel]):
9
- on_miss: typing.NotRequired[ABCHandler[EventModel]]
10
- on_drop: typing.NotRequired[typing.Callable[[ShortState[EventModel]], None]]
11
-
12
-
13
- __all__ = ("WaiterActions",)
1
+ import typing
2
+
3
+ from telegrinder.bot.cute_types import BaseCute
4
+ from telegrinder.bot.dispatch.handler.abc import ABCHandler
5
+
6
+ from .short_state import ShortState
7
+
8
+
9
+ class WaiterActions[Event: BaseCute](typing.TypedDict):
10
+ on_miss: typing.NotRequired[ABCHandler[Event]]
11
+ on_drop: typing.NotRequired[typing.Callable[[ShortState[Event]], None]]
12
+
13
+
14
+ __all__ = ("WaiterActions",)
@@ -1,9 +1,9 @@
1
- from .callback import CALLBACK_QUERY_FOR_MESSAGE, CALLBACK_QUERY_FROM_CHAT, CALLBACK_QUERY_IN_CHAT_FOR_MESSAGE
2
- from .hasher import Hasher
3
- from .message import MESSAGE_FROM_USER, MESSAGE_FROM_USER_IN_CHAT, MESSAGE_IN_CHAT
4
- from .state import StateViewHasher
5
-
6
- __all__ = (
1
+ from .callback import CALLBACK_QUERY_FOR_MESSAGE, CALLBACK_QUERY_FROM_CHAT, CALLBACK_QUERY_IN_CHAT_FOR_MESSAGE
2
+ from .hasher import Hasher
3
+ from .message import MESSAGE_FROM_USER, MESSAGE_FROM_USER_IN_CHAT, MESSAGE_IN_CHAT
4
+ from .state import StateViewHasher
5
+
6
+ __all__ = (
7
7
  "CALLBACK_QUERY_FOR_MESSAGE",
8
8
  "CALLBACK_QUERY_FROM_CHAT",
9
9
  "CALLBACK_QUERY_IN_CHAT_FOR_MESSAGE",
@@ -11,5 +11,5 @@ __all__ = (
11
11
  "MESSAGE_FROM_USER",
12
12
  "MESSAGE_FROM_USER_IN_CHAT",
13
13
  "MESSAGE_IN_CHAT",
14
- "StateViewHasher",
15
- )
14
+ "StateViewHasher",
15
+ )
@@ -1,57 +1,57 @@
1
- from fntypes.option import Some
2
-
3
- from telegrinder.bot.cute_types import CallbackQueryCute as CallbackQuery
4
- from telegrinder.bot.dispatch.view import CallbackQueryView
5
- from telegrinder.bot.dispatch.waiter_machine.hasher.hasher import Hasher
6
-
7
-
8
- def from_chat_hash(chat_id: int) -> int:
9
- return chat_id
10
-
11
-
12
- def get_chat_from_event(event: CallbackQuery) -> int | None:
13
- return event.chat.and_then(lambda chat: Some(chat.id)).unwrap_or_none()
14
-
15
-
16
- def for_message_hash(message_id: int) -> int:
17
- return message_id
18
-
19
-
20
- def get_message_for_event(event: CallbackQuery) -> int | None:
21
- return event.message_id.unwrap_or_none()
22
-
23
-
24
- def for_message_in_chat(chat_and_message: tuple[int, int]) -> str:
25
- return f"{chat_and_message[0]}_{chat_and_message[1]}"
26
-
27
-
28
- def get_chat_and_message_for_event(event: CallbackQuery) -> tuple[int, int] | None:
29
- if not event.message_id or not event.chat:
30
- return None
31
- return event.chat.unwrap().id, event.message_id.unwrap()
32
-
33
-
34
- CALLBACK_QUERY_FROM_CHAT = Hasher(
35
- view_class=CallbackQueryView,
36
- get_hash_from_data=from_chat_hash,
37
- get_data_from_event=get_chat_from_event,
38
- )
39
-
40
- CALLBACK_QUERY_FOR_MESSAGE = Hasher(
41
- view_class=CallbackQueryView,
42
- get_hash_from_data=for_message_hash,
43
- get_data_from_event=get_message_for_event,
44
- )
45
-
46
- CALLBACK_QUERY_IN_CHAT_FOR_MESSAGE = Hasher(
47
- view_class=CallbackQueryView,
48
- get_hash_from_data=for_message_in_chat,
49
- get_data_from_event=get_chat_and_message_for_event,
50
- )
51
-
52
-
53
- __all__ = (
1
+ from fntypes.option import Some
2
+
3
+ from telegrinder.bot.cute_types import CallbackQueryCute as CallbackQuery
4
+ from telegrinder.bot.dispatch.view import CallbackQueryView
5
+ from telegrinder.bot.dispatch.waiter_machine.hasher.hasher import Hasher
6
+
7
+
8
+ def from_chat_hash(chat_id: int) -> int:
9
+ return chat_id
10
+
11
+
12
+ def get_chat_from_event(event: CallbackQuery) -> int | None:
13
+ return event.chat.and_then(lambda chat: Some(chat.id)).unwrap_or_none()
14
+
15
+
16
+ def for_message_hash(message_id: int) -> int:
17
+ return message_id
18
+
19
+
20
+ def get_message_for_event(event: CallbackQuery) -> int | None:
21
+ return event.message_id.unwrap_or_none()
22
+
23
+
24
+ def for_message_in_chat(chat_and_message: tuple[int, int]) -> str:
25
+ return f"{chat_and_message[0]}_{chat_and_message[1]}"
26
+
27
+
28
+ def get_chat_and_message_for_event(event: CallbackQuery) -> tuple[int, int] | None:
29
+ if not event.message_id or not event.chat:
30
+ return None
31
+ return event.chat.unwrap().id, event.message_id.unwrap()
32
+
33
+
34
+ CALLBACK_QUERY_FROM_CHAT = Hasher(
35
+ view_class=CallbackQueryView,
36
+ get_hash_from_data=from_chat_hash,
37
+ get_data_from_event=get_chat_from_event,
38
+ )
39
+
40
+ CALLBACK_QUERY_FOR_MESSAGE = Hasher(
41
+ view_class=CallbackQueryView,
42
+ get_hash_from_data=for_message_hash,
43
+ get_data_from_event=get_message_for_event,
44
+ )
45
+
46
+ CALLBACK_QUERY_IN_CHAT_FOR_MESSAGE = Hasher(
47
+ view_class=CallbackQueryView,
48
+ get_hash_from_data=for_message_in_chat,
49
+ get_data_from_event=get_chat_and_message_for_event,
50
+ )
51
+
52
+
53
+ __all__ = (
54
54
  "CALLBACK_QUERY_FOR_MESSAGE",
55
55
  "CALLBACK_QUERY_FROM_CHAT",
56
- "CALLBACK_QUERY_IN_CHAT_FOR_MESSAGE",
57
- )
56
+ "CALLBACK_QUERY_IN_CHAT_FOR_MESSAGE",
57
+ )
@@ -1,57 +1,59 @@
1
- import typing
2
- from functools import cached_property
3
-
4
- from fntypes.option import Option
5
-
6
- from telegrinder.bot.cute_types import BaseCute
7
- from telegrinder.bot.dispatch.view.base import BaseView
8
- from telegrinder.tools.functional import from_optional
9
-
10
- T = typing.TypeVar("T")
11
- Event = typing.TypeVar("Event", bound=BaseCute)
12
- Data = typing.TypeVar("Data")
13
-
14
-
15
- def _echo(__x: T) -> T:
16
- return __x
17
-
18
-
19
- ECHO = _echo
20
-
21
-
22
- class Hasher(typing.Generic[Event, Data]):
23
- def __init__(
24
- self,
25
- view_class: type[BaseView[Event]],
26
- get_hash_from_data: typing.Callable[[Data], typing.Hashable | None] | None = None,
27
- get_data_from_event: typing.Callable[[Event], Data | None] | None = None,
28
- ) -> None:
29
- self.view_class = view_class
30
- self._get_hash_from_data = get_hash_from_data
31
- self._get_data_from_event = get_data_from_event
32
-
33
- def __hash__(self) -> int:
34
- return hash(self.name)
35
-
36
- def __repr__(self) -> str:
37
- return f"<Hasher {self.name}>"
38
-
39
- @cached_property
40
- def name(self) -> str:
41
- return f"{self.view_class.__name__}_{id(self)}"
42
-
43
- def get_hash_from_data(self, data: Data) -> Option[typing.Hashable]:
44
- if self._get_hash_from_data is None:
45
- raise NotImplementedError
46
- return from_optional(self._get_hash_from_data(data))
47
-
48
- def get_data_from_event(self, event: Event) -> Option[Data]:
49
- if not self._get_data_from_event:
50
- raise NotImplementedError
51
- return from_optional(self._get_data_from_event(event))
52
-
53
- def get_hash_from_data_from_event(self, event: Event) -> Option[typing.Hashable]:
54
- return self.get_data_from_event(event).and_then(self.get_hash_from_data) # type: ignore
55
-
56
-
57
- __all__ = ("Hasher",)
1
+ import typing
2
+ from functools import cached_property
3
+
4
+ from fntypes.option import Option
5
+
6
+ from telegrinder.bot.cute_types import BaseCute
7
+ from telegrinder.bot.dispatch.view.base import BaseView
8
+ from telegrinder.tools.functional import from_optional
9
+
10
+ Event = typing.TypeVar("Event", bound=BaseCute, covariant=True)
11
+ Data = typing.TypeVar("Data", covariant=True)
12
+
13
+
14
+ def _echo[T](__x: T) -> T:
15
+ return __x
16
+
17
+
18
+ ECHO = _echo
19
+
20
+
21
+ class Hasher(typing.Generic[Event, Data]):
22
+ def __init__(
23
+ self,
24
+ view_class: type[BaseView[Event]],
25
+ get_hash_from_data: typing.Callable[[Data], typing.Hashable | None] | None = None,
26
+ get_data_from_event: typing.Callable[[Event], Data | None] | None = None,
27
+ ) -> None:
28
+ self.view_class = view_class
29
+ self._get_hash_from_data = get_hash_from_data
30
+ self._get_data_from_event = get_data_from_event
31
+
32
+ def __hash__(self) -> int:
33
+ return hash(self.name)
34
+
35
+ def __repr__(self) -> str:
36
+ return f"<Hasher {self.name}>"
37
+
38
+ @cached_property
39
+ def name(self) -> str:
40
+ return f"{self.view_class.__name__}_{id(self)}"
41
+
42
+ def get_hash_from_data[D](self: "Hasher[Event, D]", data: D) -> Option[typing.Hashable]:
43
+ if self._get_hash_from_data is None:
44
+ raise NotImplementedError
45
+ return from_optional(self._get_hash_from_data(data))
46
+
47
+ def get_data_from_event[E: BaseCute](self: "Hasher[E, Data]", event: E) -> Option[Data]:
48
+ if not self._get_data_from_event:
49
+ raise NotImplementedError
50
+ return from_optional(self._get_data_from_event(event))
51
+
52
+ def get_hash_from_data_from_event[E: BaseCute](
53
+ self: "Hasher[E, Data]",
54
+ event: E,
55
+ ) -> Option[typing.Hashable]:
56
+ return self.get_data_from_event(event).and_then(self.get_hash_from_data) # type: ignore
57
+
58
+
59
+ __all__ = ("Hasher",)
@@ -1,53 +1,53 @@
1
- from telegrinder.bot.cute_types import MessageCute as Message
2
- from telegrinder.bot.dispatch.view import MessageView
3
- from telegrinder.bot.dispatch.waiter_machine.hasher.hasher import Hasher
4
-
5
-
6
- def from_chat_hash(chat_id: int) -> int:
7
- return chat_id
8
-
9
-
10
- def get_chat_from_event(event: Message) -> int:
11
- return event.chat.id
12
-
13
-
14
- def from_user_in_chat_hash(chat_and_user: tuple[int, int]) -> str:
15
- return f"{chat_and_user[0]}_{chat_and_user[1]}"
16
-
17
-
18
- def get_user_in_chat_from_event(event: Message) -> tuple[int, int]:
19
- return event.chat.id, event.from_user.id
20
-
21
-
22
- def from_user_hash(from_id: int) -> int:
23
- return from_id
24
-
25
-
26
- def get_user_from_event(event: Message) -> int:
27
- return event.from_user.id
28
-
29
-
30
- MESSAGE_IN_CHAT = Hasher(
31
- view_class=MessageView,
32
- get_hash_from_data=from_chat_hash,
33
- get_data_from_event=get_chat_from_event,
34
- )
35
-
36
- MESSAGE_FROM_USER = Hasher(
37
- view_class=MessageView,
38
- get_hash_from_data=from_user_hash,
39
- get_data_from_event=get_user_from_event,
40
- )
41
-
42
- MESSAGE_FROM_USER_IN_CHAT = Hasher(
43
- view_class=MessageView,
44
- get_hash_from_data=from_user_in_chat_hash,
45
- get_data_from_event=get_user_in_chat_from_event,
46
- )
47
-
48
-
49
- __all__ = (
1
+ from telegrinder.bot.cute_types import MessageCute as Message
2
+ from telegrinder.bot.dispatch.view import MessageView
3
+ from telegrinder.bot.dispatch.waiter_machine.hasher.hasher import Hasher
4
+
5
+
6
+ def from_chat_hash(chat_id: int) -> int:
7
+ return chat_id
8
+
9
+
10
+ def get_chat_from_event(event: Message) -> int:
11
+ return event.chat.id
12
+
13
+
14
+ def from_user_in_chat_hash(chat_and_user: tuple[int, int]) -> str:
15
+ return f"{chat_and_user[0]}_{chat_and_user[1]}"
16
+
17
+
18
+ def get_user_in_chat_from_event(event: Message) -> tuple[int, int]:
19
+ return event.chat.id, event.from_user.id
20
+
21
+
22
+ def from_user_hash(from_id: int) -> int:
23
+ return from_id
24
+
25
+
26
+ def get_user_from_event(event: Message) -> int:
27
+ return event.from_user.id
28
+
29
+
30
+ MESSAGE_IN_CHAT = Hasher(
31
+ view_class=MessageView,
32
+ get_hash_from_data=from_chat_hash,
33
+ get_data_from_event=get_chat_from_event,
34
+ )
35
+
36
+ MESSAGE_FROM_USER = Hasher(
37
+ view_class=MessageView,
38
+ get_hash_from_data=from_user_hash,
39
+ get_data_from_event=get_user_from_event,
40
+ )
41
+
42
+ MESSAGE_FROM_USER_IN_CHAT = Hasher(
43
+ view_class=MessageView,
44
+ get_hash_from_data=from_user_in_chat_hash,
45
+ get_data_from_event=get_user_in_chat_from_event,
46
+ )
47
+
48
+
49
+ __all__ = (
50
50
  "MESSAGE_FROM_USER",
51
51
  "MESSAGE_FROM_USER_IN_CHAT",
52
- "MESSAGE_IN_CHAT",
53
- )
52
+ "MESSAGE_IN_CHAT",
53
+ )