telegrinder 0.3.3.post1__py3-none-any.whl → 0.3.4.post1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of telegrinder might be problematic. Click here for more details.
- telegrinder/__init__.py +144 -144
- telegrinder/api/__init__.py +8 -8
- telegrinder/api/api.py +93 -93
- telegrinder/api/error.py +16 -16
- telegrinder/api/response.py +20 -20
- telegrinder/api/token.py +36 -36
- telegrinder/bot/__init__.py +66 -66
- telegrinder/bot/bot.py +76 -76
- telegrinder/bot/cute_types/__init__.py +17 -17
- telegrinder/bot/cute_types/base.py +258 -258
- telegrinder/bot/cute_types/callback_query.py +385 -385
- telegrinder/bot/cute_types/chat_join_request.py +61 -61
- telegrinder/bot/cute_types/chat_member_updated.py +160 -160
- telegrinder/bot/cute_types/inline_query.py +43 -43
- telegrinder/bot/cute_types/message.py +2637 -2637
- telegrinder/bot/cute_types/update.py +104 -109
- telegrinder/bot/cute_types/utils.py +95 -95
- telegrinder/bot/dispatch/__init__.py +55 -55
- telegrinder/bot/dispatch/abc.py +77 -77
- telegrinder/bot/dispatch/context.py +98 -98
- telegrinder/bot/dispatch/dispatch.py +202 -202
- telegrinder/bot/dispatch/handler/__init__.py +13 -13
- telegrinder/bot/dispatch/handler/abc.py +24 -24
- telegrinder/bot/dispatch/handler/audio_reply.py +44 -44
- telegrinder/bot/dispatch/handler/base.py +57 -57
- telegrinder/bot/dispatch/handler/document_reply.py +44 -44
- telegrinder/bot/dispatch/handler/func.py +135 -135
- telegrinder/bot/dispatch/handler/media_group_reply.py +43 -43
- telegrinder/bot/dispatch/handler/message_reply.py +36 -36
- telegrinder/bot/dispatch/handler/photo_reply.py +44 -44
- telegrinder/bot/dispatch/handler/sticker_reply.py +37 -37
- telegrinder/bot/dispatch/handler/video_reply.py +44 -44
- telegrinder/bot/dispatch/middleware/__init__.py +3 -3
- telegrinder/bot/dispatch/middleware/abc.py +22 -16
- telegrinder/bot/dispatch/process.py +157 -132
- telegrinder/bot/dispatch/return_manager/__init__.py +13 -13
- telegrinder/bot/dispatch/return_manager/abc.py +108 -108
- telegrinder/bot/dispatch/return_manager/callback_query.py +20 -20
- telegrinder/bot/dispatch/return_manager/inline_query.py +15 -15
- telegrinder/bot/dispatch/return_manager/message.py +36 -36
- telegrinder/bot/dispatch/view/__init__.py +13 -13
- telegrinder/bot/dispatch/view/abc.py +41 -41
- telegrinder/bot/dispatch/view/base.py +200 -200
- telegrinder/bot/dispatch/view/box.py +129 -129
- telegrinder/bot/dispatch/view/callback_query.py +17 -17
- telegrinder/bot/dispatch/view/chat_join_request.py +16 -16
- telegrinder/bot/dispatch/view/chat_member.py +39 -39
- telegrinder/bot/dispatch/view/inline_query.py +17 -17
- telegrinder/bot/dispatch/view/message.py +44 -44
- telegrinder/bot/dispatch/view/raw.py +114 -114
- telegrinder/bot/dispatch/waiter_machine/__init__.py +17 -17
- telegrinder/bot/dispatch/waiter_machine/actions.py +13 -13
- telegrinder/bot/dispatch/waiter_machine/hasher/__init__.py +8 -8
- telegrinder/bot/dispatch/waiter_machine/hasher/callback.py +55 -55
- telegrinder/bot/dispatch/waiter_machine/hasher/hasher.py +57 -57
- telegrinder/bot/dispatch/waiter_machine/hasher/message.py +51 -51
- telegrinder/bot/dispatch/waiter_machine/hasher/state.py +19 -19
- telegrinder/bot/dispatch/waiter_machine/machine.py +172 -167
- telegrinder/bot/dispatch/waiter_machine/middleware.py +89 -89
- telegrinder/bot/dispatch/waiter_machine/short_state.py +68 -68
- telegrinder/bot/polling/__init__.py +4 -4
- telegrinder/bot/polling/abc.py +25 -25
- telegrinder/bot/polling/polling.py +131 -131
- telegrinder/bot/rules/__init__.py +62 -62
- telegrinder/bot/rules/abc.py +213 -213
- telegrinder/bot/rules/adapter/__init__.py +12 -9
- telegrinder/bot/rules/adapter/abc.py +31 -29
- telegrinder/bot/rules/adapter/errors.py +5 -5
- telegrinder/bot/rules/adapter/event.py +65 -67
- telegrinder/bot/rules/adapter/node.py +48 -48
- telegrinder/bot/rules/adapter/raw_event.py +27 -0
- telegrinder/bot/rules/adapter/raw_update.py +30 -30
- telegrinder/bot/rules/callback_data.py +170 -170
- telegrinder/bot/rules/chat_join.py +46 -46
- telegrinder/bot/rules/command.py +126 -126
- telegrinder/bot/rules/enum_text.py +36 -36
- telegrinder/bot/rules/func.py +26 -26
- telegrinder/bot/rules/fuzzy.py +24 -24
- telegrinder/bot/rules/inline.py +60 -60
- telegrinder/bot/rules/integer.py +20 -20
- telegrinder/bot/rules/is_from.py +127 -127
- telegrinder/bot/rules/markup.py +43 -43
- telegrinder/bot/rules/mention.py +14 -14
- telegrinder/bot/rules/message.py +17 -17
- telegrinder/bot/rules/message_entities.py +35 -35
- telegrinder/bot/rules/node.py +27 -27
- telegrinder/bot/rules/regex.py +37 -37
- telegrinder/bot/rules/rule_enum.py +72 -72
- telegrinder/bot/rules/start.py +42 -42
- telegrinder/bot/rules/state.py +37 -37
- telegrinder/bot/rules/text.py +33 -33
- telegrinder/bot/rules/update.py +15 -15
- telegrinder/bot/scenario/__init__.py +5 -5
- telegrinder/bot/scenario/abc.py +19 -19
- telegrinder/bot/scenario/checkbox.py +176 -167
- telegrinder/bot/scenario/choice.py +51 -46
- telegrinder/client/__init__.py +4 -4
- telegrinder/client/abc.py +75 -75
- telegrinder/client/aiohttp.py +130 -130
- telegrinder/model.py +320 -295
- telegrinder/modules.py +237 -237
- telegrinder/msgspec_json.py +14 -14
- telegrinder/msgspec_utils.py +410 -410
- telegrinder/node/__init__.py +0 -0
- telegrinder/node/attachment.py +87 -87
- telegrinder/node/base.py +166 -166
- telegrinder/node/callback_query.py +53 -53
- telegrinder/node/command.py +33 -33
- telegrinder/node/composer.py +198 -198
- telegrinder/node/container.py +27 -27
- telegrinder/node/event.py +65 -65
- telegrinder/node/me.py +16 -16
- telegrinder/node/message.py +14 -14
- telegrinder/node/polymorphic.py +48 -48
- telegrinder/node/rule.py +76 -76
- telegrinder/node/scope.py +38 -38
- telegrinder/node/source.py +71 -71
- telegrinder/node/text.py +41 -41
- telegrinder/node/tools/__init__.py +3 -3
- telegrinder/node/tools/generator.py +40 -40
- telegrinder/node/update.py +15 -15
- telegrinder/rules.py +0 -0
- telegrinder/tools/__init__.py +74 -74
- telegrinder/tools/buttons.py +79 -79
- telegrinder/tools/error_handler/__init__.py +7 -7
- telegrinder/tools/error_handler/abc.py +33 -33
- telegrinder/tools/error_handler/error.py +9 -9
- telegrinder/tools/error_handler/error_handler.py +193 -193
- telegrinder/tools/formatting/__init__.py +46 -46
- telegrinder/tools/formatting/html.py +283 -283
- telegrinder/tools/formatting/links.py +33 -33
- telegrinder/tools/formatting/spec_html_formats.py +111 -111
- telegrinder/tools/functional.py +12 -12
- telegrinder/tools/global_context/__init__.py +7 -7
- telegrinder/tools/global_context/abc.py +63 -63
- telegrinder/tools/global_context/global_context.py +412 -412
- telegrinder/tools/global_context/telegrinder_ctx.py +27 -27
- telegrinder/tools/i18n/__init__.py +7 -7
- telegrinder/tools/i18n/abc.py +30 -30
- telegrinder/tools/i18n/middleware/__init__.py +3 -3
- telegrinder/tools/i18n/middleware/abc.py +25 -25
- telegrinder/tools/i18n/simple.py +43 -43
- telegrinder/tools/kb_set/__init__.py +4 -4
- telegrinder/tools/kb_set/base.py +15 -15
- telegrinder/tools/kb_set/yaml.py +63 -63
- telegrinder/tools/keyboard.py +132 -132
- telegrinder/tools/limited_dict.py +37 -37
- telegrinder/tools/loop_wrapper/__init__.py +4 -4
- telegrinder/tools/loop_wrapper/abc.py +15 -15
- telegrinder/tools/loop_wrapper/loop_wrapper.py +224 -224
- telegrinder/tools/magic.py +157 -157
- telegrinder/tools/parse_mode.py +6 -6
- telegrinder/tools/state_storage/__init__.py +4 -4
- telegrinder/tools/state_storage/abc.py +35 -35
- telegrinder/tools/state_storage/memory.py +25 -25
- telegrinder/types/__init__.py +260 -260
- telegrinder/types/enums.py +701 -701
- telegrinder/types/methods.py +4633 -4633
- telegrinder/types/objects.py +6950 -8561
- telegrinder/verification_utils.py +32 -32
- {telegrinder-0.3.3.post1.dist-info → telegrinder-0.3.4.post1.dist-info}/LICENSE +22 -22
- {telegrinder-0.3.3.post1.dist-info → telegrinder-0.3.4.post1.dist-info}/METADATA +1 -1
- telegrinder-0.3.4.post1.dist-info/RECORD +165 -0
- telegrinder-0.3.3.post1.dist-info/RECORD +0 -164
- {telegrinder-0.3.3.post1.dist-info → telegrinder-0.3.4.post1.dist-info}/WHEEL +0 -0
|
@@ -1,72 +1,72 @@
|
|
|
1
|
-
import dataclasses
|
|
2
|
-
import typing
|
|
3
|
-
|
|
4
|
-
from telegrinder.bot.dispatch.context import Context
|
|
5
|
-
|
|
6
|
-
from .abc import ABCRule, Update, check_rule
|
|
7
|
-
from .func import FuncRule
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
@dataclasses.dataclass(slots=True)
|
|
11
|
-
class RuleEnumState:
|
|
12
|
-
name: str
|
|
13
|
-
rule: ABCRule
|
|
14
|
-
cls: type["RuleEnum"]
|
|
15
|
-
|
|
16
|
-
def __eq__(self, other: typing.Self) -> bool:
|
|
17
|
-
return self.cls == other.cls and self.name == other.name
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
class RuleEnum(ABCRule):
|
|
21
|
-
__enum__: list[RuleEnumState]
|
|
22
|
-
|
|
23
|
-
def __init_subclass__(cls, *args: typing.Any, **kwargs: typing.Any) -> None:
|
|
24
|
-
new_attributes = set(cls.__dict__) - set(RuleEnum.__dict__) - {"__enum__", "__init__"}
|
|
25
|
-
enum_lst: list[RuleEnumState] = []
|
|
26
|
-
|
|
27
|
-
self = cls.__new__(cls)
|
|
28
|
-
self.__init__()
|
|
29
|
-
|
|
30
|
-
for attribute_name in new_attributes:
|
|
31
|
-
rules = getattr(cls, attribute_name)
|
|
32
|
-
attribute = RuleEnumState(attribute_name, rules, cls)
|
|
33
|
-
|
|
34
|
-
setattr(
|
|
35
|
-
self,
|
|
36
|
-
attribute.name,
|
|
37
|
-
self & FuncRule(lambda _, ctx: self.must_be_state(ctx, attribute)), # type: ignore
|
|
38
|
-
)
|
|
39
|
-
enum_lst.append(attribute)
|
|
40
|
-
|
|
41
|
-
setattr(cls, "__enum__", enum_lst)
|
|
42
|
-
|
|
43
|
-
@classmethod
|
|
44
|
-
def save_state(cls, ctx: Context, enum: RuleEnumState) -> None:
|
|
45
|
-
ctx.update({cls.__class__.__name__ + "_state": enum})
|
|
46
|
-
|
|
47
|
-
@classmethod
|
|
48
|
-
def check_state(cls, ctx: Context) -> RuleEnumState | None:
|
|
49
|
-
return ctx.get(cls.__class__.__name__ + "_state")
|
|
50
|
-
|
|
51
|
-
@classmethod
|
|
52
|
-
def must_be_state(cls, ctx: Context, state: RuleEnumState) -> bool:
|
|
53
|
-
real_state = cls.check_state(ctx)
|
|
54
|
-
if not real_state:
|
|
55
|
-
return False
|
|
56
|
-
return real_state == state
|
|
57
|
-
|
|
58
|
-
async def check(self, event: Update, ctx: Context) -> bool:
|
|
59
|
-
if self.check_state(ctx):
|
|
60
|
-
return True
|
|
61
|
-
|
|
62
|
-
for enum in self.__enum__:
|
|
63
|
-
ctx_copy = ctx.copy()
|
|
64
|
-
if await check_rule(event.ctx_api, enum.rule, event, ctx_copy):
|
|
65
|
-
ctx.update(ctx_copy)
|
|
66
|
-
self.save_state(ctx, enum)
|
|
67
|
-
return True
|
|
68
|
-
|
|
69
|
-
return False
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
__all__ = ("RuleEnum", "RuleEnumState")
|
|
1
|
+
import dataclasses
|
|
2
|
+
import typing
|
|
3
|
+
|
|
4
|
+
from telegrinder.bot.dispatch.context import Context
|
|
5
|
+
|
|
6
|
+
from .abc import ABCRule, Update, check_rule
|
|
7
|
+
from .func import FuncRule
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
@dataclasses.dataclass(slots=True)
|
|
11
|
+
class RuleEnumState:
|
|
12
|
+
name: str
|
|
13
|
+
rule: ABCRule
|
|
14
|
+
cls: type["RuleEnum"]
|
|
15
|
+
|
|
16
|
+
def __eq__(self, other: typing.Self) -> bool:
|
|
17
|
+
return self.cls == other.cls and self.name == other.name
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class RuleEnum(ABCRule):
|
|
21
|
+
__enum__: list[RuleEnumState]
|
|
22
|
+
|
|
23
|
+
def __init_subclass__(cls, *args: typing.Any, **kwargs: typing.Any) -> None:
|
|
24
|
+
new_attributes = set(cls.__dict__) - set(RuleEnum.__dict__) - {"__enum__", "__init__"}
|
|
25
|
+
enum_lst: list[RuleEnumState] = []
|
|
26
|
+
|
|
27
|
+
self = cls.__new__(cls)
|
|
28
|
+
self.__init__()
|
|
29
|
+
|
|
30
|
+
for attribute_name in new_attributes:
|
|
31
|
+
rules = getattr(cls, attribute_name)
|
|
32
|
+
attribute = RuleEnumState(attribute_name, rules, cls)
|
|
33
|
+
|
|
34
|
+
setattr(
|
|
35
|
+
self,
|
|
36
|
+
attribute.name,
|
|
37
|
+
self & FuncRule(lambda _, ctx: self.must_be_state(ctx, attribute)), # type: ignore
|
|
38
|
+
)
|
|
39
|
+
enum_lst.append(attribute)
|
|
40
|
+
|
|
41
|
+
setattr(cls, "__enum__", enum_lst)
|
|
42
|
+
|
|
43
|
+
@classmethod
|
|
44
|
+
def save_state(cls, ctx: Context, enum: RuleEnumState) -> None:
|
|
45
|
+
ctx.update({cls.__class__.__name__ + "_state": enum})
|
|
46
|
+
|
|
47
|
+
@classmethod
|
|
48
|
+
def check_state(cls, ctx: Context) -> RuleEnumState | None:
|
|
49
|
+
return ctx.get(cls.__class__.__name__ + "_state")
|
|
50
|
+
|
|
51
|
+
@classmethod
|
|
52
|
+
def must_be_state(cls, ctx: Context, state: RuleEnumState) -> bool:
|
|
53
|
+
real_state = cls.check_state(ctx)
|
|
54
|
+
if not real_state:
|
|
55
|
+
return False
|
|
56
|
+
return real_state == state
|
|
57
|
+
|
|
58
|
+
async def check(self, event: Update, ctx: Context) -> bool:
|
|
59
|
+
if self.check_state(ctx):
|
|
60
|
+
return True
|
|
61
|
+
|
|
62
|
+
for enum in self.__enum__:
|
|
63
|
+
ctx_copy = ctx.copy()
|
|
64
|
+
if await check_rule(event.ctx_api, enum.rule, event, ctx_copy):
|
|
65
|
+
ctx.update(ctx_copy)
|
|
66
|
+
self.save_state(ctx, enum)
|
|
67
|
+
return True
|
|
68
|
+
|
|
69
|
+
return False
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
__all__ = ("RuleEnum", "RuleEnumState")
|
telegrinder/bot/rules/start.py
CHANGED
|
@@ -1,42 +1,42 @@
|
|
|
1
|
-
import typing
|
|
2
|
-
|
|
3
|
-
from telegrinder.bot.dispatch.context import Context
|
|
4
|
-
from telegrinder.types.enums import MessageEntityType
|
|
5
|
-
|
|
6
|
-
from .is_from import IsPrivate
|
|
7
|
-
from .markup import Markup
|
|
8
|
-
from .message import MessageRule
|
|
9
|
-
from .message_entities import MessageEntities
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
class StartCommand(
|
|
13
|
-
MessageRule,
|
|
14
|
-
requires=[
|
|
15
|
-
IsPrivate(),
|
|
16
|
-
MessageEntities(MessageEntityType.BOT_COMMAND),
|
|
17
|
-
Markup(["/start <param>", "/start"]),
|
|
18
|
-
],
|
|
19
|
-
):
|
|
20
|
-
def __init__(
|
|
21
|
-
self,
|
|
22
|
-
validator: typing.Callable[[str], typing.Any | None] | None = None,
|
|
23
|
-
*,
|
|
24
|
-
param_required: bool = False,
|
|
25
|
-
alias: str | None = None,
|
|
26
|
-
) -> None:
|
|
27
|
-
self.param_required = param_required
|
|
28
|
-
self.validator = validator
|
|
29
|
-
self.alias = alias
|
|
30
|
-
|
|
31
|
-
def check(self, ctx: Context) -> bool:
|
|
32
|
-
param: str | None = ctx.pop("param", None)
|
|
33
|
-
validated_param = self.validator(param) if self.validator and param is not None else param
|
|
34
|
-
|
|
35
|
-
if self.param_required and validated_param is None:
|
|
36
|
-
return False
|
|
37
|
-
|
|
38
|
-
ctx.set(self.alias or "param", validated_param)
|
|
39
|
-
return True
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
__all__ = ("StartCommand",)
|
|
1
|
+
import typing
|
|
2
|
+
|
|
3
|
+
from telegrinder.bot.dispatch.context import Context
|
|
4
|
+
from telegrinder.types.enums import MessageEntityType
|
|
5
|
+
|
|
6
|
+
from .is_from import IsPrivate
|
|
7
|
+
from .markup import Markup
|
|
8
|
+
from .message import MessageRule
|
|
9
|
+
from .message_entities import MessageEntities
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class StartCommand(
|
|
13
|
+
MessageRule,
|
|
14
|
+
requires=[
|
|
15
|
+
IsPrivate(),
|
|
16
|
+
MessageEntities(MessageEntityType.BOT_COMMAND),
|
|
17
|
+
Markup(["/start <param>", "/start"]),
|
|
18
|
+
],
|
|
19
|
+
):
|
|
20
|
+
def __init__(
|
|
21
|
+
self,
|
|
22
|
+
validator: typing.Callable[[str], typing.Any | None] | None = None,
|
|
23
|
+
*,
|
|
24
|
+
param_required: bool = False,
|
|
25
|
+
alias: str | None = None,
|
|
26
|
+
) -> None:
|
|
27
|
+
self.param_required = param_required
|
|
28
|
+
self.validator = validator
|
|
29
|
+
self.alias = alias
|
|
30
|
+
|
|
31
|
+
def check(self, ctx: Context) -> bool:
|
|
32
|
+
param: str | None = ctx.pop("param", None)
|
|
33
|
+
validated_param = self.validator(param) if self.validator and param is not None else param
|
|
34
|
+
|
|
35
|
+
if self.param_required and validated_param is None:
|
|
36
|
+
return False
|
|
37
|
+
|
|
38
|
+
ctx.set(self.alias or "param", validated_param)
|
|
39
|
+
return True
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
__all__ = ("StartCommand",)
|
telegrinder/bot/rules/state.py
CHANGED
|
@@ -1,37 +1,37 @@
|
|
|
1
|
-
import dataclasses
|
|
2
|
-
import enum
|
|
3
|
-
import typing
|
|
4
|
-
|
|
5
|
-
from telegrinder.bot.dispatch.context import Context
|
|
6
|
-
from telegrinder.bot.rules.abc import ABCRule
|
|
7
|
-
from telegrinder.node.source import Source
|
|
8
|
-
|
|
9
|
-
if typing.TYPE_CHECKING:
|
|
10
|
-
from telegrinder.tools.state_storage.abc import ABCStateStorage
|
|
11
|
-
|
|
12
|
-
Payload = typing.TypeVar("Payload")
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
class StateMeta(enum.Enum):
|
|
16
|
-
NO_STATE = enum.auto()
|
|
17
|
-
ANY = enum.auto()
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
@dataclasses.dataclass(frozen=True, slots=True, repr=False)
|
|
21
|
-
class State(ABCRule, typing.Generic[Payload]):
|
|
22
|
-
storage: "ABCStateStorage[Payload]"
|
|
23
|
-
key: str | StateMeta | enum.Enum
|
|
24
|
-
|
|
25
|
-
async def check(self, source: Source, ctx: Context) -> bool:
|
|
26
|
-
state = await self.storage.get(source.from_user.id)
|
|
27
|
-
if not state:
|
|
28
|
-
return self.key == StateMeta.NO_STATE
|
|
29
|
-
|
|
30
|
-
if self.key != StateMeta.ANY and self.key != state.unwrap().key:
|
|
31
|
-
return False
|
|
32
|
-
|
|
33
|
-
ctx["state"] = state.unwrap()
|
|
34
|
-
return True
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
__all__ = ("State", "StateMeta")
|
|
1
|
+
import dataclasses
|
|
2
|
+
import enum
|
|
3
|
+
import typing
|
|
4
|
+
|
|
5
|
+
from telegrinder.bot.dispatch.context import Context
|
|
6
|
+
from telegrinder.bot.rules.abc import ABCRule
|
|
7
|
+
from telegrinder.node.source import Source
|
|
8
|
+
|
|
9
|
+
if typing.TYPE_CHECKING:
|
|
10
|
+
from telegrinder.tools.state_storage.abc import ABCStateStorage
|
|
11
|
+
|
|
12
|
+
Payload = typing.TypeVar("Payload")
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class StateMeta(enum.Enum):
|
|
16
|
+
NO_STATE = enum.auto()
|
|
17
|
+
ANY = enum.auto()
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
@dataclasses.dataclass(frozen=True, slots=True, repr=False)
|
|
21
|
+
class State(ABCRule, typing.Generic[Payload]):
|
|
22
|
+
storage: "ABCStateStorage[Payload]"
|
|
23
|
+
key: str | StateMeta | enum.Enum
|
|
24
|
+
|
|
25
|
+
async def check(self, source: Source, ctx: Context) -> bool:
|
|
26
|
+
state = await self.storage.get(source.from_user.id)
|
|
27
|
+
if not state:
|
|
28
|
+
return self.key == StateMeta.NO_STATE
|
|
29
|
+
|
|
30
|
+
if self.key != StateMeta.ANY and self.key != state.unwrap().key:
|
|
31
|
+
return False
|
|
32
|
+
|
|
33
|
+
ctx["state"] = state.unwrap()
|
|
34
|
+
return True
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
__all__ = ("State", "StateMeta")
|
telegrinder/bot/rules/text.py
CHANGED
|
@@ -1,33 +1,33 @@
|
|
|
1
|
-
import typing
|
|
2
|
-
|
|
3
|
-
from telegrinder import node
|
|
4
|
-
from telegrinder.tools.i18n.abc import ABCTranslator
|
|
5
|
-
|
|
6
|
-
from .abc import ABCRule, with_caching_translations
|
|
7
|
-
from .node import NodeRule
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
class HasText(NodeRule):
|
|
11
|
-
def __init__(self) -> None:
|
|
12
|
-
super().__init__(node.text.Text)
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
class Text(ABCRule):
|
|
16
|
-
def __init__(self, texts: str | list[str], *, ignore_case: bool = False) -> None:
|
|
17
|
-
if not isinstance(texts, list):
|
|
18
|
-
texts = [texts]
|
|
19
|
-
self.texts = texts if not ignore_case else list(map(str.lower, texts))
|
|
20
|
-
self.ignore_case = ignore_case
|
|
21
|
-
|
|
22
|
-
def check(self, text: node.text.Text) -> bool:
|
|
23
|
-
return (text if not self.ignore_case else text.lower()) in self.texts
|
|
24
|
-
|
|
25
|
-
@with_caching_translations
|
|
26
|
-
async def translate(self, translator: ABCTranslator) -> typing.Self:
|
|
27
|
-
return self.__class__(
|
|
28
|
-
texts=[translator.get(text) for text in self.texts],
|
|
29
|
-
ignore_case=self.ignore_case,
|
|
30
|
-
)
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
__all__ = ("HasText", "Text")
|
|
1
|
+
import typing
|
|
2
|
+
|
|
3
|
+
from telegrinder import node
|
|
4
|
+
from telegrinder.tools.i18n.abc import ABCTranslator
|
|
5
|
+
|
|
6
|
+
from .abc import ABCRule, with_caching_translations
|
|
7
|
+
from .node import NodeRule
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class HasText(NodeRule):
|
|
11
|
+
def __init__(self) -> None:
|
|
12
|
+
super().__init__(node.text.Text)
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class Text(ABCRule):
|
|
16
|
+
def __init__(self, texts: str | list[str], *, ignore_case: bool = False) -> None:
|
|
17
|
+
if not isinstance(texts, list):
|
|
18
|
+
texts = [texts]
|
|
19
|
+
self.texts = texts if not ignore_case else list(map(str.lower, texts))
|
|
20
|
+
self.ignore_case = ignore_case
|
|
21
|
+
|
|
22
|
+
def check(self, text: node.text.Text) -> bool:
|
|
23
|
+
return (text if not self.ignore_case else text.lower()) in self.texts
|
|
24
|
+
|
|
25
|
+
@with_caching_translations
|
|
26
|
+
async def translate(self, translator: ABCTranslator) -> typing.Self:
|
|
27
|
+
return self.__class__(
|
|
28
|
+
texts=[translator.get(text) for text in self.texts],
|
|
29
|
+
ignore_case=self.ignore_case,
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
__all__ = ("HasText", "Text")
|
telegrinder/bot/rules/update.py
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
from telegrinder.bot.cute_types.update import UpdateCute
|
|
2
|
-
from telegrinder.types.enums import UpdateType
|
|
3
|
-
|
|
4
|
-
from .abc import ABCRule
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
class IsUpdateType(ABCRule):
|
|
8
|
-
def __init__(self, update_type: UpdateType, /) -> None:
|
|
9
|
-
self.update_type = update_type
|
|
10
|
-
|
|
11
|
-
def check(self, event: UpdateCute) -> bool:
|
|
12
|
-
return event.update_type == self.update_type
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
__all__ = ("IsUpdateType",)
|
|
1
|
+
from telegrinder.bot.cute_types.update import UpdateCute
|
|
2
|
+
from telegrinder.types.enums import UpdateType
|
|
3
|
+
|
|
4
|
+
from .abc import ABCRule
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class IsUpdateType(ABCRule):
|
|
8
|
+
def __init__(self, update_type: UpdateType, /) -> None:
|
|
9
|
+
self.update_type = update_type
|
|
10
|
+
|
|
11
|
+
def check(self, event: UpdateCute) -> bool:
|
|
12
|
+
return event.update_type == self.update_type
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
__all__ = ("IsUpdateType",)
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
from .abc import ABCScenario
|
|
2
|
-
from .checkbox import Checkbox
|
|
3
|
-
from .choice import Choice
|
|
4
|
-
|
|
5
|
-
__all__ = ("ABCScenario", "Checkbox", "Choice")
|
|
1
|
+
from .abc import ABCScenario
|
|
2
|
+
from .checkbox import Checkbox
|
|
3
|
+
from .choice import Choice
|
|
4
|
+
|
|
5
|
+
__all__ = ("ABCScenario", "Checkbox", "Choice")
|
telegrinder/bot/scenario/abc.py
CHANGED
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
import typing
|
|
2
|
-
from abc import ABC, abstractmethod
|
|
3
|
-
|
|
4
|
-
from telegrinder.bot.cute_types.base import BaseCute
|
|
5
|
-
|
|
6
|
-
if typing.TYPE_CHECKING:
|
|
7
|
-
from telegrinder.api import API
|
|
8
|
-
from telegrinder.bot.dispatch.view.abc import ABCStateView
|
|
9
|
-
|
|
10
|
-
EventT = typing.TypeVar("EventT", bound=BaseCute)
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
class ABCScenario(ABC, typing.Generic[EventT]):
|
|
14
|
-
@abstractmethod
|
|
15
|
-
def wait(self, api: "API", view: "ABCStateView[EventT]") -> typing.Any:
|
|
16
|
-
pass
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
__all__ = ("ABCScenario",)
|
|
1
|
+
import typing
|
|
2
|
+
from abc import ABC, abstractmethod
|
|
3
|
+
|
|
4
|
+
from telegrinder.bot.cute_types.base import BaseCute
|
|
5
|
+
|
|
6
|
+
if typing.TYPE_CHECKING:
|
|
7
|
+
from telegrinder.api import API
|
|
8
|
+
from telegrinder.bot.dispatch.view.abc import ABCStateView
|
|
9
|
+
|
|
10
|
+
EventT = typing.TypeVar("EventT", bound=BaseCute)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class ABCScenario(ABC, typing.Generic[EventT]):
|
|
14
|
+
@abstractmethod
|
|
15
|
+
def wait(self, api: "API", view: "ABCStateView[EventT]") -> typing.Any:
|
|
16
|
+
pass
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
__all__ = ("ABCScenario",)
|