telegrinder 0.3.4__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.

Files changed (165) 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 -258
  11. telegrinder/bot/cute_types/callback_query.py +385 -385
  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 -43
  15. telegrinder/bot/cute_types/message.py +2637 -2637
  16. telegrinder/bot/cute_types/update.py +104 -104
  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 -98
  21. telegrinder/bot/dispatch/dispatch.py +202 -202
  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 -135
  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 +22 -22
  35. telegrinder/bot/dispatch/process.py +157 -157
  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 -200
  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 -114
  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 +172 -172
  59. telegrinder/bot/dispatch/waiter_machine/middleware.py +89 -89
  60. telegrinder/bot/dispatch/waiter_machine/short_state.py +68 -68
  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 +206 -206
  66. telegrinder/bot/rules/adapter/__init__.py +17 -17
  67. telegrinder/bot/rules/adapter/abc.py +31 -31
  68. telegrinder/bot/rules/adapter/errors.py +5 -5
  69. telegrinder/bot/rules/adapter/event.py +65 -65
  70. telegrinder/bot/rules/adapter/node.py +48 -48
  71. telegrinder/bot/rules/adapter/raw_event.py +27 -27
  72. telegrinder/bot/rules/adapter/raw_update.py +30 -30
  73. telegrinder/bot/rules/callback_data.py +163 -163
  74. telegrinder/bot/rules/chat_join.py +43 -43
  75. telegrinder/bot/rules/command.py +126 -126
  76. telegrinder/bot/rules/enum_text.py +36 -36
  77. telegrinder/bot/rules/func.py +26 -26
  78. telegrinder/bot/rules/fuzzy.py +24 -24
  79. telegrinder/bot/rules/inline.py +56 -56
  80. telegrinder/bot/rules/integer.py +20 -20
  81. telegrinder/bot/rules/is_from.py +127 -127
  82. telegrinder/bot/rules/markup.py +43 -43
  83. telegrinder/bot/rules/mention.py +14 -14
  84. telegrinder/bot/rules/message.py +17 -17
  85. telegrinder/bot/rules/message_entities.py +35 -35
  86. telegrinder/bot/rules/node.py +27 -27
  87. telegrinder/bot/rules/regex.py +37 -37
  88. telegrinder/bot/rules/rule_enum.py +72 -72
  89. telegrinder/bot/rules/start.py +42 -42
  90. telegrinder/bot/rules/state.py +37 -37
  91. telegrinder/bot/rules/text.py +33 -33
  92. telegrinder/bot/rules/update.py +15 -15
  93. telegrinder/bot/scenario/__init__.py +5 -5
  94. telegrinder/bot/scenario/abc.py +19 -19
  95. telegrinder/bot/scenario/checkbox.py +176 -176
  96. telegrinder/bot/scenario/choice.py +51 -51
  97. telegrinder/client/__init__.py +4 -4
  98. telegrinder/client/abc.py +75 -75
  99. telegrinder/client/aiohttp.py +130 -130
  100. telegrinder/model.py +313 -313
  101. telegrinder/modules.py +237 -237
  102. telegrinder/msgspec_json.py +14 -14
  103. telegrinder/msgspec_utils.py +410 -410
  104. telegrinder/node/__init__.py +20 -20
  105. telegrinder/node/attachment.py +87 -87
  106. telegrinder/node/base.py +157 -157
  107. telegrinder/node/callback_query.py +53 -53
  108. telegrinder/node/command.py +33 -33
  109. telegrinder/node/composer.py +198 -198
  110. telegrinder/node/container.py +27 -27
  111. telegrinder/node/event.py +65 -65
  112. telegrinder/node/me.py +16 -16
  113. telegrinder/node/message.py +14 -14
  114. telegrinder/node/polymorphic.py +48 -48
  115. telegrinder/node/rule.py +76 -76
  116. telegrinder/node/scope.py +38 -38
  117. telegrinder/node/source.py +71 -71
  118. telegrinder/node/text.py +41 -41
  119. telegrinder/node/tools/__init__.py +3 -3
  120. telegrinder/node/tools/generator.py +40 -40
  121. telegrinder/node/update.py +15 -15
  122. telegrinder/rules.py +5 -5
  123. telegrinder/tools/__init__.py +74 -74
  124. telegrinder/tools/buttons.py +79 -79
  125. telegrinder/tools/error_handler/__init__.py +7 -7
  126. telegrinder/tools/error_handler/abc.py +33 -33
  127. telegrinder/tools/error_handler/error.py +9 -9
  128. telegrinder/tools/error_handler/error_handler.py +193 -193
  129. telegrinder/tools/formatting/__init__.py +46 -46
  130. telegrinder/tools/formatting/html.py +283 -283
  131. telegrinder/tools/formatting/links.py +33 -33
  132. telegrinder/tools/formatting/spec_html_formats.py +111 -111
  133. telegrinder/tools/functional.py +12 -12
  134. telegrinder/tools/global_context/__init__.py +7 -7
  135. telegrinder/tools/global_context/abc.py +63 -63
  136. telegrinder/tools/global_context/global_context.py +412 -412
  137. telegrinder/tools/global_context/telegrinder_ctx.py +27 -27
  138. telegrinder/tools/i18n/__init__.py +7 -7
  139. telegrinder/tools/i18n/abc.py +30 -30
  140. telegrinder/tools/i18n/middleware/__init__.py +3 -3
  141. telegrinder/tools/i18n/middleware/abc.py +25 -25
  142. telegrinder/tools/i18n/simple.py +43 -43
  143. telegrinder/tools/kb_set/__init__.py +4 -4
  144. telegrinder/tools/kb_set/base.py +15 -15
  145. telegrinder/tools/kb_set/yaml.py +63 -63
  146. telegrinder/tools/keyboard.py +128 -128
  147. telegrinder/tools/limited_dict.py +37 -37
  148. telegrinder/tools/loop_wrapper/__init__.py +4 -4
  149. telegrinder/tools/loop_wrapper/abc.py +15 -15
  150. telegrinder/tools/loop_wrapper/loop_wrapper.py +224 -224
  151. telegrinder/tools/magic.py +157 -157
  152. telegrinder/tools/parse_mode.py +6 -6
  153. telegrinder/tools/state_storage/__init__.py +4 -4
  154. telegrinder/tools/state_storage/abc.py +35 -35
  155. telegrinder/tools/state_storage/memory.py +25 -25
  156. telegrinder/types/__init__.py +260 -260
  157. telegrinder/types/enums.py +701 -701
  158. telegrinder/types/methods.py +4633 -4633
  159. telegrinder/types/objects.py +6950 -6950
  160. telegrinder/verification_utils.py +32 -32
  161. {telegrinder-0.3.4.dist-info → telegrinder-0.3.4.post1.dist-info}/LICENSE +22 -22
  162. {telegrinder-0.3.4.dist-info → telegrinder-0.3.4.post1.dist-info}/METADATA +1 -1
  163. telegrinder-0.3.4.post1.dist-info/RECORD +165 -0
  164. telegrinder-0.3.4.dist-info/RECORD +0 -165
  165. {telegrinder-0.3.4.dist-info → telegrinder-0.3.4.post1.dist-info}/WHEEL +0 -0
@@ -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
- 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
+ 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",)