telegrinder 0.3.4__py3-none-any.whl → 0.4.0__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.
- telegrinder/__init__.py +148 -149
- telegrinder/api/__init__.py +9 -8
- telegrinder/api/api.py +101 -93
- telegrinder/api/error.py +20 -16
- telegrinder/api/response.py +20 -20
- telegrinder/api/token.py +36 -36
- telegrinder/bot/__init__.py +72 -66
- telegrinder/bot/bot.py +83 -76
- telegrinder/bot/cute_types/__init__.py +19 -17
- telegrinder/bot/cute_types/base.py +184 -258
- telegrinder/bot/cute_types/callback_query.py +400 -385
- telegrinder/bot/cute_types/chat_join_request.py +62 -61
- telegrinder/bot/cute_types/chat_member_updated.py +157 -160
- telegrinder/bot/cute_types/inline_query.py +44 -43
- telegrinder/bot/cute_types/message.py +2590 -2637
- telegrinder/bot/cute_types/pre_checkout_query.py +42 -0
- telegrinder/bot/cute_types/update.py +112 -104
- telegrinder/bot/cute_types/utils.py +62 -95
- telegrinder/bot/dispatch/__init__.py +59 -55
- telegrinder/bot/dispatch/abc.py +76 -77
- telegrinder/bot/dispatch/context.py +96 -98
- telegrinder/bot/dispatch/dispatch.py +254 -202
- telegrinder/bot/dispatch/handler/__init__.py +13 -13
- telegrinder/bot/dispatch/handler/abc.py +23 -24
- telegrinder/bot/dispatch/handler/audio_reply.py +44 -44
- telegrinder/bot/dispatch/handler/base.py +57 -57
- telegrinder/bot/dispatch/handler/document_reply.py +44 -44
- telegrinder/bot/dispatch/handler/func.py +129 -135
- telegrinder/bot/dispatch/handler/media_group_reply.py +44 -43
- telegrinder/bot/dispatch/handler/message_reply.py +36 -36
- telegrinder/bot/dispatch/handler/photo_reply.py +44 -44
- telegrinder/bot/dispatch/handler/sticker_reply.py +37 -37
- telegrinder/bot/dispatch/handler/video_reply.py +44 -44
- telegrinder/bot/dispatch/middleware/__init__.py +3 -3
- telegrinder/bot/dispatch/middleware/abc.py +97 -22
- telegrinder/bot/dispatch/middleware/global_middleware.py +70 -0
- telegrinder/bot/dispatch/process.py +151 -157
- telegrinder/bot/dispatch/return_manager/__init__.py +15 -13
- telegrinder/bot/dispatch/return_manager/abc.py +104 -108
- telegrinder/bot/dispatch/return_manager/callback_query.py +20 -20
- telegrinder/bot/dispatch/return_manager/inline_query.py +15 -15
- telegrinder/bot/dispatch/return_manager/message.py +36 -36
- telegrinder/bot/dispatch/return_manager/pre_checkout_query.py +20 -0
- telegrinder/bot/dispatch/view/__init__.py +15 -13
- telegrinder/bot/dispatch/view/abc.py +45 -41
- telegrinder/bot/dispatch/view/base.py +231 -200
- telegrinder/bot/dispatch/view/box.py +140 -129
- telegrinder/bot/dispatch/view/callback_query.py +16 -17
- telegrinder/bot/dispatch/view/chat_join_request.py +11 -16
- telegrinder/bot/dispatch/view/chat_member.py +37 -39
- telegrinder/bot/dispatch/view/inline_query.py +16 -17
- telegrinder/bot/dispatch/view/message.py +43 -44
- telegrinder/bot/dispatch/view/pre_checkout_query.py +16 -0
- telegrinder/bot/dispatch/view/raw.py +116 -114
- telegrinder/bot/dispatch/waiter_machine/__init__.py +17 -17
- telegrinder/bot/dispatch/waiter_machine/actions.py +14 -13
- telegrinder/bot/dispatch/waiter_machine/hasher/__init__.py +8 -8
- telegrinder/bot/dispatch/waiter_machine/hasher/callback.py +55 -55
- telegrinder/bot/dispatch/waiter_machine/hasher/hasher.py +59 -57
- telegrinder/bot/dispatch/waiter_machine/hasher/message.py +51 -51
- telegrinder/bot/dispatch/waiter_machine/hasher/state.py +20 -19
- telegrinder/bot/dispatch/waiter_machine/machine.py +251 -172
- telegrinder/bot/dispatch/waiter_machine/middleware.py +94 -89
- telegrinder/bot/dispatch/waiter_machine/short_state.py +57 -68
- telegrinder/bot/polling/__init__.py +4 -4
- telegrinder/bot/polling/abc.py +25 -25
- telegrinder/bot/polling/polling.py +139 -131
- telegrinder/bot/rules/__init__.py +85 -62
- telegrinder/bot/rules/abc.py +213 -206
- telegrinder/bot/rules/callback_data.py +122 -163
- telegrinder/bot/rules/chat_join.py +45 -43
- telegrinder/bot/rules/command.py +126 -126
- telegrinder/bot/rules/enum_text.py +33 -36
- telegrinder/bot/rules/func.py +28 -26
- telegrinder/bot/rules/fuzzy.py +24 -24
- telegrinder/bot/rules/id.py +24 -0
- telegrinder/bot/rules/inline.py +58 -56
- telegrinder/bot/rules/integer.py +21 -20
- telegrinder/bot/rules/is_from.py +127 -127
- telegrinder/bot/rules/logic.py +18 -0
- telegrinder/bot/rules/markup.py +42 -43
- telegrinder/bot/rules/mention.py +14 -14
- telegrinder/bot/rules/message.py +15 -17
- telegrinder/bot/rules/message_entities.py +33 -35
- telegrinder/bot/rules/node.py +33 -27
- telegrinder/bot/rules/payload.py +81 -0
- telegrinder/bot/rules/payment_invoice.py +29 -0
- telegrinder/bot/rules/regex.py +36 -37
- telegrinder/bot/rules/rule_enum.py +72 -72
- telegrinder/bot/rules/start.py +42 -42
- telegrinder/bot/rules/state.py +35 -37
- telegrinder/bot/rules/text.py +38 -33
- telegrinder/bot/rules/update.py +15 -15
- telegrinder/bot/scenario/__init__.py +5 -5
- telegrinder/bot/scenario/abc.py +17 -19
- telegrinder/bot/scenario/checkbox.py +174 -176
- telegrinder/bot/scenario/choice.py +48 -51
- telegrinder/client/__init__.py +12 -4
- telegrinder/client/abc.py +100 -75
- telegrinder/client/aiohttp.py +134 -130
- telegrinder/client/form_data.py +31 -0
- telegrinder/client/sonic.py +212 -0
- telegrinder/model.py +208 -315
- telegrinder/modules.py +239 -237
- telegrinder/msgspec_json.py +14 -14
- telegrinder/msgspec_utils.py +478 -410
- telegrinder/node/__init__.py +86 -25
- telegrinder/node/attachment.py +163 -87
- telegrinder/node/base.py +288 -160
- telegrinder/node/callback_query.py +54 -53
- telegrinder/node/command.py +34 -33
- telegrinder/node/composer.py +163 -198
- telegrinder/node/container.py +33 -27
- telegrinder/node/either.py +82 -0
- telegrinder/node/event.py +54 -65
- telegrinder/node/file.py +51 -0
- telegrinder/node/me.py +15 -16
- telegrinder/node/payload.py +78 -0
- telegrinder/node/polymorphic.py +67 -48
- telegrinder/node/rule.py +72 -76
- telegrinder/node/scope.py +36 -38
- telegrinder/node/source.py +87 -71
- telegrinder/node/text.py +53 -41
- telegrinder/node/tools/__init__.py +3 -3
- telegrinder/node/tools/generator.py +36 -40
- telegrinder/py.typed +0 -0
- telegrinder/rules.py +1 -62
- telegrinder/tools/__init__.py +152 -93
- telegrinder/tools/adapter/__init__.py +19 -0
- telegrinder/tools/adapter/abc.py +49 -0
- telegrinder/tools/adapter/dataclass.py +56 -0
- telegrinder/{bot/rules → tools}/adapter/errors.py +5 -5
- telegrinder/{bot/rules → tools}/adapter/event.py +63 -65
- telegrinder/{bot/rules → tools}/adapter/node.py +46 -48
- telegrinder/{bot/rules → tools}/adapter/raw_event.py +27 -27
- telegrinder/{bot/rules → tools}/adapter/raw_update.py +30 -30
- telegrinder/tools/buttons.py +106 -80
- telegrinder/tools/callback_data_serilization/__init__.py +5 -0
- telegrinder/tools/callback_data_serilization/abc.py +51 -0
- telegrinder/tools/callback_data_serilization/json_ser.py +60 -0
- telegrinder/tools/callback_data_serilization/msgpack_ser.py +172 -0
- telegrinder/tools/error_handler/__init__.py +7 -7
- telegrinder/tools/error_handler/abc.py +30 -33
- telegrinder/tools/error_handler/error.py +9 -9
- telegrinder/tools/error_handler/error_handler.py +179 -193
- telegrinder/tools/formatting/__init__.py +83 -63
- telegrinder/tools/formatting/deep_links.py +541 -0
- telegrinder/tools/formatting/{html.py → html_formatter.py} +266 -294
- telegrinder/tools/formatting/spec_html_formats.py +71 -117
- telegrinder/tools/functional.py +8 -12
- telegrinder/tools/global_context/__init__.py +7 -7
- telegrinder/tools/global_context/abc.py +63 -63
- telegrinder/tools/global_context/global_context.py +387 -412
- telegrinder/tools/global_context/telegrinder_ctx.py +27 -27
- telegrinder/tools/i18n/__init__.py +7 -7
- telegrinder/tools/i18n/abc.py +30 -30
- telegrinder/tools/i18n/middleware/__init__.py +3 -3
- telegrinder/tools/i18n/middleware/abc.py +22 -25
- telegrinder/tools/i18n/simple.py +43 -43
- telegrinder/tools/input_file_directory.py +30 -0
- telegrinder/tools/keyboard.py +128 -128
- telegrinder/tools/lifespan.py +105 -0
- telegrinder/tools/limited_dict.py +32 -37
- telegrinder/tools/loop_wrapper/__init__.py +4 -4
- telegrinder/tools/loop_wrapper/abc.py +20 -15
- telegrinder/tools/loop_wrapper/loop_wrapper.py +169 -224
- telegrinder/tools/magic.py +307 -157
- telegrinder/tools/parse_mode.py +6 -6
- telegrinder/tools/state_storage/__init__.py +4 -4
- telegrinder/tools/state_storage/abc.py +31 -35
- telegrinder/tools/state_storage/memory.py +25 -25
- telegrinder/tools/strings.py +13 -0
- telegrinder/types/__init__.py +268 -260
- telegrinder/types/enums.py +711 -701
- telegrinder/types/input_file.py +51 -0
- telegrinder/types/methods.py +5055 -4633
- telegrinder/types/objects.py +7058 -6950
- telegrinder/verification_utils.py +30 -32
- {telegrinder-0.3.4.dist-info → telegrinder-0.4.0.dist-info}/LICENSE +22 -22
- telegrinder-0.4.0.dist-info/METADATA +144 -0
- telegrinder-0.4.0.dist-info/RECORD +182 -0
- {telegrinder-0.3.4.dist-info → telegrinder-0.4.0.dist-info}/WHEEL +1 -1
- telegrinder/bot/rules/adapter/__init__.py +0 -17
- telegrinder/bot/rules/adapter/abc.py +0 -31
- telegrinder/node/message.py +0 -14
- telegrinder/node/update.py +0 -15
- telegrinder/tools/formatting/links.py +0 -38
- telegrinder/tools/kb_set/__init__.py +0 -4
- telegrinder/tools/kb_set/base.py +0 -15
- telegrinder/tools/kb_set/yaml.py +0 -63
- telegrinder-0.3.4.dist-info/METADATA +0 -110
- telegrinder-0.3.4.dist-info/RECORD +0 -165
telegrinder/api/token.py
CHANGED
|
@@ -1,36 +1,36 @@
|
|
|
1
|
-
import pathlib
|
|
2
|
-
import typing
|
|
3
|
-
from functools import cached_property
|
|
4
|
-
|
|
5
|
-
from envparse import env
|
|
6
|
-
|
|
7
|
-
from .error import InvalidTokenError
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
class Token(str):
|
|
11
|
-
def __new__(cls, token: str) -> typing.Self:
|
|
12
|
-
if token.count(":") != 1 or not token.split(":")[0].isdigit():
|
|
13
|
-
raise InvalidTokenError("Invalid token, it should look like this
|
|
14
|
-
return super().__new__(cls, token)
|
|
15
|
-
|
|
16
|
-
def __repr__(self) -> str:
|
|
17
|
-
return f"<Token: {self.bot_id}:{''.join(self.split(':')[-1])[:6]}...>"
|
|
18
|
-
|
|
19
|
-
@classmethod
|
|
20
|
-
def from_env(
|
|
21
|
-
cls,
|
|
22
|
-
var_name: str = "BOT_TOKEN",
|
|
23
|
-
*,
|
|
24
|
-
is_read: bool = False,
|
|
25
|
-
path_to_envfile: str | pathlib.Path | None = None,
|
|
26
|
-
) -> typing.Self:
|
|
27
|
-
if not is_read:
|
|
28
|
-
env.read_envfile(path_to_envfile)
|
|
29
|
-
return cls(env.str(var_name))
|
|
30
|
-
|
|
31
|
-
@cached_property
|
|
32
|
-
def bot_id(self) -> int:
|
|
33
|
-
return int(self.split(":")[0])
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
__all__ = ("Token",)
|
|
1
|
+
import pathlib
|
|
2
|
+
import typing
|
|
3
|
+
from functools import cached_property
|
|
4
|
+
|
|
5
|
+
from envparse import env
|
|
6
|
+
|
|
7
|
+
from .error import InvalidTokenError
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class Token(str):
|
|
11
|
+
def __new__(cls, token: str, /) -> typing.Self:
|
|
12
|
+
if token.count(":") != 1 or not token.split(":")[0].isdigit():
|
|
13
|
+
raise InvalidTokenError("Invalid token, it should look like this: 12345:ABCdef")
|
|
14
|
+
return super().__new__(cls, token)
|
|
15
|
+
|
|
16
|
+
def __repr__(self) -> str:
|
|
17
|
+
return f"<Token: {self.bot_id}:{''.join(self.split(':')[-1])[:6]}...>"
|
|
18
|
+
|
|
19
|
+
@classmethod
|
|
20
|
+
def from_env(
|
|
21
|
+
cls,
|
|
22
|
+
var_name: str = "BOT_TOKEN",
|
|
23
|
+
*,
|
|
24
|
+
is_read: bool = False,
|
|
25
|
+
path_to_envfile: str | pathlib.Path | None = None,
|
|
26
|
+
) -> typing.Self:
|
|
27
|
+
if not is_read:
|
|
28
|
+
env.read_envfile(path_to_envfile)
|
|
29
|
+
return cls(env.str(var_name))
|
|
30
|
+
|
|
31
|
+
@cached_property
|
|
32
|
+
def bot_id(self) -> int:
|
|
33
|
+
return int(self.split(":")[0])
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
__all__ = ("Token",)
|
telegrinder/bot/__init__.py
CHANGED
|
@@ -1,67 +1,70 @@
|
|
|
1
|
-
from telegrinder.bot.bot import Telegrinder
|
|
2
|
-
from telegrinder.bot.cute_types import (
|
|
3
|
-
BaseCute,
|
|
4
|
-
CallbackQueryCute,
|
|
5
|
-
ChatJoinRequestCute,
|
|
6
|
-
ChatMemberUpdatedCute,
|
|
7
|
-
InlineQueryCute,
|
|
8
|
-
MessageCute,
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
1
|
+
from telegrinder.bot.bot import Telegrinder
|
|
2
|
+
from telegrinder.bot.cute_types import (
|
|
3
|
+
BaseCute,
|
|
4
|
+
CallbackQueryCute,
|
|
5
|
+
ChatJoinRequestCute,
|
|
6
|
+
ChatMemberUpdatedCute,
|
|
7
|
+
InlineQueryCute,
|
|
8
|
+
MessageCute,
|
|
9
|
+
PreCheckoutQueryCute,
|
|
10
|
+
UpdateCute,
|
|
11
|
+
)
|
|
12
|
+
from telegrinder.bot.dispatch import (
|
|
13
|
+
CALLBACK_QUERY_FOR_MESSAGE,
|
|
14
|
+
CALLBACK_QUERY_FROM_CHAT,
|
|
15
|
+
CALLBACK_QUERY_IN_CHAT_FOR_MESSAGE,
|
|
16
|
+
MESSAGE_FROM_USER,
|
|
17
|
+
MESSAGE_FROM_USER_IN_CHAT,
|
|
18
|
+
MESSAGE_IN_CHAT,
|
|
19
|
+
ABCDispatch,
|
|
20
|
+
ABCHandler,
|
|
21
|
+
ABCMiddleware,
|
|
22
|
+
ABCReturnManager,
|
|
23
|
+
ABCStateView,
|
|
24
|
+
ABCView,
|
|
25
|
+
AudioReplyHandler,
|
|
26
|
+
BaseReturnManager,
|
|
27
|
+
BaseStateView,
|
|
28
|
+
BaseView,
|
|
29
|
+
CallbackQueryReturnManager,
|
|
30
|
+
CallbackQueryView,
|
|
31
|
+
ChatJoinRequestView,
|
|
32
|
+
ChatMemberView,
|
|
33
|
+
Context,
|
|
34
|
+
Dispatch,
|
|
35
|
+
DocumentReplyHandler,
|
|
36
|
+
FuncHandler,
|
|
37
|
+
Hasher,
|
|
38
|
+
InlineQueryReturnManager,
|
|
39
|
+
Manager,
|
|
40
|
+
MediaGroupReplyHandler,
|
|
41
|
+
MessageReplyHandler,
|
|
42
|
+
MessageReturnManager,
|
|
43
|
+
MessageView,
|
|
44
|
+
PhotoReplyHandler,
|
|
45
|
+
PreCheckoutQueryManager,
|
|
46
|
+
PreCheckoutQueryView,
|
|
47
|
+
RawEventView,
|
|
48
|
+
ShortState,
|
|
49
|
+
StateViewHasher,
|
|
50
|
+
StickerReplyHandler,
|
|
51
|
+
VideoReplyHandler,
|
|
52
|
+
ViewBox,
|
|
53
|
+
WaiterMachine,
|
|
54
|
+
clear_wm_storage_worker,
|
|
55
|
+
register_manager,
|
|
56
|
+
)
|
|
57
|
+
from telegrinder.bot.polling import ABCPolling, Polling
|
|
58
|
+
from telegrinder.bot.rules import (
|
|
59
|
+
ABCRule,
|
|
60
|
+
CallbackQueryRule,
|
|
61
|
+
ChatJoinRequestRule,
|
|
62
|
+
InlineQueryRule,
|
|
63
|
+
MessageRule,
|
|
64
|
+
)
|
|
65
|
+
from telegrinder.bot.scenario import ABCScenario, Checkbox, Choice
|
|
66
|
+
|
|
67
|
+
__all__ = (
|
|
65
68
|
"ABCDispatch",
|
|
66
69
|
"ABCHandler",
|
|
67
70
|
"ABCMiddleware",
|
|
@@ -110,6 +113,9 @@ __all__ = (
|
|
|
110
113
|
"MessageView",
|
|
111
114
|
"PhotoReplyHandler",
|
|
112
115
|
"Polling",
|
|
116
|
+
"PreCheckoutQueryCute",
|
|
117
|
+
"PreCheckoutQueryManager",
|
|
118
|
+
"PreCheckoutQueryView",
|
|
113
119
|
"RawEventView",
|
|
114
120
|
"ShortState",
|
|
115
121
|
"StateViewHasher",
|
|
@@ -120,5 +126,5 @@ __all__ = (
|
|
|
120
126
|
"ViewBox",
|
|
121
127
|
"WaiterMachine",
|
|
122
128
|
"clear_wm_storage_worker",
|
|
123
|
-
"register_manager",
|
|
124
|
-
)
|
|
129
|
+
"register_manager",
|
|
130
|
+
)
|
telegrinder/bot/bot.py
CHANGED
|
@@ -1,76 +1,83 @@
|
|
|
1
|
-
import typing_extensions as typing
|
|
2
|
-
|
|
3
|
-
from telegrinder.api.api import API
|
|
4
|
-
from telegrinder.bot.dispatch
|
|
5
|
-
from telegrinder.bot.dispatch.
|
|
6
|
-
from telegrinder.bot.polling
|
|
7
|
-
from telegrinder.bot.polling.
|
|
8
|
-
from telegrinder.modules import logger
|
|
9
|
-
from telegrinder.tools.loop_wrapper import ABCLoopWrapper
|
|
10
|
-
from telegrinder.tools.loop_wrapper
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
class Telegrinder(typing.Generic[
|
|
18
|
-
def __init__(
|
|
19
|
-
self,
|
|
20
|
-
api: API,
|
|
21
|
-
*,
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
loop_wrapper:
|
|
25
|
-
) -> None:
|
|
26
|
-
self.api = api
|
|
27
|
-
self.dispatch = typing.cast(
|
|
28
|
-
self.polling = typing.cast(
|
|
29
|
-
self.loop_wrapper = typing.cast(
|
|
30
|
-
|
|
31
|
-
def __repr__(self) -> str:
|
|
32
|
-
return "<{}: api={!r}, dispatch={!r}, polling={!r}, loop_wrapper={!r}>".format(
|
|
33
|
-
self.__class__.__name__,
|
|
34
|
-
self.api,
|
|
35
|
-
self.dispatch,
|
|
36
|
-
self.polling,
|
|
37
|
-
self.loop_wrapper,
|
|
38
|
-
)
|
|
39
|
-
|
|
40
|
-
@property
|
|
41
|
-
def on(self) ->
|
|
42
|
-
return self.dispatch
|
|
43
|
-
|
|
44
|
-
async def reset_webhook(self) -> None:
|
|
45
|
-
if not (await self.api.get_webhook_info()).unwrap().url:
|
|
46
|
-
return
|
|
47
|
-
await self.api.delete_webhook()
|
|
48
|
-
|
|
49
|
-
async def run_polling(
|
|
50
|
-
self,
|
|
51
|
-
*,
|
|
52
|
-
offset: int = 0,
|
|
53
|
-
skip_updates: bool = False,
|
|
54
|
-
) ->
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
for
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
1
|
+
import typing_extensions as typing
|
|
2
|
+
|
|
3
|
+
from telegrinder.api.api import API, HTTPClient
|
|
4
|
+
from telegrinder.bot.dispatch import dispatch as dp
|
|
5
|
+
from telegrinder.bot.dispatch.abc import ABCDispatch
|
|
6
|
+
from telegrinder.bot.polling import polling as pg
|
|
7
|
+
from telegrinder.bot.polling.abc import ABCPolling
|
|
8
|
+
from telegrinder.modules import logger
|
|
9
|
+
from telegrinder.tools.loop_wrapper import ABCLoopWrapper
|
|
10
|
+
from telegrinder.tools.loop_wrapper import loop_wrapper as lw
|
|
11
|
+
|
|
12
|
+
Dispatch = typing.TypeVar("Dispatch", bound=ABCDispatch, default=dp.Dispatch[HTTPClient])
|
|
13
|
+
Polling = typing.TypeVar("Polling", bound=ABCPolling, default=pg.Polling[HTTPClient])
|
|
14
|
+
LoopWrapper = typing.TypeVar("LoopWrapper", bound=ABCLoopWrapper, default=lw.LoopWrapper)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class Telegrinder(typing.Generic[HTTPClient, Dispatch, Polling, LoopWrapper]):
|
|
18
|
+
def __init__(
|
|
19
|
+
self,
|
|
20
|
+
api: API[HTTPClient],
|
|
21
|
+
*,
|
|
22
|
+
dispatch: Dispatch | None = None,
|
|
23
|
+
polling: Polling | None = None,
|
|
24
|
+
loop_wrapper: LoopWrapper | None = None,
|
|
25
|
+
) -> None:
|
|
26
|
+
self.api = api
|
|
27
|
+
self.dispatch = typing.cast(Dispatch, dispatch or dp.Dispatch())
|
|
28
|
+
self.polling = typing.cast(Polling, polling or pg.Polling(api))
|
|
29
|
+
self.loop_wrapper = typing.cast(LoopWrapper, loop_wrapper or lw.LoopWrapper())
|
|
30
|
+
|
|
31
|
+
def __repr__(self) -> str:
|
|
32
|
+
return "<{}: api={!r}, dispatch={!r}, polling={!r}, loop_wrapper={!r}>".format(
|
|
33
|
+
self.__class__.__name__,
|
|
34
|
+
self.api,
|
|
35
|
+
self.dispatch,
|
|
36
|
+
self.polling,
|
|
37
|
+
self.loop_wrapper,
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
@property
|
|
41
|
+
def on(self) -> Dispatch:
|
|
42
|
+
return self.dispatch
|
|
43
|
+
|
|
44
|
+
async def reset_webhook(self) -> None:
|
|
45
|
+
if not (await self.api.get_webhook_info()).unwrap().url:
|
|
46
|
+
return
|
|
47
|
+
await self.api.delete_webhook()
|
|
48
|
+
|
|
49
|
+
async def run_polling(
|
|
50
|
+
self,
|
|
51
|
+
*,
|
|
52
|
+
offset: int = 0,
|
|
53
|
+
skip_updates: bool = False,
|
|
54
|
+
) -> typing.NoReturn:
|
|
55
|
+
async def polling() -> typing.NoReturn:
|
|
56
|
+
if skip_updates:
|
|
57
|
+
logger.debug("Dropping pending updates")
|
|
58
|
+
await self.reset_webhook()
|
|
59
|
+
await self.api.delete_webhook(drop_pending_updates=True)
|
|
60
|
+
self.polling.offset = offset
|
|
61
|
+
|
|
62
|
+
async for updates in self.polling.listen():
|
|
63
|
+
for update in updates:
|
|
64
|
+
logger.debug(
|
|
65
|
+
"Received update (update_id={}, update_type={!r})",
|
|
66
|
+
update.update_id,
|
|
67
|
+
update.update_type.name,
|
|
68
|
+
)
|
|
69
|
+
self.loop_wrapper.add_task(self.dispatch.feed(update, self.api))
|
|
70
|
+
|
|
71
|
+
if self.loop_wrapper.is_running:
|
|
72
|
+
await polling()
|
|
73
|
+
else:
|
|
74
|
+
self.loop_wrapper.add_task(polling())
|
|
75
|
+
self.loop_wrapper.run_event_loop()
|
|
76
|
+
|
|
77
|
+
def run_forever(self, *, offset: int = 0, skip_updates: bool = False) -> typing.NoReturn:
|
|
78
|
+
logger.debug("Running blocking polling (id={})", self.api.id)
|
|
79
|
+
self.loop_wrapper.add_task(self.run_polling(offset=offset, skip_updates=skip_updates))
|
|
80
|
+
self.loop_wrapper.run_event_loop()
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
__all__ = ("Telegrinder",)
|
|
@@ -1,17 +1,19 @@
|
|
|
1
|
-
from telegrinder.bot.cute_types.base import BaseCute
|
|
2
|
-
from telegrinder.bot.cute_types.callback_query import CallbackQueryCute
|
|
3
|
-
from telegrinder.bot.cute_types.chat_join_request import ChatJoinRequestCute
|
|
4
|
-
from telegrinder.bot.cute_types.chat_member_updated import ChatMemberUpdatedCute
|
|
5
|
-
from telegrinder.bot.cute_types.inline_query import InlineQueryCute
|
|
6
|
-
from telegrinder.bot.cute_types.message import MessageCute
|
|
7
|
-
from telegrinder.bot.cute_types.
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
"
|
|
12
|
-
"
|
|
13
|
-
"
|
|
14
|
-
"
|
|
15
|
-
"
|
|
16
|
-
"
|
|
17
|
-
|
|
1
|
+
from telegrinder.bot.cute_types.base import BaseCute
|
|
2
|
+
from telegrinder.bot.cute_types.callback_query import CallbackQueryCute
|
|
3
|
+
from telegrinder.bot.cute_types.chat_join_request import ChatJoinRequestCute
|
|
4
|
+
from telegrinder.bot.cute_types.chat_member_updated import ChatMemberUpdatedCute
|
|
5
|
+
from telegrinder.bot.cute_types.inline_query import InlineQueryCute
|
|
6
|
+
from telegrinder.bot.cute_types.message import MessageCute
|
|
7
|
+
from telegrinder.bot.cute_types.pre_checkout_query import PreCheckoutQueryCute
|
|
8
|
+
from telegrinder.bot.cute_types.update import UpdateCute
|
|
9
|
+
|
|
10
|
+
__all__ = (
|
|
11
|
+
"BaseCute",
|
|
12
|
+
"CallbackQueryCute",
|
|
13
|
+
"ChatJoinRequestCute",
|
|
14
|
+
"ChatMemberUpdatedCute",
|
|
15
|
+
"InlineQueryCute",
|
|
16
|
+
"MessageCute",
|
|
17
|
+
"PreCheckoutQueryCute",
|
|
18
|
+
"UpdateCute",
|
|
19
|
+
)
|