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.
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/PKG-INFO +1 -1
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/pyproject.toml +5 -5
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/__init__.py +58 -0
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/api/abc.py +1 -1
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/api/api.py +8 -6
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/api/error.py +2 -3
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/__init__.py +14 -0
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/bot.py +13 -2
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/cute_types/__init__.py +4 -0
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/cute_types/base.py +22 -13
- telegrinder-0.1.dev166/telegrinder/bot/cute_types/chat_join_request.py +63 -0
- telegrinder-0.1.dev166/telegrinder/bot/cute_types/chat_member_updated.py +244 -0
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/cute_types/message.py +33 -6
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/cute_types/update.py +5 -4
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/cute_types/utils.py +39 -17
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/dispatch/__init__.py +9 -1
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/dispatch/composition.py +10 -8
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/dispatch/context.py +9 -10
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/dispatch/dispatch.py +29 -19
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/dispatch/handler/abc.py +1 -0
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/dispatch/handler/func.py +29 -6
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/dispatch/handler/message_reply.py +2 -3
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/dispatch/middleware/abc.py +2 -4
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/dispatch/process.py +4 -3
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/dispatch/return_manager/__init__.py +1 -1
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/dispatch/return_manager/abc.py +39 -21
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/dispatch/return_manager/callback_query.py +4 -2
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/dispatch/return_manager/inline_query.py +4 -2
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/dispatch/return_manager/message.py +12 -6
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/dispatch/view/__init__.py +8 -2
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/dispatch/view/abc.py +26 -20
- telegrinder-0.1.dev166/telegrinder/bot/dispatch/view/box.py +110 -0
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/dispatch/view/callback_query.py +1 -3
- telegrinder-0.1.dev166/telegrinder/bot/dispatch/view/chat_join_request.py +17 -0
- telegrinder-0.1.dev166/telegrinder/bot/dispatch/view/chat_member.py +26 -0
- telegrinder-0.1.dev166/telegrinder/bot/dispatch/view/message.py +40 -0
- telegrinder-0.1.dev166/telegrinder/bot/dispatch/view/raw.py +116 -0
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/dispatch/waiter_machine/__init__.py +2 -1
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/dispatch/waiter_machine/machine.py +73 -19
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/dispatch/waiter_machine/middleware.py +3 -3
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/dispatch/waiter_machine/short_state.py +6 -3
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/polling/polling.py +17 -1
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/rules/__init__.py +20 -12
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/rules/abc.py +0 -9
- telegrinder-0.1.dev166/telegrinder/bot/rules/adapter/event.py +58 -0
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/rules/callback_data.py +15 -20
- telegrinder-0.1.dev166/telegrinder/bot/rules/chat_join.py +47 -0
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/rules/enum_text.py +7 -2
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/rules/inline.py +3 -3
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/rules/is_from.py +36 -50
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/rules/markup.py +1 -1
- telegrinder-0.1.dev166/telegrinder/bot/rules/message.py +17 -0
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/rules/message_entities.py +1 -1
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/rules/start.py +6 -4
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/rules/text.py +2 -1
- telegrinder-0.1.dev166/telegrinder/bot/rules/update.py +16 -0
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/scenario/checkbox.py +9 -7
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/client/aiohttp.py +4 -4
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/model.py +43 -19
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/modules.py +16 -32
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/msgspec_utils.py +48 -36
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/node/attachment.py +15 -5
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/node/base.py +24 -16
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/node/composer.py +8 -6
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/node/container.py +1 -1
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/node/rule.py +4 -4
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/node/source.py +4 -2
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/node/tools/generator.py +1 -1
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/tools/__init__.py +2 -1
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/tools/error_handler/abc.py +4 -3
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/tools/error_handler/error_handler.py +22 -16
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/tools/formatting/html.py +20 -18
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/tools/formatting/links.py +12 -6
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/tools/formatting/spec_html_formats.py +5 -6
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/tools/global_context/abc.py +5 -1
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/tools/global_context/global_context.py +2 -2
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/tools/global_context/telegrinder_ctx.py +1 -1
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/tools/i18n/base.py +4 -3
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/tools/i18n/simple.py +1 -3
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/tools/keyboard.py +1 -1
- telegrinder-0.1.dev166/telegrinder/tools/loop_wrapper/__init__.py +4 -0
- telegrinder-0.1.dev166/telegrinder/tools/loop_wrapper/abc.py +15 -0
- telegrinder-0.1.dev166/telegrinder/tools/loop_wrapper/loop_wrapper.py +186 -0
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/tools/magic.py +1 -1
- telegrinder-0.1.dev166/telegrinder/types/__init__.py +208 -0
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/types/enums.py +34 -0
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/types/methods.py +52 -47
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/types/objects.py +531 -88
- telegrinder-0.1.dev166/telegrinder/verification_utils.py +33 -0
- telegrinder-0.1.dev164/telegrinder/bot/dispatch/view/box.py +0 -39
- telegrinder-0.1.dev164/telegrinder/bot/dispatch/view/message.py +0 -18
- telegrinder-0.1.dev164/telegrinder/bot/rules/adapter/event.py +0 -49
- telegrinder-0.1.dev164/telegrinder/tools/loop_wrapper/__init__.py +0 -4
- telegrinder-0.1.dev164/telegrinder/tools/loop_wrapper/abc.py +0 -18
- telegrinder-0.1.dev164/telegrinder/tools/loop_wrapper/loop_wrapper.py +0 -132
- telegrinder-0.1.dev164/telegrinder/types/__init__.py +0 -2
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/LICENSE +0 -0
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/readme.md +0 -0
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/api/__init__.py +0 -0
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/api/response.py +0 -0
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/cute_types/callback_query.py +0 -0
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/cute_types/inline_query.py +0 -0
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/dispatch/abc.py +0 -0
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/dispatch/handler/__init__.py +0 -0
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/dispatch/middleware/__init__.py +0 -0
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/dispatch/view/inline_query.py +0 -0
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/polling/__init__.py +0 -0
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/polling/abc.py +0 -0
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/rules/adapter/__init__.py +0 -0
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/rules/adapter/abc.py +0 -0
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/rules/adapter/errors.py +0 -0
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/rules/adapter/raw_update.py +0 -0
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/rules/command.py +0 -0
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/rules/func.py +0 -0
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/rules/fuzzy.py +0 -0
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/rules/integer.py +0 -0
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/rules/mention.py +0 -0
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/rules/regex.py +0 -0
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/rules/rule_enum.py +0 -0
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/scenario/__init__.py +0 -0
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/scenario/abc.py +0 -0
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/bot/scenario/choice.py +0 -0
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/client/__init__.py +0 -0
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/client/abc.py +0 -0
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/msgspec_json.py +0 -0
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/node/__init__.py +12 -12
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/node/message.py +0 -0
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/node/text.py +0 -0
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/node/tools/__init__.py +0 -0
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/node/update.py +0 -0
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/rules.py +0 -0
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/tools/buttons.py +0 -0
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/tools/error_handler/__init__.py +0 -0
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/tools/error_handler/error.py +0 -0
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/tools/formatting/__init__.py +0 -0
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/tools/global_context/__init__.py +0 -0
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/tools/i18n/__init__.py +0 -0
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/tools/i18n/middleware/__init__.py +0 -0
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/tools/i18n/middleware/base.py +0 -0
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/tools/kb_set/__init__.py +0 -0
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/tools/kb_set/base.py +0 -0
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/tools/kb_set/yaml.py +0 -0
- {telegrinder-0.1.dev164 → telegrinder-0.1.dev166}/telegrinder/tools/parse_mode.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[tool.poetry]
|
|
2
2
|
name = "telegrinder"
|
|
3
|
-
version = "0.1.
|
|
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(
|
|
65
|
-
|
|
66
|
-
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
|
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] =
|
|
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
|
+
...
|