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,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,57 @@
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
+ 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,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
+ )
@@ -1,19 +1,19 @@
1
- from fntypes.option import Option
2
-
3
- from telegrinder.bot.dispatch.view import BaseStateView
4
- from telegrinder.bot.dispatch.waiter_machine.hasher.hasher import ECHO, Event, Hasher
5
- from telegrinder.tools.functional import from_optional
6
-
7
-
8
- class StateViewHasher(Hasher[Event, int]):
9
- view: BaseStateView[Event]
10
-
11
- def __init__(self, view: BaseStateView[Event]) -> None:
12
- self.view = view
13
- super().__init__(view.__class__, get_hash_from_data=ECHO)
14
-
15
- def get_data_from_event(self, event: Event) -> Option[int]:
16
- return from_optional(self.view.get_state_key(event))
17
-
18
-
19
- __all__ = ("StateViewHasher",)
1
+ from fntypes.option import Option
2
+
3
+ from telegrinder.bot.dispatch.view import BaseStateView
4
+ from telegrinder.bot.dispatch.waiter_machine.hasher.hasher import ECHO, Event, Hasher
5
+ from telegrinder.tools.functional import from_optional
6
+
7
+
8
+ class StateViewHasher(Hasher[Event, int]):
9
+ view: BaseStateView[Event]
10
+
11
+ def __init__(self, view: BaseStateView[Event]) -> None:
12
+ self.view = view
13
+ super().__init__(view.__class__, get_hash_from_data=ECHO)
14
+
15
+ def get_data_from_event(self, event: Event) -> Option[int]:
16
+ return from_optional(self.view.get_state_key(event))
17
+
18
+
19
+ __all__ = ("StateViewHasher",)