telegrinder 0.3.0.post2__py3-none-any.whl → 0.3.2__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 (164) 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 +11 -11
  10. telegrinder/bot/cute_types/base.py +258 -234
  11. telegrinder/bot/cute_types/callback_query.py +382 -382
  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 +53 -53
  15. telegrinder/bot/cute_types/message.py +2631 -2631
  16. telegrinder/bot/cute_types/update.py +75 -75
  17. telegrinder/bot/cute_types/utils.py +92 -92
  18. telegrinder/bot/dispatch/__init__.py +55 -55
  19. telegrinder/bot/dispatch/abc.py +77 -77
  20. telegrinder/bot/dispatch/context.py +92 -92
  21. telegrinder/bot/dispatch/dispatch.py +202 -201
  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 +128 -123
  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 +16 -16
  35. telegrinder/bot/dispatch/process.py +132 -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 -211
  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 -118
  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 +57 -57
  55. telegrinder/bot/dispatch/waiter_machine/hasher/hasher.py +57 -57
  56. telegrinder/bot/dispatch/waiter_machine/hasher/message.py +53 -53
  57. telegrinder/bot/dispatch/waiter_machine/hasher/state.py +19 -19
  58. telegrinder/bot/dispatch/waiter_machine/machine.py +168 -170
  59. telegrinder/bot/dispatch/waiter_machine/middleware.py +89 -89
  60. telegrinder/bot/dispatch/waiter_machine/short_state.py +65 -65
  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 +238 -233
  66. telegrinder/bot/rules/adapter/__init__.py +9 -9
  67. telegrinder/bot/rules/adapter/abc.py +29 -29
  68. telegrinder/bot/rules/adapter/errors.py +5 -5
  69. telegrinder/bot/rules/adapter/event.py +76 -76
  70. telegrinder/bot/rules/adapter/node.py +48 -48
  71. telegrinder/bot/rules/adapter/raw_update.py +30 -30
  72. telegrinder/bot/rules/callback_data.py +171 -171
  73. telegrinder/bot/rules/chat_join.py +48 -48
  74. telegrinder/bot/rules/command.py +126 -126
  75. telegrinder/bot/rules/enum_text.py +36 -33
  76. telegrinder/bot/rules/func.py +26 -26
  77. telegrinder/bot/rules/fuzzy.py +24 -24
  78. telegrinder/bot/rules/inline.py +60 -60
  79. telegrinder/bot/rules/integer.py +20 -20
  80. telegrinder/bot/rules/is_from.py +146 -146
  81. telegrinder/bot/rules/markup.py +43 -43
  82. telegrinder/bot/rules/mention.py +14 -14
  83. telegrinder/bot/rules/message.py +17 -17
  84. telegrinder/bot/rules/message_entities.py +35 -35
  85. telegrinder/bot/rules/node.py +27 -27
  86. telegrinder/bot/rules/regex.py +37 -37
  87. telegrinder/bot/rules/rule_enum.py +72 -72
  88. telegrinder/bot/rules/start.py +42 -42
  89. telegrinder/bot/rules/state.py +37 -37
  90. telegrinder/bot/rules/text.py +33 -33
  91. telegrinder/bot/rules/update.py +15 -15
  92. telegrinder/bot/scenario/__init__.py +5 -5
  93. telegrinder/bot/scenario/abc.py +19 -19
  94. telegrinder/bot/scenario/checkbox.py +167 -139
  95. telegrinder/bot/scenario/choice.py +46 -44
  96. telegrinder/client/__init__.py +4 -4
  97. telegrinder/client/abc.py +75 -75
  98. telegrinder/client/aiohttp.py +130 -130
  99. telegrinder/model.py +244 -244
  100. telegrinder/modules.py +237 -237
  101. telegrinder/msgspec_json.py +14 -14
  102. telegrinder/msgspec_utils.py +410 -410
  103. telegrinder/node/__init__.py +20 -20
  104. telegrinder/node/attachment.py +92 -92
  105. telegrinder/node/base.py +143 -144
  106. telegrinder/node/callback_query.py +14 -14
  107. telegrinder/node/command.py +33 -33
  108. telegrinder/node/composer.py +196 -184
  109. telegrinder/node/container.py +27 -27
  110. telegrinder/node/event.py +71 -73
  111. telegrinder/node/me.py +16 -16
  112. telegrinder/node/message.py +14 -14
  113. telegrinder/node/polymorphic.py +48 -52
  114. telegrinder/node/rule.py +76 -76
  115. telegrinder/node/scope.py +38 -38
  116. telegrinder/node/source.py +71 -71
  117. telegrinder/node/text.py +21 -21
  118. telegrinder/node/tools/__init__.py +3 -3
  119. telegrinder/node/tools/generator.py +40 -40
  120. telegrinder/node/update.py +15 -15
  121. telegrinder/rules.py +0 -0
  122. telegrinder/tools/__init__.py +74 -74
  123. telegrinder/tools/buttons.py +79 -79
  124. telegrinder/tools/error_handler/__init__.py +7 -7
  125. telegrinder/tools/error_handler/abc.py +33 -33
  126. telegrinder/tools/error_handler/error.py +9 -9
  127. telegrinder/tools/error_handler/error_handler.py +193 -193
  128. telegrinder/tools/formatting/__init__.py +46 -46
  129. telegrinder/tools/formatting/html.py +308 -308
  130. telegrinder/tools/formatting/links.py +33 -33
  131. telegrinder/tools/formatting/spec_html_formats.py +111 -111
  132. telegrinder/tools/functional.py +12 -12
  133. telegrinder/tools/global_context/__init__.py +7 -7
  134. telegrinder/tools/global_context/abc.py +63 -63
  135. telegrinder/tools/global_context/global_context.py +412 -412
  136. telegrinder/tools/global_context/telegrinder_ctx.py +27 -27
  137. telegrinder/tools/i18n/__init__.py +12 -12
  138. telegrinder/tools/i18n/abc.py +32 -32
  139. telegrinder/tools/i18n/middleware/__init__.py +3 -3
  140. telegrinder/tools/i18n/middleware/abc.py +25 -25
  141. telegrinder/tools/i18n/simple.py +43 -43
  142. telegrinder/tools/kb_set/__init__.py +4 -4
  143. telegrinder/tools/kb_set/base.py +15 -15
  144. telegrinder/tools/kb_set/yaml.py +63 -63
  145. telegrinder/tools/keyboard.py +128 -128
  146. telegrinder/tools/limited_dict.py +37 -37
  147. telegrinder/tools/loop_wrapper/__init__.py +4 -4
  148. telegrinder/tools/loop_wrapper/abc.py +15 -15
  149. telegrinder/tools/loop_wrapper/loop_wrapper.py +216 -216
  150. telegrinder/tools/magic.py +168 -164
  151. telegrinder/tools/parse_mode.py +6 -6
  152. telegrinder/tools/state_storage/__init__.py +4 -4
  153. telegrinder/tools/state_storage/abc.py +35 -35
  154. telegrinder/tools/state_storage/memory.py +25 -25
  155. telegrinder/types/__init__.py +6 -6
  156. telegrinder/types/enums.py +672 -672
  157. telegrinder/types/methods.py +4633 -4633
  158. telegrinder/types/objects.py +6317 -6317
  159. telegrinder/verification_utils.py +32 -32
  160. {telegrinder-0.3.0.post2.dist-info → telegrinder-0.3.2.dist-info}/LICENSE +22 -22
  161. {telegrinder-0.3.0.post2.dist-info → telegrinder-0.3.2.dist-info}/METADATA +1 -1
  162. telegrinder-0.3.2.dist-info/RECORD +164 -0
  163. telegrinder-0.3.0.post2.dist-info/RECORD +0 -164
  164. {telegrinder-0.3.0.post2.dist-info → telegrinder-0.3.2.dist-info}/WHEEL +0 -0
