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,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
- async 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")
@@ -1,146 +1,146 @@
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
- async def check(self, user: UserSource) -> bool:
12
- return user.is_bot
13
-
14
-
15
- class IsUser(ABCRule):
16
- async def check(self, user: UserSource) -> bool:
17
- return not user.is_bot
18
-
19
-
20
- class IsPremium(ABCRule):
21
- async 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
- async 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
- async def check(self, user: UserSource) -> bool:
38
- return user.id in self.user_ids
39
-
40
-
41
- class IsForum(ABCRule):
42
- async 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
- async def check(self, chat: ChatSource) -> bool:
51
- return chat.id in self.chat_ids
52
-
53
-
54
- class IsPrivate(ABCRule):
55
- async def check(self, chat: ChatSource) -> bool:
56
- return chat.type == ChatType.PRIVATE
57
-
58
-
59
- class IsGroup(ABCRule):
60
- async def check(self, chat: ChatSource) -> bool:
61
- return chat.type == ChatType.GROUP
62
-
63
-
64
- class IsSuperGroup(ABCRule):
65
- async def check(self, chat: ChatSource) -> bool:
66
- return chat.type == ChatType.SUPERGROUP
67
-
68
-
69
- class IsChat(ABCRule):
70
- async def check(self, chat: ChatSource) -> bool:
71
- return chat.type in (ChatType.GROUP, ChatType.SUPERGROUP)
72
-
73
-
74
- class IsDice(MessageRule):
75
- async 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
- async def check(self, message: Message) -> bool:
84
- return message.dice.unwrap().emoji == self.dice_emoji
85
-
86
-
87
- class IsForward(MessageRule):
88
- async 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
- async def check(self, message: Message) -> bool:
97
- return message.forward_origin.unwrap().v.type == self.fwd_type
98
-
99
-
100
- class IsReply(MessageRule):
101
- async def check(self, message: Message) -> bool:
102
- return bool(message.reply_to_message)
103
-
104
-
105
- class IsSticker(MessageRule):
106
- async def check(self, message: Message) -> bool:
107
- return bool(message.sticker)
108
-
109
-
110
- class IsVideoNote(MessageRule):
111
- async def check(self, message: Message) -> bool:
112
- return bool(message.video_note)
113
-
114
-
115
- class IsDocument(MessageRule):
116
- async def check(self, message: Message) -> bool:
117
- return bool(message.document)
118
-
119
-
120
- class IsPhoto(MessageRule):
121
- async def check(self, message: Message) -> bool:
122
- return bool(message.photo)
123
-
124
-
125
- __all__ = (
126
- "IsBot",
127
- "IsChat",
128
- "IsChatId",
129
- "IsDice",
130
- "IsDiceEmoji",
131
- "IsDocument",
132
- "IsForum",
133
- "IsForward",
134
- "IsForwardType",
135
- "IsGroup",
136
- "IsLanguageCode",
137
- "IsPhoto",
138
- "IsPremium",
139
- "IsPrivate",
140
- "IsReply",
141
- "IsSticker",
142
- "IsSuperGroup",
143
- "IsUser",
144
- "IsUserId",
145
- "IsVideoNote",
146
- )
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
+ "IsBot",
127
+ "IsChat",
128
+ "IsChatId",
129
+ "IsDice",
130
+ "IsDiceEmoji",
131
+ "IsDocument",
132
+ "IsForum",
133
+ "IsForward",
134
+ "IsForwardType",
135
+ "IsGroup",
136
+ "IsLanguageCode",
137
+ "IsPhoto",
138
+ "IsPremium",
139
+ "IsPrivate",
140
+ "IsReply",
141
+ "IsSticker",
142
+ "IsSuperGroup",
143
+ "IsUser",
144
+ "IsUserId",
145
+ "IsVideoNote",
146
+ )
@@ -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
- async 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")
@@ -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
- async 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",)
@@ -1,17 +1,17 @@
1
- import abc
2
-
3
- from telegrinder.bot.dispatch.context import Context
4
- from telegrinder.types.objects import Message as MessageEvent
5
-
6
- from .abc import ABCRule, 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
- async def check(self, message: Message, ctx: Context) -> bool: ...
15
-
16
-
17
- __all__ = ("MessageRule",)
1
+ import abc
2
+
3
+ from telegrinder.bot.dispatch.context import Context
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, message: Message, ctx: Context) -> 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
- async 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
- async 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")
@@ -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
- async 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",)