telegrinder 0.1.dev164__tar.gz → 0.1.dev166__tar.gz

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 (143) hide show
  1. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/PKG-INFO +1 -1
  2. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/pyproject.toml +5 -5
  3. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/__init__.py +58 -0
  4. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/api/abc.py +1 -1
  5. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/api/api.py +8 -6
  6. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/api/error.py +2 -3
  7. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/__init__.py +14 -0
  8. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/bot.py +13 -2
  9. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/cute_types/__init__.py +4 -0
  10. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/cute_types/base.py +22 -13
  11. telegrinder-0.1.dev166/telegrinder/bot/cute_types/chat_join_request.py +63 -0
  12. telegrinder-0.1.dev166/telegrinder/bot/cute_types/chat_member_updated.py +244 -0
  13. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/cute_types/message.py +33 -6
  14. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/cute_types/update.py +5 -4
  15. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/cute_types/utils.py +39 -17
  16. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/dispatch/__init__.py +9 -1
  17. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/dispatch/composition.py +10 -8
  18. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/dispatch/context.py +9 -10
  19. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/dispatch/dispatch.py +29 -19
  20. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/dispatch/handler/abc.py +1 -0
  21. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/dispatch/handler/func.py +29 -6
  22. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/dispatch/handler/message_reply.py +2 -3
  23. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/dispatch/middleware/abc.py +2 -4
  24. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/dispatch/process.py +4 -3
  25. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/dispatch/return_manager/__init__.py +1 -1
  26. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/dispatch/return_manager/abc.py +39 -21
  27. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/dispatch/return_manager/callback_query.py +4 -2
  28. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/dispatch/return_manager/inline_query.py +4 -2
  29. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/dispatch/return_manager/message.py +12 -6
  30. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/dispatch/view/__init__.py +8 -2
  31. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/dispatch/view/abc.py +26 -20
  32. telegrinder-0.1.dev166/telegrinder/bot/dispatch/view/box.py +110 -0
  33. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/dispatch/view/callback_query.py +1 -3
  34. telegrinder-0.1.dev166/telegrinder/bot/dispatch/view/chat_join_request.py +17 -0
  35. telegrinder-0.1.dev166/telegrinder/bot/dispatch/view/chat_member.py +26 -0
  36. telegrinder-0.1.dev166/telegrinder/bot/dispatch/view/message.py +40 -0
  37. telegrinder-0.1.dev166/telegrinder/bot/dispatch/view/raw.py +116 -0
  38. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/dispatch/waiter_machine/__init__.py +2 -1
  39. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/dispatch/waiter_machine/machine.py +73 -19
  40. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/dispatch/waiter_machine/middleware.py +3 -3
  41. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/dispatch/waiter_machine/short_state.py +6 -3
  42. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/polling/polling.py +17 -1
  43. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/rules/__init__.py +20 -12
  44. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/rules/abc.py +0 -9
  45. telegrinder-0.1.dev166/telegrinder/bot/rules/adapter/event.py +58 -0
  46. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/rules/callback_data.py +15 -20
  47. telegrinder-0.1.dev166/telegrinder/bot/rules/chat_join.py +47 -0
  48. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/rules/enum_text.py +7 -2
  49. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/rules/inline.py +3 -3
  50. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/rules/is_from.py +36 -50
  51. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/rules/markup.py +1 -1
  52. telegrinder-0.1.dev166/telegrinder/bot/rules/message.py +17 -0
  53. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/rules/message_entities.py +1 -1
  54. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/rules/start.py +6 -4
  55. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/rules/text.py +2 -1
  56. telegrinder-0.1.dev166/telegrinder/bot/rules/update.py +16 -0
  57. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/scenario/checkbox.py +9 -7
  58. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/client/aiohttp.py +4 -4
  59. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/model.py +43 -19
  60. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/modules.py +16 -32
  61. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/msgspec_utils.py +48 -36
  62. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/node/attachment.py +15 -5
  63. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/node/base.py +24 -16
  64. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/node/composer.py +8 -6
  65. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/node/container.py +1 -1
  66. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/node/rule.py +4 -4
  67. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/node/source.py +4 -2
  68. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/node/tools/generator.py +1 -1
  69. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/tools/__init__.py +2 -1
  70. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/tools/error_handler/abc.py +4 -3
  71. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/tools/error_handler/error_handler.py +22 -16
  72. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/tools/formatting/html.py +20 -18
  73. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/tools/formatting/links.py +12 -6
  74. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/tools/formatting/spec_html_formats.py +5 -6
  75. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/tools/global_context/abc.py +5 -1
  76. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/tools/global_context/global_context.py +2 -2
  77. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/tools/global_context/telegrinder_ctx.py +1 -1
  78. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/tools/i18n/base.py +4 -3
  79. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/tools/i18n/simple.py +1 -3
  80. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/tools/keyboard.py +1 -1
  81. telegrinder-0.1.dev166/telegrinder/tools/loop_wrapper/__init__.py +4 -0
  82. telegrinder-0.1.dev166/telegrinder/tools/loop_wrapper/abc.py +15 -0
  83. telegrinder-0.1.dev166/telegrinder/tools/loop_wrapper/loop_wrapper.py +186 -0
  84. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/tools/magic.py +1 -1
  85. telegrinder-0.1.dev166/telegrinder/types/__init__.py +208 -0
  86. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/types/enums.py +34 -0
  87. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/types/methods.py +52 -47
  88. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/types/objects.py +531 -88
  89. telegrinder-0.1.dev166/telegrinder/verification_utils.py +33 -0
  90. telegrinder-0.1.dev164/telegrinder/bot/dispatch/view/box.py +0 -39
  91. telegrinder-0.1.dev164/telegrinder/bot/dispatch/view/message.py +0 -18
  92. telegrinder-0.1.dev164/telegrinder/bot/rules/adapter/event.py +0 -49
  93. telegrinder-0.1.dev164/telegrinder/tools/loop_wrapper/__init__.py +0 -4
  94. telegrinder-0.1.dev164/telegrinder/tools/loop_wrapper/abc.py +0 -18
  95. telegrinder-0.1.dev164/telegrinder/tools/loop_wrapper/loop_wrapper.py +0 -132
  96. telegrinder-0.1.dev164/telegrinder/types/__init__.py +0 -2
  97. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/LICENSE +0 -0
  98. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/readme.md +0 -0
  99. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/api/__init__.py +0 -0
  100. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/api/response.py +0 -0
  101. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/cute_types/callback_query.py +0 -0
  102. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/cute_types/inline_query.py +0 -0
  103. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/dispatch/abc.py +0 -0
  104. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/dispatch/handler/__init__.py +0 -0
  105. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/dispatch/middleware/__init__.py +0 -0
  106. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/dispatch/view/inline_query.py +0 -0
  107. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/polling/__init__.py +0 -0
  108. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/polling/abc.py +0 -0
  109. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/rules/adapter/__init__.py +0 -0
  110. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/rules/adapter/abc.py +0 -0
  111. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/rules/adapter/errors.py +0 -0
  112. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/rules/adapter/raw_update.py +0 -0
  113. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/rules/command.py +0 -0
  114. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/rules/func.py +0 -0
  115. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/rules/fuzzy.py +0 -0
  116. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/rules/integer.py +0 -0
  117. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/rules/mention.py +0 -0
  118. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/rules/regex.py +0 -0
  119. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/rules/rule_enum.py +0 -0
  120. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/scenario/__init__.py +0 -0
  121. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/scenario/abc.py +0 -0
  122. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/scenario/choice.py +0 -0
  123. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/client/__init__.py +0 -0
  124. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/client/abc.py +0 -0
  125. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/msgspec_json.py +0 -0
  126. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/node/__init__.py +12 -12
  127. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/node/message.py +0 -0
  128. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/node/text.py +0 -0
  129. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/node/tools/__init__.py +0 -0
  130. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/node/update.py +0 -0
  131. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/rules.py +0 -0
  132. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/tools/buttons.py +0 -0
  133. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/tools/error_handler/__init__.py +0 -0
  134. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/tools/error_handler/error.py +0 -0
  135. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/tools/formatting/__init__.py +0 -0
  136. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/tools/global_context/__init__.py +0 -0
  137. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/tools/i18n/__init__.py +0 -0
  138. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/tools/i18n/middleware/__init__.py +0 -0
  139. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/tools/i18n/middleware/base.py +0 -0
  140. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/tools/kb_set/__init__.py +0 -0
  141. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/tools/kb_set/base.py +0 -0
  142. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/tools/kb_set/yaml.py +0 -0
  143. {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/tools/parse_mode.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: telegrinder
3
- Version: 0.1.dev164
3
+ Version: 0.1.dev166
4
4
  Summary: Framework for effective and reliable async telegram bot building.
5
5
  Home-page: https://github.com/timoniq/telegrinder
6
6
  License: MIT
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "telegrinder"
3
- version = "0.1.dev164"
3
+ version = "0.1.dev166"
4
4
  description = "Framework for effective and reliable async telegram bot building."
5
5
  authors = ["timoniq <tesseradecades@mail.ru>"]
6
6
  maintainers = ["luwqz1 <howluwqz1@gmail.com>"]
@@ -60,8 +60,8 @@ build-backend = "poetry.core.masonry.api"
60
60
  [tool.ruff]
61
61
  line-length = 100
62
62
  target-version = "py311"
63
- select = ["I", "N", "ANN", "COM", "YTT", "TCH", "SIM"]
64
- ignore = [
63
+ lint.select = ["I", "N", "ANN", "COM", "YTT", "TCH", "SIM"]
64
+ lint.ignore = [
65
65
  "ANN001", "ANN002", "ANN003", "ANN101", "ANN102", "ANN201", "ANN202",
66
66
  "ANN204", "ANN206", "ANN401", "COM812", "N818", "TCH001", "TCH004"
67
67
  ]
@@ -73,8 +73,8 @@ target-version = ["py311"]
73
73
  [tool.pytest.ini_options]
74
74
  asyncio_mode = "auto"
75
75
 
76
- [tool.ruff.per-file-ignores]
76
+ [tool.ruff.lint.per-file-ignores]
77
77
  "__init__.py" = ["F401", "F403"]
78
78
 
79
- [tool.ruff.flake8-quotes]
79
+ [tool.ruff.lint.flake8-quotes]
80
80
  docstring-quotes = "double"
@@ -1,3 +1,37 @@
1
+ """Telegrinder
2
+
3
+ Framework for effective and reliable telegram bot building.
4
+
5
+ * Type hinted
6
+ * Customizable and extensible
7
+ * Ready to use scenarios and rules
8
+ * Fast models built on msgspec
9
+ * Both low-level and high-level API
10
+
11
+ Basic example:
12
+
13
+ ```python
14
+ from telegrinder import API, Message, Telegrinder, Token
15
+ from telegrinder.modules import logger
16
+ from telegrinder.rules import Text
17
+
18
+ api = API(token=Token("123:token"))
19
+ bot = Telegrinder(api)
20
+ logger.set_level("INFO")
21
+
22
+
23
+ @bot.on.message(Text("/start"))
24
+ async def start(message: Message):
25
+ me = (await api.get_me()).unwrap()
26
+ await message.answer(
27
+ f"Hello, {message.from_user.full_name}! I'm {me.full_name}."
28
+ )
29
+
30
+
31
+ bot.run_forever()
32
+ ```
33
+ """
34
+
1
35
  import typing
2
36
 
3
37
  from .api import ABCAPI, API, APIError, APIResponse, Token
@@ -18,6 +52,10 @@ from .bot import (
18
52
  CallbackQueryCute,
19
53
  CallbackQueryReturnManager,
20
54
  CallbackQueryView,
55
+ ChatJoinRequestCute,
56
+ ChatJoinRequestView,
57
+ ChatMemberUpdatedCute,
58
+ ChatMemberView,
21
59
  Checkbox,
22
60
  Dispatch,
23
61
  FuncHandler,
@@ -29,8 +67,12 @@ from .bot import (
29
67
  MessageRule,
30
68
  MessageView,
31
69
  Polling,
70
+ RawEventView,
71
+ ShortState,
72
+ ShortStateStorage,
32
73
  SingleChoice,
33
74
  Telegrinder,
75
+ UpdateCute,
34
76
  ViewBox,
35
77
  WaiterMachine,
36
78
  register_manager,
@@ -58,6 +100,7 @@ from .tools import (
58
100
  Keyboard,
59
101
  KeyboardSetBase,
60
102
  KeyboardSetYAML,
103
+ Lifespan,
61
104
  LoopWrapper,
62
105
  ParseMode,
63
106
  RowButtons,
@@ -67,7 +110,10 @@ from .tools import (
67
110
  magic_bundle,
68
111
  )
69
112
 
113
+ Update: typing.TypeAlias = UpdateCute
70
114
  Message: typing.TypeAlias = MessageCute
115
+ ChatJoinRequest: typing.TypeAlias = ChatJoinRequestCute
116
+ ChatMemberUpdated: typing.TypeAlias = ChatMemberUpdatedCute
71
117
  CallbackQuery: typing.TypeAlias = CallbackQueryCute
72
118
  InlineQuery: typing.TypeAlias = InlineQueryCute
73
119
  Bot: typing.TypeAlias = Telegrinder
@@ -105,6 +151,12 @@ __all__ = (
105
151
  "CallbackQueryCute",
106
152
  "CallbackQueryReturnManager",
107
153
  "CallbackQueryView",
154
+ "ChatJoinRequest",
155
+ "ChatJoinRequestCute",
156
+ "ChatJoinRequestView",
157
+ "ChatMemberUpdated",
158
+ "ChatMemberUpdatedCute",
159
+ "ChatMemberView",
108
160
  "Checkbox",
109
161
  "CtxVar",
110
162
  "DelayedTask",
@@ -123,6 +175,7 @@ __all__ = (
123
175
  "Keyboard",
124
176
  "KeyboardSetBase",
125
177
  "KeyboardSetYAML",
178
+ "Lifespan",
126
179
  "LoopWrapper",
127
180
  "Message",
128
181
  "MessageCute",
@@ -133,12 +186,17 @@ __all__ = (
133
186
  "Model",
134
187
  "ParseMode",
135
188
  "Polling",
189
+ "RawEventView",
136
190
  "RowButtons",
191
+ "ShortState",
192
+ "ShortStateStorage",
137
193
  "SimpleI18n",
138
194
  "SimpleTranslator",
139
195
  "SingleChoice",
140
196
  "Telegrinder",
141
197
  "Token",
198
+ "Update",
199
+ "UpdateCute",
142
200
  "ViewBox",
143
201
  "WaiterMachine",
144
202
  "ctx_var",
@@ -17,7 +17,7 @@ class Token(str):
17
17
  if token.count(":") != 1 or not token.split(":")[0].isdigit():
18
18
  raise InvalidTokenError("Invalid token, it should look like this '123:ABC'.")
19
19
  return super().__new__(cls, token)
20
-
20
+
21
21
  def __repr__(self) -> str:
22
22
  return f"<Token: {self.bot_id}:{''.join(self.split(':')[-1])[:6]}...>"
23
23
 
@@ -32,7 +32,7 @@ class API(ABCAPI, APIMethods):
32
32
  self.token = token
33
33
  self.http = http or AiohttpClient()
34
34
  super().__init__(self)
35
-
35
+
36
36
  def __repr__(self) -> str:
37
37
  return "<{}: token={!r}, http={!r}>".format(
38
38
  self.__class__.__name__,
@@ -56,15 +56,17 @@ class API(ABCAPI, APIMethods):
56
56
  ) -> Result[dict[str, typing.Any] | list[typing.Any] | bool, APIError]:
57
57
  response = await self.http.request_json(
58
58
  url=self.request_url + method,
59
- data=compose_data(self.http, data or {}, files or {})
59
+ data=compose_data(self.http, data or {}, files or {}),
60
60
  )
61
61
  if response.get("ok"):
62
62
  assert "result" in response
63
63
  return Ok(response["result"])
64
- return Error(APIError(
65
- code=response.get("error_code", 400),
66
- error=response.get("description"),
67
- ))
64
+ return Error(
65
+ APIError(
66
+ code=response.get("error_code", 400),
67
+ error=response.get("description"),
68
+ )
69
+ )
68
70
 
69
71
  async def request_raw(
70
72
  self,
@@ -1,7 +1,7 @@
1
1
  class APIError(BaseException):
2
2
  def __init__(self, code: int, error: str | None = None) -> None:
3
3
  self.code, self.error = code, error
4
-
4
+
5
5
  def __str__(self) -> str:
6
6
  return f"[{self.code}] {self.error or 'Something went wrong'}"
7
7
 
@@ -9,8 +9,7 @@ class APIError(BaseException):
9
9
  return f"<APIError: {self.__str__()}>"
10
10
 
11
11
 
12
- class InvalidTokenError(BaseException):
13
- ...
12
+ class InvalidTokenError(BaseException): ...
14
13
 
15
14
 
16
15
  __all__ = ("APIError", "InvalidTokenError")
@@ -2,6 +2,8 @@ from .bot import Telegrinder
2
2
  from .cute_types import (
3
3
  BaseCute,
4
4
  CallbackQueryCute,
5
+ ChatJoinRequestCute,
6
+ ChatMemberUpdatedCute,
5
7
  InlineQueryCute,
6
8
  MessageCute,
7
9
  UpdateCute,
@@ -18,6 +20,8 @@ from .dispatch import (
18
20
  BaseView,
19
21
  CallbackQueryReturnManager,
20
22
  CallbackQueryView,
23
+ ChatJoinRequestView,
24
+ ChatMemberView,
21
25
  CompositionDispatch,
22
26
  Context,
23
27
  Dispatch,
@@ -27,6 +31,9 @@ from .dispatch import (
27
31
  MessageReplyHandler,
28
32
  MessageReturnManager,
29
33
  MessageView,
34
+ RawEventView,
35
+ ShortState,
36
+ ShortStateStorage,
30
37
  ViewBox,
31
38
  WaiterMachine,
32
39
  register_manager,
@@ -53,6 +60,10 @@ __all__ = (
53
60
  "CallbackQueryReturnManager",
54
61
  "CallbackQueryRule",
55
62
  "CallbackQueryView",
63
+ "ChatJoinRequestCute",
64
+ "ChatJoinRequestView",
65
+ "ChatMemberUpdatedCute",
66
+ "ChatMemberView",
56
67
  "Checkbox",
57
68
  "CompositionDispatch",
58
69
  "Context",
@@ -67,6 +78,9 @@ __all__ = (
67
78
  "MessageRule",
68
79
  "MessageView",
69
80
  "Polling",
81
+ "RawEventView",
82
+ "ShortState",
83
+ "ShortStateStorage",
70
84
  "SingleChoice",
71
85
  "Telegrinder",
72
86
  "UpdateCute",
@@ -11,7 +11,7 @@ PollingT = typing.TypeVar("PollingT", bound=ABCPolling, default=Polling)
11
11
  LoopWrapperT = typing.TypeVar("LoopWrapperT", bound=ABCLoopWrapper, default=LoopWrapper)
12
12
 
13
13
 
14
- class Telegrinder(typing.Generic[DispatchT, PollingT, LoopWrapperT]):
14
+ class Telegrinder(typing.Generic[DispatchT, PollingT, LoopWrapperT]):
15
15
  def __init__(
16
16
  self,
17
17
  api: API,
@@ -25,6 +25,15 @@ class Telegrinder(typing.Generic[DispatchT, PollingT, LoopWrapperT]):
25
25
  self.polling = typing.cast(PollingT, polling or Polling(api))
26
26
  self.loop_wrapper = typing.cast(LoopWrapperT, loop_wrapper or LoopWrapper())
27
27
 
28
+ def __repr__(self) -> str:
29
+ return "<{}: api={!r}, dispatch={!r}, polling={!r}, loop_wrapper={!r}>".format(
30
+ self.__class__.__name__,
31
+ self.api,
32
+ self.dispatch,
33
+ self.polling,
34
+ self.loop_wrapper,
35
+ )
36
+
28
37
  @property
29
38
  def on(self) -> DispatchT:
30
39
  return self.dispatch
@@ -48,7 +57,9 @@ class Telegrinder(typing.Generic[DispatchT, PollingT, LoopWrapperT]):
48
57
 
49
58
  def run_forever(self, *, offset: int = 0, skip_updates: bool = False) -> None:
50
59
  logger.debug("Running blocking polling (id={})", self.api.id)
51
- self.loop_wrapper.add_task(self.run_polling(offset=offset, skip_updates=skip_updates))
60
+ self.loop_wrapper.add_task(
61
+ self.run_polling(offset=offset, skip_updates=skip_updates)
62
+ )
52
63
  self.loop_wrapper.run_event_loop()
53
64
 
54
65
 
@@ -1,5 +1,7 @@
1
1
  from .base import BaseCute
2
2
  from .callback_query import CallbackQueryCute
3
+ from .chat_join_request import ChatJoinRequestCute
4
+ from .chat_member_updated import ChatMemberUpdatedCute
3
5
  from .inline_query import InlineQueryCute
4
6
  from .message import MessageCute
5
7
  from .update import UpdateCute
@@ -7,6 +9,8 @@ from .update import UpdateCute
7
9
  __all__ = (
8
10
  "BaseCute",
9
11
  "CallbackQueryCute",
12
+ "ChatJoinRequestCute",
13
+ "ChatMemberUpdatedCute",
10
14
  "InlineQueryCute",
11
15
  "MessageCute",
12
16
  "UpdateCute",
@@ -23,12 +23,10 @@ if typing.TYPE_CHECKING:
23
23
  api: ABCAPI
24
24
 
25
25
  @classmethod
26
- def from_update(cls, update: UpdateT, bound_api: ABCAPI) -> typing.Self:
27
- ...
26
+ def from_update(cls, update: UpdateT, bound_api: ABCAPI) -> typing.Self: ...
28
27
 
29
28
  @property
30
- def ctx_api(self) -> API:
31
- ...
29
+ def ctx_api(self) -> API: ...
32
30
 
33
31
  else:
34
32
 
@@ -76,7 +74,9 @@ def compose_method_params(
76
74
  if param_name not in params:
77
75
  if param_name in validators and not validators[param_name](update):
78
76
  continue
79
- params[param_name] = getattr(update, param if isinstance(param, str) else param[1])
77
+ params[param_name] = getattr(
78
+ update, param if isinstance(param, str) else param[1]
79
+ )
80
80
 
81
81
  return params
82
82
 
@@ -91,36 +91,45 @@ def shortcut(
91
91
  ):
92
92
  def wrapper(func: F) -> F:
93
93
  @wraps(func)
94
- async def inner(self: CuteT, *args: typing.Any, **kwargs: typing.Any) -> typing.Any:
94
+ async def inner(
95
+ self: CuteT,
96
+ *args: typing.Any,
97
+ **kwargs: typing.Any,
98
+ ) -> typing.Any:
95
99
  if executor is None:
96
100
  return await func(self, *args, **kwargs)
97
101
  signature_params = {
98
- k: p
99
- for k, p in inspect.signature(func).parameters.items()
100
- if k != "self"
102
+ k: p for k, p in inspect.signature(func).parameters.items() if k != "self"
101
103
  }
102
104
  params: dict[str, typing.Any] = {}
103
105
  index = 0
104
106
 
105
107
  for k, p in signature_params.items():
106
- if p.kind in (p.POSITIONAL_OR_KEYWORD, p.POSITIONAL_ONLY) and len(args) > index:
108
+ if (
109
+ p.kind in (p.POSITIONAL_OR_KEYWORD, p.POSITIONAL_ONLY)
110
+ and len(args) > index
111
+ ):
107
112
  params[k] = args[index]
108
113
  index += 1
109
114
  continue
110
115
  if p.kind in (p.VAR_KEYWORD, p.VAR_POSITIONAL):
111
116
  params[k] = kwargs.copy() if p.kind is p.VAR_KEYWORD else args[index:]
112
117
  continue
113
- params[k] = kwargs.pop(k, p.default) if p.default is not p.empty else kwargs.pop(k)
118
+ params[k] = (
119
+ kwargs.pop(k, p.default)
120
+ if p.default is not p.empty
121
+ else kwargs.pop(k)
122
+ )
114
123
 
115
124
  return await executor(self, method_name, get_params(params))
116
-
125
+
117
126
  inner.__shortcut__ = Shortcut( # type: ignore
118
127
  method_name=method_name,
119
128
  executor=executor,
120
129
  custom_params=custom_params or set(),
121
130
  )
122
131
  return inner # type: ignore
123
-
132
+
124
133
  return wrapper
125
134
 
126
135
 
@@ -0,0 +1,63 @@
1
+ import typing
2
+
3
+ from fntypes.result import Result
4
+
5
+ from telegrinder.api.abc import ABCAPI, APIError
6
+ from telegrinder.types.objects import ChatJoinRequest, User
7
+
8
+ from .base import BaseCute, shortcut
9
+ from .chat_member_updated import ChatMemberShortcuts, chat_member_interaction
10
+
11
+
12
+ class ChatJoinRequestCute(BaseCute[ChatJoinRequest], ChatJoinRequest, ChatMemberShortcuts, kw_only=True):
13
+ api: ABCAPI
14
+
15
+ @property
16
+ def from_user(self) -> User:
17
+ return self.from_
18
+
19
+ @property
20
+ def user_id(self) -> int:
21
+ return self.from_user.id
22
+
23
+ @shortcut("approve_chat_join_request", executor=chat_member_interaction)
24
+ async def approve(
25
+ self,
26
+ chat_id: int | str | None = None,
27
+ user_id: int | None = None,
28
+ **other: typing.Any,
29
+ ) -> Result[bool, APIError]:
30
+ """Shortcut `API.approve_chat_join_request()`, see the [documentation](https://core.telegram.org/bots/api#approvechatjoinrequest)
31
+
32
+ Use this method to approve a chat join request. The bot must be an administrator
33
+ in the chat for this to work and must have the can_invite_users administrator
34
+ right. Returns True on success.
35
+
36
+ :param chat_id: Unique identifier for the target chat or username of the target channel \
37
+ (in the format @channelusername).
38
+
39
+ :param user_id: Unique identifier of the target user.
40
+ """
41
+
42
+ ...
43
+
44
+ @shortcut("decline_chat_join_request", executor=chat_member_interaction)
45
+ async def decline(
46
+ self,
47
+ chat_id: int | str | None = None,
48
+ user_id: int | None = None,
49
+ **other: typing.Any,
50
+ ) -> Result[bool, APIError]:
51
+ """Shortcut `API.decline_chat_join_request()`, see the [documentation](https://core.telegram.org/bots/api#declinechatjoinrequest)
52
+
53
+ Use this method to decline a chat join request. The bot must be an administrator
54
+ in the chat for this to work and must have the can_invite_users administrator
55
+ right. Returns True on success.
56
+
57
+ :param chat_id: Unique identifier for the target chat or username of the target channel \
58
+ (in the format @channelusername).
59
+
60
+ :param user_id: Unique identifier of the target user.
61
+ """
62
+
63
+ ...