telegrinder 0.3.1__py3-none-any.whl → 0.3.3__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 -234
- telegrinder/bot/cute_types/callback_query.py +385 -382
- 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 -53
- telegrinder/bot/cute_types/message.py +2637 -2631
- telegrinder/bot/cute_types/update.py +109 -75
- 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 -92
- telegrinder/bot/dispatch/dispatch.py +202 -201
- 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 -123
- 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 +16 -16
- telegrinder/bot/dispatch/process.py +132 -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 -211
- 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 -118
- 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 +167 -170
- telegrinder/bot/dispatch/waiter_machine/middleware.py +89 -89
- telegrinder/bot/dispatch/waiter_machine/short_state.py +68 -65
- 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 -238
- telegrinder/bot/rules/adapter/__init__.py +9 -9
- telegrinder/bot/rules/adapter/abc.py +29 -29
- telegrinder/bot/rules/adapter/errors.py +5 -5
- telegrinder/bot/rules/adapter/event.py +67 -76
- telegrinder/bot/rules/adapter/node.py +48 -48
- telegrinder/bot/rules/adapter/raw_update.py +30 -30
- telegrinder/bot/rules/callback_data.py +170 -171
- telegrinder/bot/rules/chat_join.py +46 -48
- 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 +167 -147
- telegrinder/bot/scenario/choice.py +46 -44
- telegrinder/client/__init__.py +4 -4
- telegrinder/client/abc.py +75 -75
- telegrinder/client/aiohttp.py +130 -130
- telegrinder/model.py +295 -244
- telegrinder/modules.py +237 -237
- telegrinder/msgspec_json.py +14 -14
- telegrinder/msgspec_utils.py +410 -410
- telegrinder/node/__init__.py +7 -3
- telegrinder/node/attachment.py +87 -87
- telegrinder/node/base.py +166 -144
- telegrinder/node/callback_query.py +53 -14
- telegrinder/node/command.py +33 -33
- telegrinder/node/composer.py +198 -184
- telegrinder/node/container.py +27 -27
- telegrinder/node/event.py +65 -73
- telegrinder/node/me.py +16 -16
- telegrinder/node/message.py +14 -14
- telegrinder/node/polymorphic.py +48 -52
- telegrinder/node/rule.py +76 -76
- telegrinder/node/scope.py +38 -38
- telegrinder/node/source.py +71 -71
- telegrinder/node/text.py +41 -21
- 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 -216
- 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 +8561 -6541
- telegrinder/verification_utils.py +32 -32
- {telegrinder-0.3.1.dist-info → telegrinder-0.3.3.dist-info}/LICENSE +22 -22
- {telegrinder-0.3.1.dist-info → telegrinder-0.3.3.dist-info}/METADATA +1 -1
- telegrinder-0.3.3.dist-info/RECORD +164 -0
- telegrinder-0.3.1.dist-info/RECORD +0 -164
- {telegrinder-0.3.1.dist-info → telegrinder-0.3.3.dist-info}/WHEEL +0 -0
telegrinder/bot/rules/integer.py
CHANGED
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
from telegrinder.node.text import TextInteger
|
|
2
|
-
|
|
3
|
-
from .abc import ABCRule
|
|
4
|
-
from .node import NodeRule
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
class IsInteger(NodeRule):
|
|
8
|
-
def __init__(self) -> None:
|
|
9
|
-
super().__init__(TextInteger)
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
class IntegerInRange(ABCRule):
|
|
13
|
-
def __init__(self, rng: range) -> None:
|
|
14
|
-
self.rng = rng
|
|
15
|
-
|
|
16
|
-
def check(self, integer: TextInteger) -> bool:
|
|
17
|
-
return integer in self.rng
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
__all__ = ("IntegerInRange", "IsInteger")
|
|
1
|
+
from telegrinder.node.text import TextInteger
|
|
2
|
+
|
|
3
|
+
from .abc import ABCRule
|
|
4
|
+
from .node import NodeRule
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class IsInteger(NodeRule):
|
|
8
|
+
def __init__(self) -> None:
|
|
9
|
+
super().__init__(TextInteger)
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class IntegerInRange(ABCRule):
|
|
13
|
+
def __init__(self, rng: range) -> None:
|
|
14
|
+
self.rng = rng
|
|
15
|
+
|
|
16
|
+
def check(self, integer: TextInteger) -> bool:
|
|
17
|
+
return integer in self.rng
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
__all__ = ("IntegerInRange", "IsInteger")
|
telegrinder/bot/rules/is_from.py
CHANGED
|
@@ -1,128 +1,128 @@
|
|
|
1
|
-
import typing
|
|
2
|
-
|
|
3
|
-
from telegrinder.node.source import ChatSource, UserSource
|
|
4
|
-
from telegrinder.types.enums import ChatType, DiceEmoji
|
|
5
|
-
|
|
6
|
-
from .abc import ABCRule, Message
|
|
7
|
-
from .message import MessageRule
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
class IsBot(ABCRule):
|
|
11
|
-
def check(self, user: UserSource) -> bool:
|
|
12
|
-
return user.is_bot
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
class IsUser(ABCRule):
|
|
16
|
-
def check(self, user: UserSource) -> bool:
|
|
17
|
-
return not user.is_bot
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
class IsPremium(ABCRule):
|
|
21
|
-
def check(self, user: UserSource) -> bool:
|
|
22
|
-
return user.is_premium.unwrap_or(False)
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
class IsLanguageCode(ABCRule):
|
|
26
|
-
def __init__(self, lang_codes: str | list[str], /) -> None:
|
|
27
|
-
self.lang_codes = [lang_codes] if isinstance(lang_codes, str) else lang_codes
|
|
28
|
-
|
|
29
|
-
def check(self, user: UserSource) -> bool:
|
|
30
|
-
return user.language_code.unwrap_or_none() in self.lang_codes
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
class IsUserId(ABCRule):
|
|
34
|
-
def __init__(self, user_ids: int | list[int], /) -> None:
|
|
35
|
-
self.user_ids = [user_ids] if isinstance(user_ids, int) else user_ids
|
|
36
|
-
|
|
37
|
-
def check(self, user: UserSource) -> bool:
|
|
38
|
-
return user.id in self.user_ids
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
class IsForum(ABCRule):
|
|
42
|
-
def check(self, chat: ChatSource) -> bool:
|
|
43
|
-
return chat.is_forum.unwrap_or(False)
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
class IsChatId(ABCRule):
|
|
47
|
-
def __init__(self, chat_ids: int | list[int], /) -> None:
|
|
48
|
-
self.chat_ids = [chat_ids] if isinstance(chat_ids, int) else chat_ids
|
|
49
|
-
|
|
50
|
-
def check(self, chat: ChatSource) -> bool:
|
|
51
|
-
return chat.id in self.chat_ids
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
class IsPrivate(ABCRule):
|
|
55
|
-
def check(self, chat: ChatSource) -> bool:
|
|
56
|
-
return chat.type == ChatType.PRIVATE
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
class IsGroup(ABCRule):
|
|
60
|
-
def check(self, chat: ChatSource) -> bool:
|
|
61
|
-
return chat.type == ChatType.GROUP
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
class IsSuperGroup(ABCRule):
|
|
65
|
-
def check(self, chat: ChatSource) -> bool:
|
|
66
|
-
return chat.type == ChatType.SUPERGROUP
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
class IsChat(ABCRule):
|
|
70
|
-
def check(self, chat: ChatSource) -> bool:
|
|
71
|
-
return chat.type in (ChatType.GROUP, ChatType.SUPERGROUP)
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
class IsDice(MessageRule):
|
|
75
|
-
def check(self, message: Message) -> bool:
|
|
76
|
-
return bool(message.dice)
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
class IsDiceEmoji(MessageRule, requires=[IsDice()]):
|
|
80
|
-
def __init__(self, dice_emoji: DiceEmoji, /) -> None:
|
|
81
|
-
self.dice_emoji = dice_emoji
|
|
82
|
-
|
|
83
|
-
def check(self, message: Message) -> bool:
|
|
84
|
-
return message.dice.unwrap().emoji == self.dice_emoji
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
class IsForward(MessageRule):
|
|
88
|
-
def check(self, message: Message) -> bool:
|
|
89
|
-
return bool(message.forward_origin)
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
class IsForwardType(MessageRule, requires=[IsForward()]):
|
|
93
|
-
def __init__(self, fwd_type: typing.Literal["user", "hidden_user", "chat", "channel"], /) -> None:
|
|
94
|
-
self.fwd_type = fwd_type
|
|
95
|
-
|
|
96
|
-
def check(self, message: Message) -> bool:
|
|
97
|
-
return message.forward_origin.unwrap().v.type == self.fwd_type
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
class IsReply(MessageRule):
|
|
101
|
-
def check(self, message: Message) -> bool:
|
|
102
|
-
return bool(message.reply_to_message)
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
class IsSticker(MessageRule):
|
|
106
|
-
def check(self, message: Message) -> bool:
|
|
107
|
-
return bool(message.sticker)
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
class IsVideoNote(MessageRule):
|
|
111
|
-
def check(self, message: Message) -> bool:
|
|
112
|
-
return bool(message.video_note)
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
class IsDocument(MessageRule):
|
|
116
|
-
def check(self, message: Message) -> bool:
|
|
117
|
-
return bool(message.document)
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
class IsPhoto(MessageRule):
|
|
121
|
-
def check(self, message: Message) -> bool:
|
|
122
|
-
return bool(message.photo)
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
__all__ = (
|
|
1
|
+
import typing
|
|
2
|
+
|
|
3
|
+
from telegrinder.node.source import ChatSource, UserSource
|
|
4
|
+
from telegrinder.types.enums import ChatType, DiceEmoji
|
|
5
|
+
|
|
6
|
+
from .abc import ABCRule, Message
|
|
7
|
+
from .message import MessageRule
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class IsBot(ABCRule):
|
|
11
|
+
def check(self, user: UserSource) -> bool:
|
|
12
|
+
return user.is_bot
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class IsUser(ABCRule):
|
|
16
|
+
def check(self, user: UserSource) -> bool:
|
|
17
|
+
return not user.is_bot
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class IsPremium(ABCRule):
|
|
21
|
+
def check(self, user: UserSource) -> bool:
|
|
22
|
+
return user.is_premium.unwrap_or(False)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class IsLanguageCode(ABCRule):
|
|
26
|
+
def __init__(self, lang_codes: str | list[str], /) -> None:
|
|
27
|
+
self.lang_codes = [lang_codes] if isinstance(lang_codes, str) else lang_codes
|
|
28
|
+
|
|
29
|
+
def check(self, user: UserSource) -> bool:
|
|
30
|
+
return user.language_code.unwrap_or_none() in self.lang_codes
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class IsUserId(ABCRule):
|
|
34
|
+
def __init__(self, user_ids: int | list[int], /) -> None:
|
|
35
|
+
self.user_ids = [user_ids] if isinstance(user_ids, int) else user_ids
|
|
36
|
+
|
|
37
|
+
def check(self, user: UserSource) -> bool:
|
|
38
|
+
return user.id in self.user_ids
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
class IsForum(ABCRule):
|
|
42
|
+
def check(self, chat: ChatSource) -> bool:
|
|
43
|
+
return chat.is_forum.unwrap_or(False)
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
class IsChatId(ABCRule):
|
|
47
|
+
def __init__(self, chat_ids: int | list[int], /) -> None:
|
|
48
|
+
self.chat_ids = [chat_ids] if isinstance(chat_ids, int) else chat_ids
|
|
49
|
+
|
|
50
|
+
def check(self, chat: ChatSource) -> bool:
|
|
51
|
+
return chat.id in self.chat_ids
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
class IsPrivate(ABCRule):
|
|
55
|
+
def check(self, chat: ChatSource) -> bool:
|
|
56
|
+
return chat.type == ChatType.PRIVATE
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
class IsGroup(ABCRule):
|
|
60
|
+
def check(self, chat: ChatSource) -> bool:
|
|
61
|
+
return chat.type == ChatType.GROUP
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
class IsSuperGroup(ABCRule):
|
|
65
|
+
def check(self, chat: ChatSource) -> bool:
|
|
66
|
+
return chat.type == ChatType.SUPERGROUP
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
class IsChat(ABCRule):
|
|
70
|
+
def check(self, chat: ChatSource) -> bool:
|
|
71
|
+
return chat.type in (ChatType.GROUP, ChatType.SUPERGROUP)
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
class IsDice(MessageRule):
|
|
75
|
+
def check(self, message: Message) -> bool:
|
|
76
|
+
return bool(message.dice)
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
class IsDiceEmoji(MessageRule, requires=[IsDice()]):
|
|
80
|
+
def __init__(self, dice_emoji: DiceEmoji, /) -> None:
|
|
81
|
+
self.dice_emoji = dice_emoji
|
|
82
|
+
|
|
83
|
+
def check(self, message: Message) -> bool:
|
|
84
|
+
return message.dice.unwrap().emoji == self.dice_emoji
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
class IsForward(MessageRule):
|
|
88
|
+
def check(self, message: Message) -> bool:
|
|
89
|
+
return bool(message.forward_origin)
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
class IsForwardType(MessageRule, requires=[IsForward()]):
|
|
93
|
+
def __init__(self, fwd_type: typing.Literal["user", "hidden_user", "chat", "channel"], /) -> None:
|
|
94
|
+
self.fwd_type = fwd_type
|
|
95
|
+
|
|
96
|
+
def check(self, message: Message) -> bool:
|
|
97
|
+
return message.forward_origin.unwrap().v.type == self.fwd_type
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
class IsReply(MessageRule):
|
|
101
|
+
def check(self, message: Message) -> bool:
|
|
102
|
+
return bool(message.reply_to_message)
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
class IsSticker(MessageRule):
|
|
106
|
+
def check(self, message: Message) -> bool:
|
|
107
|
+
return bool(message.sticker)
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
class IsVideoNote(MessageRule):
|
|
111
|
+
def check(self, message: Message) -> bool:
|
|
112
|
+
return bool(message.video_note)
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
class IsDocument(MessageRule):
|
|
116
|
+
def check(self, message: Message) -> bool:
|
|
117
|
+
return bool(message.document)
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
class IsPhoto(MessageRule):
|
|
121
|
+
def check(self, message: Message) -> bool:
|
|
122
|
+
return bool(message.photo)
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
__all__ = (
|
|
126
126
|
"IsBot",
|
|
127
127
|
"IsChat",
|
|
128
128
|
"IsChatId",
|
|
@@ -142,5 +142,5 @@ __all__ = (
|
|
|
142
142
|
"IsSuperGroup",
|
|
143
143
|
"IsUser",
|
|
144
144
|
"IsUserId",
|
|
145
|
-
"IsVideoNote",
|
|
146
|
-
)
|
|
145
|
+
"IsVideoNote",
|
|
146
|
+
)
|
telegrinder/bot/rules/markup.py
CHANGED
|
@@ -1,43 +1,43 @@
|
|
|
1
|
-
import typing
|
|
2
|
-
|
|
3
|
-
import vbml
|
|
4
|
-
|
|
5
|
-
from telegrinder.bot.dispatch.context import Context
|
|
6
|
-
from telegrinder.node.text import Text
|
|
7
|
-
from telegrinder.tools.global_context.telegrinder_ctx import TelegrinderContext
|
|
8
|
-
|
|
9
|
-
from .abc import ABCRule
|
|
10
|
-
|
|
11
|
-
PatternLike: typing.TypeAlias = str | vbml.Pattern
|
|
12
|
-
global_ctx: typing.Final[TelegrinderContext] = TelegrinderContext()
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
def check_string(patterns: list[vbml.Pattern], s: str, ctx: Context) -> bool:
|
|
16
|
-
for pattern in patterns:
|
|
17
|
-
match global_ctx.vbml_patcher.check(pattern, s):
|
|
18
|
-
case None | False:
|
|
19
|
-
continue
|
|
20
|
-
case {**response}:
|
|
21
|
-
ctx |= response
|
|
22
|
-
return True
|
|
23
|
-
return False
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
class Markup(ABCRule):
|
|
27
|
-
"""Markup Language. See the [vbml documentation](https://github.com/tesseradecade/vbml/blob/master/docs/index.md)."""
|
|
28
|
-
|
|
29
|
-
def __init__(self, patterns: PatternLike | list[PatternLike], /) -> None:
|
|
30
|
-
if not isinstance(patterns, list):
|
|
31
|
-
patterns = [patterns]
|
|
32
|
-
self.patterns = [
|
|
33
|
-
vbml.Pattern(pattern, flags=global_ctx.vbml_pattern_flags)
|
|
34
|
-
if isinstance(pattern, str)
|
|
35
|
-
else pattern
|
|
36
|
-
for pattern in patterns
|
|
37
|
-
]
|
|
38
|
-
|
|
39
|
-
def check(self, text: Text, ctx: Context) -> bool:
|
|
40
|
-
return check_string(self.patterns, text, ctx)
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
__all__ = ("Markup", "check_string")
|
|
1
|
+
import typing
|
|
2
|
+
|
|
3
|
+
import vbml
|
|
4
|
+
|
|
5
|
+
from telegrinder.bot.dispatch.context import Context
|
|
6
|
+
from telegrinder.node.text import Text
|
|
7
|
+
from telegrinder.tools.global_context.telegrinder_ctx import TelegrinderContext
|
|
8
|
+
|
|
9
|
+
from .abc import ABCRule
|
|
10
|
+
|
|
11
|
+
PatternLike: typing.TypeAlias = str | vbml.Pattern
|
|
12
|
+
global_ctx: typing.Final[TelegrinderContext] = TelegrinderContext()
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def check_string(patterns: list[vbml.Pattern], s: str, ctx: Context) -> bool:
|
|
16
|
+
for pattern in patterns:
|
|
17
|
+
match global_ctx.vbml_patcher.check(pattern, s):
|
|
18
|
+
case None | False:
|
|
19
|
+
continue
|
|
20
|
+
case {**response}:
|
|
21
|
+
ctx |= response
|
|
22
|
+
return True
|
|
23
|
+
return False
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class Markup(ABCRule):
|
|
27
|
+
"""Markup Language. See the [vbml documentation](https://github.com/tesseradecade/vbml/blob/master/docs/index.md)."""
|
|
28
|
+
|
|
29
|
+
def __init__(self, patterns: PatternLike | list[PatternLike], /) -> None:
|
|
30
|
+
if not isinstance(patterns, list):
|
|
31
|
+
patterns = [patterns]
|
|
32
|
+
self.patterns = [
|
|
33
|
+
vbml.Pattern(pattern, flags=global_ctx.vbml_pattern_flags)
|
|
34
|
+
if isinstance(pattern, str)
|
|
35
|
+
else pattern
|
|
36
|
+
for pattern in patterns
|
|
37
|
+
]
|
|
38
|
+
|
|
39
|
+
def check(self, text: Text, ctx: Context) -> bool:
|
|
40
|
+
return check_string(self.patterns, text, ctx)
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
__all__ = ("Markup", "check_string")
|
telegrinder/bot/rules/mention.py
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
from telegrinder.types.enums import MessageEntityType
|
|
2
|
-
|
|
3
|
-
from .message import Message, MessageRule
|
|
4
|
-
from .text import HasText
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
class HasMention(MessageRule, requires=[HasText()]):
|
|
8
|
-
def check(self, message: Message) -> bool:
|
|
9
|
-
if not message.entities.unwrap_or_none():
|
|
10
|
-
return False
|
|
11
|
-
return any(entity.type == MessageEntityType.MENTION for entity in message.entities.unwrap())
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
__all__ = ("HasMention",)
|
|
1
|
+
from telegrinder.types.enums import MessageEntityType
|
|
2
|
+
|
|
3
|
+
from .message import Message, MessageRule
|
|
4
|
+
from .text import HasText
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class HasMention(MessageRule, requires=[HasText()]):
|
|
8
|
+
def check(self, message: Message) -> bool:
|
|
9
|
+
if not message.entities.unwrap_or_none():
|
|
10
|
+
return False
|
|
11
|
+
return any(entity.type == MessageEntityType.MENTION for entity in message.entities.unwrap())
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
__all__ = ("HasMention",)
|
telegrinder/bot/rules/message.py
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
import abc
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
from telegrinder.types.objects import Message as MessageEvent
|
|
5
|
-
|
|
6
|
-
from .abc import ABCRule, CheckResult, Message
|
|
7
|
-
from .adapter import EventAdapter
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
class MessageRule(ABCRule[Message], abc.ABC):
|
|
11
|
-
adapter: EventAdapter[Message] = EventAdapter(MessageEvent, Message)
|
|
12
|
-
|
|
13
|
-
@abc.abstractmethod
|
|
14
|
-
def check(self,
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
__all__ = ("MessageRule",)
|
|
1
|
+
import abc
|
|
2
|
+
import typing
|
|
3
|
+
|
|
4
|
+
from telegrinder.types.objects import Message as MessageEvent
|
|
5
|
+
|
|
6
|
+
from .abc import ABCRule, CheckResult, Message
|
|
7
|
+
from .adapter import EventAdapter
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class MessageRule(ABCRule[Message], abc.ABC):
|
|
11
|
+
adapter: EventAdapter[Message] = EventAdapter(MessageEvent, Message)
|
|
12
|
+
|
|
13
|
+
@abc.abstractmethod
|
|
14
|
+
def check(self, *args: typing.Any, **kwargs: typing.Any) -> CheckResult: ...
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
__all__ = ("MessageRule",)
|
|
@@ -1,35 +1,35 @@
|
|
|
1
|
-
import typing
|
|
2
|
-
|
|
3
|
-
from telegrinder.bot.dispatch.context import Context
|
|
4
|
-
from telegrinder.types.enums import MessageEntityType
|
|
5
|
-
from telegrinder.types.objects import MessageEntity
|
|
6
|
-
|
|
7
|
-
from .message import Message, MessageRule
|
|
8
|
-
|
|
9
|
-
Entity: typing.TypeAlias = str | MessageEntityType
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
class HasEntities(MessageRule):
|
|
13
|
-
def check(self, message: Message) -> bool:
|
|
14
|
-
return bool(message.entities)
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
class MessageEntities(MessageRule, requires=[HasEntities()]):
|
|
18
|
-
def __init__(self, entities: Entity | list[Entity], /) -> None:
|
|
19
|
-
self.entities = [entities] if not isinstance(entities, list) else entities
|
|
20
|
-
|
|
21
|
-
def check(self, message: Message, ctx: Context) -> bool:
|
|
22
|
-
message_entities: list[MessageEntity] = []
|
|
23
|
-
for entity in message.entities.unwrap():
|
|
24
|
-
for entity_type in self.entities:
|
|
25
|
-
if entity_type == entity.type:
|
|
26
|
-
message_entities.append(entity)
|
|
27
|
-
|
|
28
|
-
if not message_entities:
|
|
29
|
-
return False
|
|
30
|
-
|
|
31
|
-
ctx.message_entities = message_entities
|
|
32
|
-
return True
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
__all__ = ("HasEntities", "MessageEntities")
|
|
1
|
+
import typing
|
|
2
|
+
|
|
3
|
+
from telegrinder.bot.dispatch.context import Context
|
|
4
|
+
from telegrinder.types.enums import MessageEntityType
|
|
5
|
+
from telegrinder.types.objects import MessageEntity
|
|
6
|
+
|
|
7
|
+
from .message import Message, MessageRule
|
|
8
|
+
|
|
9
|
+
Entity: typing.TypeAlias = str | MessageEntityType
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class HasEntities(MessageRule):
|
|
13
|
+
def check(self, message: Message) -> bool:
|
|
14
|
+
return bool(message.entities)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class MessageEntities(MessageRule, requires=[HasEntities()]):
|
|
18
|
+
def __init__(self, entities: Entity | list[Entity], /) -> None:
|
|
19
|
+
self.entities = [entities] if not isinstance(entities, list) else entities
|
|
20
|
+
|
|
21
|
+
def check(self, message: Message, ctx: Context) -> bool:
|
|
22
|
+
message_entities: list[MessageEntity] = []
|
|
23
|
+
for entity in message.entities.unwrap():
|
|
24
|
+
for entity_type in self.entities:
|
|
25
|
+
if entity_type == entity.type:
|
|
26
|
+
message_entities.append(entity)
|
|
27
|
+
|
|
28
|
+
if not message_entities:
|
|
29
|
+
return False
|
|
30
|
+
|
|
31
|
+
ctx.message_entities = message_entities
|
|
32
|
+
return True
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
__all__ = ("HasEntities", "MessageEntities")
|
telegrinder/bot/rules/node.py
CHANGED
|
@@ -1,27 +1,27 @@
|
|
|
1
|
-
import typing
|
|
2
|
-
|
|
3
|
-
from telegrinder.bot.dispatch.context import Context
|
|
4
|
-
from telegrinder.node.base import Node
|
|
5
|
-
|
|
6
|
-
from .abc import ABCRule
|
|
7
|
-
from .adapter.node import NodeAdapter
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
class NodeRule(ABCRule[tuple[Node, ...]]):
|
|
11
|
-
def __init__(self, *nodes: type[Node] | tuple[str, type[Node]]) -> None:
|
|
12
|
-
bindings = [binding if isinstance(binding, tuple) else (None, binding) for binding in nodes]
|
|
13
|
-
self.nodes = [binding[1] for binding in bindings]
|
|
14
|
-
self.node_keys = [binding[0] for binding in bindings]
|
|
15
|
-
|
|
16
|
-
@property
|
|
17
|
-
def adapter(self) -> NodeAdapter:
|
|
18
|
-
return NodeAdapter(*self.nodes) # type: ignore
|
|
19
|
-
|
|
20
|
-
def check(self, resolved_nodes: tuple[Node, ...], ctx: Context) -> typing.Literal[True]:
|
|
21
|
-
for i, node in enumerate(resolved_nodes):
|
|
22
|
-
if key := self.node_keys[i]:
|
|
23
|
-
ctx[key] = node
|
|
24
|
-
return True
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
__all__ = ("NodeRule",)
|
|
1
|
+
import typing
|
|
2
|
+
|
|
3
|
+
from telegrinder.bot.dispatch.context import Context
|
|
4
|
+
from telegrinder.node.base import Node
|
|
5
|
+
|
|
6
|
+
from .abc import ABCRule
|
|
7
|
+
from .adapter.node import NodeAdapter
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class NodeRule(ABCRule[tuple[Node, ...]]):
|
|
11
|
+
def __init__(self, *nodes: type[Node] | tuple[str, type[Node]]) -> None:
|
|
12
|
+
bindings = [binding if isinstance(binding, tuple) else (None, binding) for binding in nodes]
|
|
13
|
+
self.nodes = [binding[1] for binding in bindings]
|
|
14
|
+
self.node_keys = [binding[0] for binding in bindings]
|
|
15
|
+
|
|
16
|
+
@property
|
|
17
|
+
def adapter(self) -> NodeAdapter:
|
|
18
|
+
return NodeAdapter(*self.nodes) # type: ignore
|
|
19
|
+
|
|
20
|
+
def check(self, resolved_nodes: tuple[Node, ...], ctx: Context) -> typing.Literal[True]:
|
|
21
|
+
for i, node in enumerate(resolved_nodes):
|
|
22
|
+
if key := self.node_keys[i]:
|
|
23
|
+
ctx[key] = node
|
|
24
|
+
return True
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
__all__ = ("NodeRule",)
|
telegrinder/bot/rules/regex.py
CHANGED
|
@@ -1,37 +1,37 @@
|
|
|
1
|
-
import re
|
|
2
|
-
import typing
|
|
3
|
-
|
|
4
|
-
from telegrinder.bot.dispatch.context import Context
|
|
5
|
-
from telegrinder.node.text import Text
|
|
6
|
-
|
|
7
|
-
from .abc import ABCRule
|
|
8
|
-
|
|
9
|
-
PatternLike: typing.TypeAlias = str | typing.Pattern[str]
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
class Regex(ABCRule):
|
|
13
|
-
def __init__(self, regexp: PatternLike | list[PatternLike]) -> None:
|
|
14
|
-
self.regexp: list[re.Pattern[str]] = []
|
|
15
|
-
match regexp:
|
|
16
|
-
case re.Pattern() as pattern:
|
|
17
|
-
self.regexp.append(pattern)
|
|
18
|
-
case str(regex):
|
|
19
|
-
self.regexp.append(re.compile(regex))
|
|
20
|
-
case _:
|
|
21
|
-
self.regexp.extend(
|
|
22
|
-
re.compile(regexp) if isinstance(regexp, str) else regexp for regexp in regexp
|
|
23
|
-
)
|
|
24
|
-
|
|
25
|
-
def check(self, text: Text, ctx: Context) -> bool:
|
|
26
|
-
for regexp in self.regexp:
|
|
27
|
-
response = re.match(regexp, text)
|
|
28
|
-
if response is not None:
|
|
29
|
-
if matches := response.groupdict():
|
|
30
|
-
ctx |= matches
|
|
31
|
-
else:
|
|
32
|
-
ctx |= {"matches": response.groups() or (response.group(),)}
|
|
33
|
-
return True
|
|
34
|
-
return False
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
__all__ = ("Regex",)
|
|
1
|
+
import re
|
|
2
|
+
import typing
|
|
3
|
+
|
|
4
|
+
from telegrinder.bot.dispatch.context import Context
|
|
5
|
+
from telegrinder.node.text import Text
|
|
6
|
+
|
|
7
|
+
from .abc import ABCRule
|
|
8
|
+
|
|
9
|
+
PatternLike: typing.TypeAlias = str | typing.Pattern[str]
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class Regex(ABCRule):
|
|
13
|
+
def __init__(self, regexp: PatternLike | list[PatternLike]) -> None:
|
|
14
|
+
self.regexp: list[re.Pattern[str]] = []
|
|
15
|
+
match regexp:
|
|
16
|
+
case re.Pattern() as pattern:
|
|
17
|
+
self.regexp.append(pattern)
|
|
18
|
+
case str(regex):
|
|
19
|
+
self.regexp.append(re.compile(regex))
|
|
20
|
+
case _:
|
|
21
|
+
self.regexp.extend(
|
|
22
|
+
re.compile(regexp) if isinstance(regexp, str) else regexp for regexp in regexp
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
def check(self, text: Text, ctx: Context) -> bool:
|
|
26
|
+
for regexp in self.regexp:
|
|
27
|
+
response = re.match(regexp, text)
|
|
28
|
+
if response is not None:
|
|
29
|
+
if matches := response.groupdict():
|
|
30
|
+
ctx |= matches
|
|
31
|
+
else:
|
|
32
|
+
ctx |= {"matches": response.groups() or (response.group(),)}
|
|
33
|
+
return True
|
|
34
|
+
return False
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
__all__ = ("Regex",)
|