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.

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 +17 -17
  10. telegrinder/bot/cute_types/base.py +258 -234
  11. telegrinder/bot/cute_types/callback_query.py +385 -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 +43 -53
  15. telegrinder/bot/cute_types/message.py +2637 -2631
  16. telegrinder/bot/cute_types/update.py +109 -75
  17. telegrinder/bot/cute_types/utils.py +95 -95
  18. telegrinder/bot/dispatch/__init__.py +55 -55
  19. telegrinder/bot/dispatch/abc.py +77 -77
  20. telegrinder/bot/dispatch/context.py +98 -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 +135 -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 +55 -55
  55. telegrinder/bot/dispatch/waiter_machine/hasher/hasher.py +57 -57
  56. telegrinder/bot/dispatch/waiter_machine/hasher/message.py +51 -51
  57. telegrinder/bot/dispatch/waiter_machine/hasher/state.py +19 -19
  58. telegrinder/bot/dispatch/waiter_machine/machine.py +167 -170
  59. telegrinder/bot/dispatch/waiter_machine/middleware.py +89 -89
  60. telegrinder/bot/dispatch/waiter_machine/short_state.py +68 -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 +213 -238
  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 +67 -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 +170 -171
  73. telegrinder/bot/rules/chat_join.py +46 -48
  74. telegrinder/bot/rules/command.py +126 -126
  75. telegrinder/bot/rules/enum_text.py +36 -36
  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 +127 -127
  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 -147
  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 +295 -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 +7 -3
  104. telegrinder/node/attachment.py +87 -87
  105. telegrinder/node/base.py +166 -144
  106. telegrinder/node/callback_query.py +53 -14
  107. telegrinder/node/command.py +33 -33
  108. telegrinder/node/composer.py +198 -184
  109. telegrinder/node/container.py +27 -27
  110. telegrinder/node/event.py +65 -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 +41 -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 +283 -283
  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 +7 -7
  138. telegrinder/tools/i18n/abc.py +30 -30
  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 +132 -132
  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 +224 -216
  150. telegrinder/tools/magic.py +157 -157
  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 +260 -260
  156. telegrinder/types/enums.py +701 -701
  157. telegrinder/types/methods.py +4633 -4633
  158. telegrinder/types/objects.py +8561 -6541
  159. telegrinder/verification_utils.py +32 -32
  160. {telegrinder-0.3.1.dist-info → telegrinder-0.3.3.dist-info}/LICENSE +22 -22
  161. {telegrinder-0.3.1.dist-info → telegrinder-0.3.3.dist-info}/METADATA +1 -1
  162. telegrinder-0.3.3.dist-info/RECORD +164 -0
  163. telegrinder-0.3.1.dist-info/RECORD +0 -164
  164. {telegrinder-0.3.1.dist-info → telegrinder-0.3.3.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
- 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,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
+ )
@@ -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")
@@ -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",)
@@ -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, 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
+ 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")
@@ -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",)
@@ -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",)