@@ -1,164 +1,168 @@
1
- import enum
2
- import inspect
3
- import types
4
- import typing
5
- from functools import wraps
6
-
7
- if typing.TYPE_CHECKING:
8
- from telegrinder.bot.rules.abc import ABCRule
9
- from telegrinder.node.polymorphic import Polymorphic
10
-
11
- T = typing.TypeVar("T", bound=ABCRule)
12
- F = typing.TypeVar(
13
- "F",
14
- bound=typing.Callable[typing.Concatenate[typing.Callable[..., typing.Any], ...], typing.Any],
15
- )
16
-
17
- Impl: typing.TypeAlias = type[classmethod]
18
- FuncType: typing.TypeAlias = types.FunctionType | typing.Callable[..., typing.Any]
19
-
20
- TRANSLATIONS_KEY: typing.Final[str] = "_translations"
21
- IMPL_MARK: typing.Final[str] = "_is_impl"
22
-
23
-
24
- def cache_magic_value(mark_key: str, /):
25
- def inner(func: "F") -> "F":
26
- @wraps(func)
27
- def wrapper(*args: typing.Any, **kwargs: typing.Any) -> typing.Any:
28
- if mark_key not in args[0].__dict__:
29
- args[0].__dict__[mark_key] = func(*args, **kwargs)
30
- return args[0].__dict__[mark_key]
31
-
32
- return wrapper # type: ignore
33
-
34
- return inner
35
-
36
-
37
- def resolve_arg_names(func: FuncType, start_idx: int = 1) -> tuple[str, ...]:
38
- return func.__code__.co_varnames[start_idx : func.__code__.co_argcount]
39
-
40
-
41
- @cache_magic_value("__default_args__")
42
- def get_default_args(func: FuncType) -> dict[str, typing.Any]:
43
- fspec = inspect.getfullargspec(func)
44
- if not fspec.defaults:
45
- return {}
46
- return dict(zip(fspec.args[-len(fspec.defaults) :], fspec.defaults))
47
-
48
-
49
- def get_annotations(func: FuncType, *, return_type: bool = False) -> dict[str, typing.Any]:
50
- annotations = func.__annotations__
51
- if not return_type and "return" in func.__annotations__:
52
- annotations.pop("return")
53
- return annotations
54
-
55
-
56
- def to_str(s: str | enum.Enum) -> str:
57
- if isinstance(s, enum.Enum):
58
- return str(s.value)
59
- return s
60
-
61
-
62
- @typing.overload
63
- def magic_bundle(handler: FuncType, kw: dict[str, typing.Any]) -> dict[str, typing.Any]: ...
64
-
65
-
66
- @typing.overload
67
- def magic_bundle(handler: FuncType, kw: dict[enum.Enum, typing.Any]) -> dict[str, typing.Any]: ...
68
-
69
-
70
- @typing.overload
71
- def magic_bundle(
72
- handler: FuncType,
73
- kw: dict[str, typing.Any],
74
- *,
75
- start_idx: int = 1,
76
- bundle_ctx: bool = True,
77
- ) -> dict[str, typing.Any]: ...
78
-
79
-
80
- @typing.overload
81
- def magic_bundle(
82
- handler: FuncType,
83
- kw: dict[enum.Enum, typing.Any],
84
- *,
85
- start_idx: int = 1,
86
- bundle_ctx: bool = True,
87
- ) -> dict[str, typing.Any]: ...
88
-
89
-
90
- @typing.overload
91
- def magic_bundle(
92
- handler: FuncType,
93
- kw: dict[type, typing.Any],
94
- *,
95
- typebundle: typing.Literal[True] = True,
96
- ) -> dict[str, typing.Any]: ...
97
-
98
-
99
- def magic_bundle(
100
- handler: FuncType,
101
- kw: dict[typing.Any, typing.Any],
102
- *,
103
- start_idx: int = 1,
104
- bundle_ctx: bool = True,
105
- typebundle: bool = False,
106
- ) -> dict[str, typing.Any]:
107
- if typebundle:
108
- types = get_annotations(handler, return_type=False)
109
- bundle: dict[str, typing.Any] = {}
110
- for name, type in types.items():
111
- bundle[name] = kw[type]
112
- return bundle
113
-
114
- names = resolve_arg_names(handler, start_idx=start_idx)
115
- args = get_default_args(handler)
116
- args.update({to_str(k): v for k, v in kw.items() if to_str(k) in names})
117
- if "ctx" in names and bundle_ctx:
118
- args["ctx"] = kw
119
- return args
120
-
121
-
122
- def get_cached_translation(rule: "T", locale: str) -> "T | None":
123
- return getattr(rule, TRANSLATIONS_KEY, {}).get(locale)
124
-
125
-
126
- def cache_translation(base_rule: "T", locale: str, translated_rule: "T") -> None:
127
- translations = getattr(base_rule, TRANSLATIONS_KEY, {})
128
- translations[locale] = translated_rule
129
- setattr(base_rule, TRANSLATIONS_KEY, translations)
130
-
131
-
132
- @typing.cast(typing.Callable[..., Impl], lambda f: f)
133
- def impl(method: typing.Callable[..., typing.Any]):
134
- setattr(method, IMPL_MARK, True)
135
- return classmethod(method)
136
-
137
-
138
- def get_impls(cls: type["Polymorphic"]) -> list[typing.Callable[..., typing.Any]]:
139
- moprh_impls = getattr(cls, "__morph_impls__", None)
140
- if moprh_impls is not None:
141
- return moprh_impls
142
- impls = [
143
- func.__func__
144
- for func in vars(cls).values()
145
- if isinstance(func, classmethod) and getattr(func.__func__, IMPL_MARK, False)
146
- ]
147
- setattr(cls, "__morph_impls__", impls)
148
- return impls
149
-
150
-
151
- __all__ = (
152
- "TRANSLATIONS_KEY",
153
- "cache_magic_value",
154
- "cache_translation",
155
- "get_annotations",
156
- "get_cached_translation",
157
- "get_default_args",
158
- "get_default_args",
159
- "get_impls",
160
- "impl",
161
- "magic_bundle",
162
- "resolve_arg_names",
163
- "to_str",
164
- )
1
+ import enum
2
+ import types
3
+ import typing
4
+ from functools import wraps
5
+
6
+ if typing.TYPE_CHECKING:
7
+ from telegrinder.bot.rules.abc import ABCRule
8
+ from telegrinder.node.polymorphic import Polymorphic
9
+
10
+ T = typing.TypeVar("T", bound=ABCRule)
11
+ F = typing.TypeVar(
12
+ "F",
13
+ bound=typing.Callable[typing.Concatenate[typing.Callable[..., typing.Any], ...], typing.Any],
14
+ )
15
+
16
+ Impl: typing.TypeAlias = type[classmethod]
17
+ FuncType: typing.TypeAlias = types.FunctionType | typing.Callable[..., typing.Any]
18
+
19
+ TRANSLATIONS_KEY: typing.Final[str] = "_translations"
20
+ IMPL_MARK: typing.Final[str] = "_is_impl"
21
+
22
+
23
+ def cache_magic_value(mark_key: str, /):
24
+ def inner(func: "F") -> "F":
25
+ @wraps(func)
26
+ def wrapper(*args: typing.Any, **kwargs: typing.Any) -> typing.Any:
27
+ if mark_key not in args[0].__dict__:
28
+ args[0].__dict__[mark_key] = func(*args, **kwargs)
29
+ return args[0].__dict__[mark_key]
30
+
31
+ return wrapper # type: ignore
32
+
33
+ return inner
34
+
35
+
36
+ def resolve_arg_names(func: FuncType, start_idx: int = 1) -> tuple[str, ...]:
37
+ return func.__code__.co_varnames[start_idx : func.__code__.co_argcount]
38
+
39
+
40
+ @cache_magic_value("__default_args__")
41
+ def get_default_args(func: FuncType) -> dict[str, typing.Any]:
42
+ kwdefaults = func.__kwdefaults__
43
+ if kwdefaults:
44
+ return kwdefaults
45
+
46
+ defaults = func.__defaults__
47
+ if not defaults:
48
+ return {}
49
+
50
+ return {k: defaults[i] for i, k in enumerate(resolve_arg_names(func, start_idx=0)[-len(defaults) :])}
51
+
52
+
53
+ def get_annotations(func: FuncType, *, return_type: bool = False) -> dict[str, typing.Any]:
54
+ annotations = func.__annotations__
55
+ if not return_type and "return" in func.__annotations__:
56
+ annotations.pop("return")
57
+ return annotations
58
+
59
+
60
+ def to_str(s: str | enum.Enum) -> str:
61
+ if isinstance(s, enum.Enum):
62
+ return str(s.value)
63
+ return s
64
+
65
+
66
+ @typing.overload
67
+ def magic_bundle(handler: FuncType, kw: dict[str, typing.Any]) -> dict[str, typing.Any]: ...
68
+
69
+
70
+ @typing.overload
71
+ def magic_bundle(handler: FuncType, kw: dict[enum.Enum, typing.Any]) -> dict[str, typing.Any]: ...
72
+
73
+
74
+ @typing.overload
75
+ def magic_bundle(
76
+ handler: FuncType,
77
+ kw: dict[str, typing.Any],
78
+ *,
79
+ start_idx: int = 1,
80
+ bundle_ctx: bool = True,
81
+ ) -> dict[str, typing.Any]: ...
82
+
83
+
84
+ @typing.overload
85
+ def magic_bundle(
86
+ handler: FuncType,
87
+ kw: dict[enum.Enum, typing.Any],
88
+ *,
89
+ start_idx: int = 1,
90
+ bundle_ctx: bool = True,
91
+ ) -> dict[str, typing.Any]: ...
92
+
93
+
94
+ @typing.overload
95
+ def magic_bundle(
96
+ handler: FuncType,
97
+ kw: dict[type, typing.Any],
98
+ *,
99
+ typebundle: typing.Literal[True] = True,
100
+ ) -> dict[str, typing.Any]: ...
101
+
102
+
103
+ def magic_bundle(
104
+ handler: FuncType,
105
+ kw: dict[typing.Any, typing.Any],
106
+ *,
107
+ start_idx: int = 1,
108
+ bundle_ctx: bool = True,
109
+ typebundle: bool = False,
110
+ ) -> dict[str, typing.Any]:
111
+ if typebundle:
112
+ types = get_annotations(handler, return_type=False)
113
+ bundle: dict[str, typing.Any] = {}
114
+ for name, type in types.items():
115
+ bundle[name] = kw[type]
116
+ return bundle
117
+
118
+ names = resolve_arg_names(handler, start_idx=start_idx)
119
+ args = get_default_args(handler)
120
+ args.update({to_str(k): v for k, v in kw.items() if to_str(k) in names})
121
+ if "ctx" in names and bundle_ctx:
122
+ args["ctx"] = kw
123
+ return args
124
+
125
+
126
+ def get_cached_translation(rule: "T", locale: str) -> "T | None":
127
+ return getattr(rule, TRANSLATIONS_KEY, {}).get(locale)
128
+
129
+
130
+ def cache_translation(base_rule: "T", locale: str, translated_rule: "T") -> None:
131
+ translations = getattr(base_rule, TRANSLATIONS_KEY, {})
132
+ translations[locale] = translated_rule
133
+ setattr(base_rule, TRANSLATIONS_KEY, translations)
134
+
135
+
136
+ @typing.cast(typing.Callable[..., Impl], lambda f: f)
137
+ def impl(method: typing.Callable[..., typing.Any]):
138
+ setattr(method, IMPL_MARK, True)
139
+ return classmethod(method)
140
+
141
+
142
+ def get_impls(cls: type["Polymorphic"]) -> list[typing.Callable[..., typing.Any]]:
143
+ moprh_impls = getattr(cls, "__morph_impls__", None)
144
+ if moprh_impls is not None:
145
+ return moprh_impls
146
+ impls = [
147
+ func.__func__
148
+ for func in vars(cls).values()
149
+ if isinstance(func, classmethod) and getattr(func.__func__, IMPL_MARK, False)
150
+ ]
151
+ setattr(cls, "__morph_impls__", impls)
152
+ return impls
153
+
154
+
155
+ __all__ = (
156
+ "TRANSLATIONS_KEY",
157
+ "cache_magic_value",
158
+ "cache_translation",
159
+ "get_annotations",
160
+ "get_cached_translation",
161
+ "get_default_args",
162
+ "get_default_args",
163
+ "get_impls",
164
+ "impl",
165
+ "magic_bundle",
166
+ "resolve_arg_names",
167
+ "to_str",
168
+ )
@@ -1,6 +1,6 @@
1
- class ParseMode:
2
- MARKDOWNV2 = "MarkdownV2"
3
- HTML = "HTML"
4
-
5
-
6
- __all__ = ("ParseMode",)
1
+ class ParseMode:
2
+ MARKDOWNV2 = "MarkdownV2"
3
+ HTML = "HTML"
4
+
5
+
6
+ __all__ = ("ParseMode",)
@@ -1,4 +1,4 @@
1
- from telegrinder.tools.state_storage.abc import ABCStateStorage, StateData
2
- from telegrinder.tools.state_storage.memory import MemoryStateStorage
3
-
4
- __all__ = ("ABCStateStorage", "MemoryStateStorage", "StateData")
1
+ from telegrinder.tools.state_storage.abc import ABCStateStorage, StateData
2
+ from telegrinder.tools.state_storage.memory import MemoryStateStorage
3
+
4
+ __all__ = ("ABCStateStorage", "MemoryStateStorage", "StateData")
@@ -1,35 +1,35 @@
1
- import abc
2
- import enum
3
- import typing
4
- from dataclasses import dataclass
5
-
6
- from fntypes import Option
7
-
8
- from telegrinder.bot.rules.state import State, StateMeta
9
-
10
- Payload = typing.TypeVar("Payload")
11
-
12
-
13
- @dataclass(frozen=True, slots=True)
14
- class StateData(typing.Generic[Payload]):
15
- key: str | enum.Enum
16
- payload: Payload
17
-
18
-
19
- class ABCStateStorage(abc.ABC, typing.Generic[Payload]):
20
- @abc.abstractmethod
21
- async def get(self, user_id: int) -> Option[StateData[Payload]]: ...
22
-
23
- @abc.abstractmethod
24
- async def delete(self, user_id: int) -> None: ...
25
-
26
- @abc.abstractmethod
27
- async def set(self, user_id: int, key: str | enum.Enum, payload: Payload) -> None: ...
28
-
29
- def State(self, key: str | StateMeta | enum.Enum = StateMeta.ANY, /) -> State[Payload]: # noqa: N802
30
- """Can be used as a shortcut to get a state rule dependant on current storage."""
31
-
32
- return State(storage=self, key=key)
33
-
34
-
35
- __all__ = ("ABCStateStorage", "StateData")
1
+ import abc
2
+ import enum
3
+ import typing
4
+ from dataclasses import dataclass
5
+
6
+ from fntypes import Option
7
+
8
+ from telegrinder.bot.rules.state import State, StateMeta
9
+
10
+ Payload = typing.TypeVar("Payload")
11
+
12
+
13
+ @dataclass(frozen=True, slots=True)
14
+ class StateData(typing.Generic[Payload]):
15
+ key: str | enum.Enum
16
+ payload: Payload
17
+
18
+
19
+ class ABCStateStorage(abc.ABC, typing.Generic[Payload]):
20
+ @abc.abstractmethod
21
+ async def get(self, user_id: int) -> Option[StateData[Payload]]: ...
22
+
23
+ @abc.abstractmethod
24
+ async def delete(self, user_id: int) -> None: ...
25
+
26
+ @abc.abstractmethod
27
+ async def set(self, user_id: int, key: str | enum.Enum, payload: Payload) -> None: ...
28
+
29
+ def State(self, key: str | StateMeta | enum.Enum = StateMeta.ANY, /) -> State[Payload]: # noqa: N802
30
+ """Can be used as a shortcut to get a state rule dependant on current storage."""
31
+
32
+ return State(storage=self, key=key)
33
+
34
+
35
+ __all__ = ("ABCStateStorage", "StateData")
@@ -1,25 +1,25 @@
1
- import typing
2
-
3
- from fntypes.option import Option
4
-
5
- from telegrinder.tools.functional import from_optional
6
- from telegrinder.tools.state_storage.abc import ABCStateStorage, StateData
7
-
8
- Payload: typing.TypeAlias = dict[str, typing.Any]
9
-
10
-
11
- class MemoryStateStorage(ABCStateStorage[Payload]):
12
- def __init__(self) -> None:
13
- self.storage: dict[int, StateData[Payload]] = {}
14
-
15
- async def get(self, user_id: int) -> Option[StateData[Payload]]:
16
- return from_optional(self.storage.get(user_id))
17
-
18
- async def set(self, user_id: int, key: str, payload: Payload) -> None:
19
- self.storage[user_id] = StateData(key, payload)
20
-
21
- async def delete(self, user_id: int) -> None:
22
- self.storage.pop(user_id)
23
-
24
-
25
- __all__ = ("MemoryStateStorage",)
1
+ import typing
2
+
3
+ from fntypes.option import Option
4
+
5
+ from telegrinder.tools.functional import from_optional
6
+ from telegrinder.tools.state_storage.abc import ABCStateStorage, StateData
7
+
8
+ Payload: typing.TypeAlias = dict[str, typing.Any]
9
+
10
+
11
+ class MemoryStateStorage(ABCStateStorage[Payload]):
12
+ def __init__(self) -> None:
13
+ self.storage: dict[int, StateData[Payload]] = {}
14
+
15
+ async def get(self, user_id: int) -> Option[StateData[Payload]]:
16
+ return from_optional(self.storage.get(user_id))
17
+
18
+ async def set(self, user_id: int, key: str, payload: Payload) -> None:
19
+ self.storage[user_id] = StateData(key, payload)
20
+
21
+ async def delete(self, user_id: int) -> None:
22
+ self.storage.pop(user_id)
23
+
24
+
25
+ __all__ = ("MemoryStateStorage",)
@@ -1,7 +1,7 @@
1
- from telegrinder.types.enums import *
2
- from telegrinder.types.objects import *
3
-
4
- __all__ = (
1
+ from telegrinder.types.enums import *
2
+ from telegrinder.types.objects import *
3
+
4
+ __all__ = (
5
5
  "Animation",
6
6
  "Audio",
7
7
  "BackgroundFill",
@@ -256,5 +256,5 @@ __all__ = (
256
256
  "WebAppData",
257
257
  "WebAppInfo",
258
258
  "WebhookInfo",
259
- "WriteAccessAllowed",
260
- )
259
+ "WriteAccessAllowed",
260
+ )