telegrinder 0.1.dev167__py3-none-any.whl → 0.1.dev168__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/bot/cute_types/callback_query.py +1 -1
- telegrinder/bot/dispatch/dispatch.py +4 -3
- telegrinder/bot/dispatch/handler/func.py +1 -1
- telegrinder/bot/dispatch/view/abc.py +53 -2
- telegrinder/bot/dispatch/waiter_machine/machine.py +14 -20
- telegrinder/bot/dispatch/waiter_machine/short_state.py +10 -0
- telegrinder/bot/rules/callback_data.py +9 -11
- telegrinder/bot/scenario/checkbox.py +5 -5
- telegrinder/bot/scenario/choice.py +4 -3
- telegrinder/tools/__init__.py +1 -1
- telegrinder/tools/limited_dict.py +12 -2
- telegrinder/types/methods.py +20 -89
- telegrinder/types/objects.py +12 -41
- {telegrinder-0.1.dev167.dist-info → telegrinder-0.1.dev168.dist-info}/METADATA +5 -5
- {telegrinder-0.1.dev167.dist-info → telegrinder-0.1.dev168.dist-info}/RECORD +17 -17
- {telegrinder-0.1.dev167.dist-info → telegrinder-0.1.dev168.dist-info}/LICENSE +0 -0
- {telegrinder-0.1.dev167.dist-info → telegrinder-0.1.dev168.dist-info}/WHEEL +0 -0
|
@@ -217,7 +217,7 @@ class CallbackQueryCute(BaseCute[CallbackQuery], CallbackQuery, kw_only=True, di
|
|
|
217
217
|
)
|
|
218
218
|
async def edit_text(
|
|
219
219
|
self,
|
|
220
|
-
text: str
|
|
220
|
+
text: str,
|
|
221
221
|
inline_message_id: int | None = None,
|
|
222
222
|
chat_id: int | str | None = None,
|
|
223
223
|
message_id: int | None = None,
|
|
@@ -135,7 +135,9 @@ class Dispatch(
|
|
|
135
135
|
|
|
136
136
|
async def feed(self, event: Update, api: ABCAPI) -> bool:
|
|
137
137
|
logger.debug("Processing update (update_id={})", event.update_id)
|
|
138
|
-
|
|
138
|
+
loop = asyncio.get_running_loop()
|
|
139
|
+
loop.create_task(self.raw_event.process(event, api))
|
|
140
|
+
|
|
139
141
|
for view in self.get_views().values():
|
|
140
142
|
if await view.check(event):
|
|
141
143
|
logger.debug(
|
|
@@ -143,10 +145,9 @@ class Dispatch(
|
|
|
143
145
|
event.update_id,
|
|
144
146
|
view.__class__.__name__,
|
|
145
147
|
)
|
|
146
|
-
|
|
148
|
+
loop.create_task(view.process(event, api))
|
|
147
149
|
return True
|
|
148
150
|
|
|
149
|
-
loop = asyncio.get_running_loop()
|
|
150
151
|
ctx = Context()
|
|
151
152
|
found = False
|
|
152
153
|
for handler in self.default_handlers:
|
|
@@ -46,7 +46,7 @@ class FuncHandler(ABCHandler[EventT], typing.Generic[EventT, F, ErrorHandlerT]):
|
|
|
46
46
|
self.dataclass,
|
|
47
47
|
self.error_handler,
|
|
48
48
|
)
|
|
49
|
-
|
|
49
|
+
|
|
50
50
|
async def check(self, api: ABCAPI, event: Update, ctx: Context | None = None) -> bool:
|
|
51
51
|
if self.update_type is not None and self.update_type != event.update_type.unwrap_or_none():
|
|
52
52
|
return False
|
|
@@ -67,13 +67,64 @@ class BaseView(ABCView, typing.Generic[EventType]):
|
|
|
67
67
|
return Some(generic_type)
|
|
68
68
|
return Nothing()
|
|
69
69
|
|
|
70
|
-
@
|
|
71
|
-
def get_raw_event(
|
|
70
|
+
@staticmethod
|
|
71
|
+
def get_raw_event(update: Update) -> Option[Model]:
|
|
72
72
|
match update.update_type:
|
|
73
73
|
case Some(update_type):
|
|
74
74
|
return getattr(update, update_type.value)
|
|
75
75
|
case _:
|
|
76
76
|
return Nothing()
|
|
77
|
+
|
|
78
|
+
@typing.overload
|
|
79
|
+
@classmethod
|
|
80
|
+
def to_handler(
|
|
81
|
+
cls,
|
|
82
|
+
*rules: ABCRule[EventType],
|
|
83
|
+
) -> typing.Callable[
|
|
84
|
+
[FuncType[EventType]],
|
|
85
|
+
FuncHandler[EventType, FuncType[EventType], ErrorHandler[EventType]],
|
|
86
|
+
]: ...
|
|
87
|
+
|
|
88
|
+
@typing.overload
|
|
89
|
+
@classmethod
|
|
90
|
+
def to_handler(
|
|
91
|
+
cls,
|
|
92
|
+
*rules: ABCRule[EventType],
|
|
93
|
+
error_handler: ErrorHandlerT,
|
|
94
|
+
is_blocking: bool = True,
|
|
95
|
+
) -> typing.Callable[
|
|
96
|
+
[FuncType[EventType]], FuncHandler[EventType, FuncType[EventType], ErrorHandlerT]
|
|
97
|
+
]: ...
|
|
98
|
+
|
|
99
|
+
@typing.overload
|
|
100
|
+
@classmethod
|
|
101
|
+
def to_handler(
|
|
102
|
+
cls,
|
|
103
|
+
*rules: ABCRule[EventType],
|
|
104
|
+
error_handler: typing.Literal[None] = None,
|
|
105
|
+
is_blocking: bool = True,
|
|
106
|
+
) -> typing.Callable[
|
|
107
|
+
[FuncType[EventType]],
|
|
108
|
+
FuncHandler[EventType, FuncType[EventType], ErrorHandler[EventType]],
|
|
109
|
+
]: ...
|
|
110
|
+
|
|
111
|
+
@classmethod
|
|
112
|
+
def to_handler( # type: ignore
|
|
113
|
+
cls,
|
|
114
|
+
*rules: ABCRule[EventType],
|
|
115
|
+
error_handler: ABCErrorHandler | None = None,
|
|
116
|
+
is_blocking: bool = True,
|
|
117
|
+
):
|
|
118
|
+
def wrapper(func: FuncType[EventType]):
|
|
119
|
+
return FuncHandler(
|
|
120
|
+
func,
|
|
121
|
+
list(rules),
|
|
122
|
+
is_blocking=is_blocking,
|
|
123
|
+
dataclass=None,
|
|
124
|
+
error_handler=error_handler or ErrorHandler(),
|
|
125
|
+
)
|
|
126
|
+
|
|
127
|
+
return wrapper
|
|
77
128
|
|
|
78
129
|
@typing.overload
|
|
79
130
|
def __call__(
|
|
@@ -39,7 +39,7 @@ class WaiterMachine:
|
|
|
39
39
|
) -> None:
|
|
40
40
|
view_name = state_view.__class__.__name__
|
|
41
41
|
if view_name not in self.storage:
|
|
42
|
-
raise LookupError("No record of view {!r} found".format(view_name))
|
|
42
|
+
raise LookupError("No record of view {!r} found.".format(view_name))
|
|
43
43
|
|
|
44
44
|
short_state = self.storage[view_name].pop(id, None)
|
|
45
45
|
if short_state is None:
|
|
@@ -49,13 +49,7 @@ class WaiterMachine:
|
|
|
49
49
|
)
|
|
50
50
|
)
|
|
51
51
|
|
|
52
|
-
|
|
53
|
-
typing.Iterable[asyncio.Future[typing.Any]],
|
|
54
|
-
short_state.event._waiters, # type: ignore
|
|
55
|
-
)
|
|
56
|
-
for future in waiters:
|
|
57
|
-
future.cancel()
|
|
58
|
-
|
|
52
|
+
short_state.cancel()
|
|
59
53
|
await self.call_behaviour(
|
|
60
54
|
state_view,
|
|
61
55
|
short_state.event,
|
|
@@ -69,9 +63,9 @@ class WaiterMachine:
|
|
|
69
63
|
state_view: "BaseStateView[EventModel]",
|
|
70
64
|
linked: EventModel | tuple[ABCAPI, Identificator],
|
|
71
65
|
*rules: ABCRule[EventModel],
|
|
72
|
-
default: Behaviour = None,
|
|
73
|
-
on_drop: Behaviour = None,
|
|
74
|
-
expiration: datetime.timedelta |
|
|
66
|
+
default: Behaviour[EventModel] | None = None,
|
|
67
|
+
on_drop: Behaviour[EventModel] | None = None,
|
|
68
|
+
expiration: datetime.timedelta | float | None = None,
|
|
75
69
|
) -> tuple[EventModel, Context]:
|
|
76
70
|
if isinstance(expiration, int | float):
|
|
77
71
|
expiration = datetime.timedelta(seconds=expiration)
|
|
@@ -86,6 +80,7 @@ class WaiterMachine:
|
|
|
86
80
|
if not key:
|
|
87
81
|
raise RuntimeError("Unable to get state key.")
|
|
88
82
|
|
|
83
|
+
view_name = state_view.__class__.__name__
|
|
89
84
|
event = asyncio.Event()
|
|
90
85
|
short_state = ShortState(
|
|
91
86
|
key,
|
|
@@ -96,17 +91,17 @@ class WaiterMachine:
|
|
|
96
91
|
default_behaviour=default,
|
|
97
92
|
on_drop_behaviour=on_drop,
|
|
98
93
|
)
|
|
99
|
-
|
|
94
|
+
|
|
100
95
|
if view_name not in self.storage:
|
|
101
96
|
state_view.middlewares.insert(0, WaiterMiddleware(self, state_view))
|
|
102
97
|
self.storage[view_name] = LimitedDict()
|
|
103
98
|
|
|
104
|
-
self.storage[view_name]
|
|
99
|
+
if (deleted_short_state := self.storage[view_name].set(key, short_state)) is not None:
|
|
100
|
+
deleted_short_state.cancel()
|
|
101
|
+
|
|
105
102
|
await event.wait()
|
|
106
|
-
|
|
107
|
-
e, ctx = getattr(event, "context")
|
|
108
103
|
self.storage[view_name].pop(key, None)
|
|
109
|
-
return
|
|
104
|
+
return getattr(event, "context")
|
|
110
105
|
|
|
111
106
|
async def call_behaviour(
|
|
112
107
|
self,
|
|
@@ -118,8 +113,10 @@ class WaiterMachine:
|
|
|
118
113
|
) -> None:
|
|
119
114
|
# TODO: support param view as a behaviour
|
|
120
115
|
|
|
121
|
-
|
|
116
|
+
if behaviour is None:
|
|
117
|
+
return
|
|
122
118
|
|
|
119
|
+
ctx = Context(**context)
|
|
123
120
|
if isinstance(event, asyncio.Event):
|
|
124
121
|
event, preset_ctx = typing.cast(
|
|
125
122
|
tuple[EventModel, Context],
|
|
@@ -127,9 +124,6 @@ class WaiterMachine:
|
|
|
127
124
|
)
|
|
128
125
|
ctx.update(preset_ctx)
|
|
129
126
|
|
|
130
|
-
if behaviour is None:
|
|
131
|
-
return
|
|
132
|
-
|
|
133
127
|
if await behaviour.check(event.api, update, ctx):
|
|
134
128
|
await behaviour.run(event, ctx)
|
|
135
129
|
|
|
@@ -34,6 +34,16 @@ class ShortState(typing.Generic[EventModel]):
|
|
|
34
34
|
|
|
35
35
|
def __post_init__(self, expiration: datetime.timedelta | None = None) -> None:
|
|
36
36
|
self.expiration_date = (datetime.datetime.now() - expiration) if expiration is not None else None
|
|
37
|
+
|
|
38
|
+
def cancel(self) -> None:
|
|
39
|
+
"""Cancel schedule waiters."""
|
|
40
|
+
|
|
41
|
+
waiters = typing.cast(
|
|
42
|
+
typing.Iterable[asyncio.Future[typing.Any]],
|
|
43
|
+
self.event._waiters, # type: ignore
|
|
44
|
+
)
|
|
45
|
+
for future in waiters:
|
|
46
|
+
future.cancel()
|
|
37
47
|
|
|
38
48
|
|
|
39
49
|
__all__ = ("ShortState",)
|
|
@@ -16,10 +16,8 @@ from .markup import Markup, PatternLike, check_string
|
|
|
16
16
|
|
|
17
17
|
CallbackQuery: typing.TypeAlias = CallbackQueryCute
|
|
18
18
|
Validator: typing.TypeAlias = typing.Callable[[typing.Any], bool | typing.Awaitable[bool]]
|
|
19
|
-
MapDict: typing.TypeAlias = dict[
|
|
20
|
-
|
|
21
|
-
]
|
|
22
|
-
CallbackMap: typing.TypeAlias = list[tuple[str, "typing.Any | type | Validator | CallbackMap"]]
|
|
19
|
+
MapDict: typing.TypeAlias = dict[str, "typing.Any | type[typing.Any] | Validator | list[MapDict] | MapDict"]
|
|
20
|
+
CallbackMap: typing.TypeAlias = list[tuple[str, "typing.Any | type[typing.Any] | Validator | CallbackMap"]]
|
|
23
21
|
CallbackMapStrict: typing.TypeAlias = list[tuple[str, "Validator | CallbackMapStrict"]]
|
|
24
22
|
|
|
25
23
|
|
|
@@ -41,7 +39,7 @@ class CallbackQueryDataRule(CallbackQueryRule, abc.ABC, requires=[HasData()]):
|
|
|
41
39
|
|
|
42
40
|
|
|
43
41
|
class CallbackDataMap(CallbackQueryDataRule):
|
|
44
|
-
def __init__(self, mapping: MapDict) -> None:
|
|
42
|
+
def __init__(self, mapping: MapDict, /) -> None:
|
|
45
43
|
self.mapping = self.transform_to_callbacks(
|
|
46
44
|
self.transform_to_map(mapping),
|
|
47
45
|
)
|
|
@@ -86,12 +84,12 @@ class CallbackDataMap(CallbackQueryDataRule):
|
|
|
86
84
|
result = validator(value)
|
|
87
85
|
if inspect.isawaitable(result):
|
|
88
86
|
result = await result
|
|
89
|
-
return result
|
|
87
|
+
return result
|
|
90
88
|
|
|
91
89
|
return False
|
|
92
90
|
|
|
93
91
|
@classmethod
|
|
94
|
-
async def match(cls, callback_data: dict, callback_map: CallbackMapStrict) -> bool:
|
|
92
|
+
async def match(cls, callback_data: dict[str, typing.Any], callback_map: CallbackMapStrict) -> bool:
|
|
95
93
|
"""Matches callback_data with callback_map recursively."""
|
|
96
94
|
|
|
97
95
|
for key, validator in callback_map:
|
|
@@ -121,7 +119,7 @@ class CallbackDataMap(CallbackQueryDataRule):
|
|
|
121
119
|
|
|
122
120
|
|
|
123
121
|
class CallbackDataEq(CallbackQueryDataRule):
|
|
124
|
-
def __init__(self, value: str):
|
|
122
|
+
def __init__(self, value: str, /) -> None:
|
|
125
123
|
self.value = value
|
|
126
124
|
|
|
127
125
|
async def check(self, event: CallbackQuery, ctx: Context) -> bool:
|
|
@@ -129,7 +127,7 @@ class CallbackDataEq(CallbackQueryDataRule):
|
|
|
129
127
|
|
|
130
128
|
|
|
131
129
|
class CallbackDataJsonEq(CallbackQueryDataRule):
|
|
132
|
-
def __init__(self, d: dict[str, typing.Any]):
|
|
130
|
+
def __init__(self, d: dict[str, typing.Any], /) -> None:
|
|
133
131
|
self.d = d
|
|
134
132
|
|
|
135
133
|
async def check(self, event: CallbackQuery, ctx: Context) -> bool:
|
|
@@ -137,7 +135,7 @@ class CallbackDataJsonEq(CallbackQueryDataRule):
|
|
|
137
135
|
|
|
138
136
|
|
|
139
137
|
class CallbackDataJsonModel(CallbackQueryDataRule):
|
|
140
|
-
def __init__(self, model: type[msgspec.Struct] | type[DataclassInstance]):
|
|
138
|
+
def __init__(self, model: type[msgspec.Struct] | type[DataclassInstance], /) -> None:
|
|
141
139
|
self.model = model
|
|
142
140
|
|
|
143
141
|
async def check(self, event: CallbackQuery, ctx: Context) -> bool:
|
|
@@ -148,7 +146,7 @@ class CallbackDataJsonModel(CallbackQueryDataRule):
|
|
|
148
146
|
|
|
149
147
|
|
|
150
148
|
class CallbackDataMarkup(CallbackQueryDataRule):
|
|
151
|
-
def __init__(self, patterns: PatternLike | list[PatternLike]):
|
|
149
|
+
def __init__(self, patterns: PatternLike | list[PatternLike], /) -> None:
|
|
152
150
|
self.patterns = Markup(patterns).patterns
|
|
153
151
|
|
|
154
152
|
async def check(self, event: CallbackQuery, ctx: Context) -> bool:
|
|
@@ -33,13 +33,13 @@ class Checkbox(ABCScenario[CallbackQueryCute]):
|
|
|
33
33
|
self,
|
|
34
34
|
waiter_machine: WaiterMachine,
|
|
35
35
|
chat_id: int,
|
|
36
|
-
|
|
36
|
+
message: str,
|
|
37
37
|
*,
|
|
38
38
|
ready_text: str = "Ready",
|
|
39
39
|
max_in_row: int = 3,
|
|
40
40
|
) -> None:
|
|
41
41
|
self.chat_id = chat_id
|
|
42
|
-
self.
|
|
42
|
+
self.message = message
|
|
43
43
|
self.choices: list[Choice] = []
|
|
44
44
|
self.ready = ready_text
|
|
45
45
|
self.max_in_row = max_in_row
|
|
@@ -58,7 +58,7 @@ class Checkbox(ABCScenario[CallbackQueryCute]):
|
|
|
58
58
|
self.waiter_machine,
|
|
59
59
|
self.ready,
|
|
60
60
|
self.chat_id,
|
|
61
|
-
self.
|
|
61
|
+
self.message,
|
|
62
62
|
)
|
|
63
63
|
|
|
64
64
|
def get_markup(self) -> InlineKeyboardMarkup:
|
|
@@ -101,7 +101,7 @@ class Checkbox(ABCScenario[CallbackQueryCute]):
|
|
|
101
101
|
# Toggle choice
|
|
102
102
|
self.choices[i].is_picked = not self.choices[i].is_picked
|
|
103
103
|
await cb.edit_text(
|
|
104
|
-
text=self.
|
|
104
|
+
text=self.message,
|
|
105
105
|
parse_mode=self.PARSE_MODE,
|
|
106
106
|
reply_markup=self.get_markup(),
|
|
107
107
|
)
|
|
@@ -118,7 +118,7 @@ class Checkbox(ABCScenario[CallbackQueryCute]):
|
|
|
118
118
|
message = (
|
|
119
119
|
await api.send_message(
|
|
120
120
|
chat_id=self.chat_id,
|
|
121
|
-
text=self.
|
|
121
|
+
text=self.message,
|
|
122
122
|
parse_mode=self.PARSE_MODE,
|
|
123
123
|
reply_markup=self.get_markup(),
|
|
124
124
|
)
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import typing
|
|
2
2
|
|
|
3
3
|
from telegrinder.bot.cute_types import CallbackQueryCute
|
|
4
|
+
from telegrinder.bot.dispatch.waiter_machine import WaiterMachine
|
|
4
5
|
|
|
5
6
|
from .checkbox import Checkbox
|
|
6
7
|
|
|
@@ -22,9 +23,9 @@ class SingleChoice(Checkbox):
|
|
|
22
23
|
if choice.code == code:
|
|
23
24
|
self.choices[i].is_picked = True
|
|
24
25
|
await cb.ctx_api.edit_message_text(
|
|
26
|
+
text=self.message,
|
|
25
27
|
chat_id=cb.message.unwrap().v.chat.id,
|
|
26
28
|
message_id=cb.message.unwrap().v.message_id,
|
|
27
|
-
text=self.msg,
|
|
28
29
|
parse_mode=self.PARSE_MODE,
|
|
29
30
|
reply_markup=self.get_markup(),
|
|
30
31
|
)
|
|
@@ -36,10 +37,10 @@ class SingleChoice(Checkbox):
|
|
|
36
37
|
api: "API",
|
|
37
38
|
view: "BaseStateView[CallbackQueryCute]",
|
|
38
39
|
) -> tuple[str, int]:
|
|
39
|
-
if len(
|
|
40
|
+
if len(tuple(choice for choice in self.choices if choice.is_picked)) != 1:
|
|
40
41
|
raise ValueError("Exactly one choice must be picked")
|
|
41
42
|
choices, m_id = await super().wait(api, view)
|
|
42
|
-
return
|
|
43
|
+
return tuple(choices.keys())[tuple(choices.values()).index(True)], m_id
|
|
43
44
|
|
|
44
45
|
|
|
45
46
|
__all__ = ("SingleChoice",)
|
telegrinder/tools/__init__.py
CHANGED
|
@@ -11,12 +11,22 @@ class LimitedDict(UserDict[KT, VT]):
|
|
|
11
11
|
self.maxlimit = maxlimit
|
|
12
12
|
self.queue: deque[KT] = deque(maxlen=maxlimit)
|
|
13
13
|
|
|
14
|
-
def
|
|
14
|
+
def set(self, key: KT, value: VT, /) -> VT | None:
|
|
15
|
+
"""Set item in the dictionary.
|
|
16
|
+
Returns a value that was deleted when the limit in the dictionary
|
|
17
|
+
was reached, otherwise None.
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
deleted_item = None
|
|
15
21
|
if len(self.queue) >= self.maxlimit:
|
|
16
|
-
self.pop(self.queue.popleft(), None)
|
|
22
|
+
deleted_item = self.pop(self.queue.popleft(), None)
|
|
17
23
|
if key not in self.queue:
|
|
18
24
|
self.queue.append(key)
|
|
19
25
|
super().__setitem__(key, value)
|
|
26
|
+
return deleted_item
|
|
27
|
+
|
|
28
|
+
def __setitem__(self, key: KT, value: VT, /) -> None:
|
|
29
|
+
self.set(key, value)
|
|
20
30
|
|
|
21
31
|
def __delitem__(self, key: KT) -> None:
|
|
22
32
|
if key in self.queue:
|
telegrinder/types/methods.py
CHANGED
|
@@ -139,9 +139,7 @@ class APIMethods:
|
|
|
139
139
|
)
|
|
140
140
|
return full_result(method_response, bool)
|
|
141
141
|
|
|
142
|
-
async def get_webhook_info(
|
|
143
|
-
self, **other: typing.Any
|
|
144
|
-
) -> Result[WebhookInfo, APIError]:
|
|
142
|
+
async def get_webhook_info(self, **other: typing.Any) -> Result[WebhookInfo, APIError]:
|
|
145
143
|
"""Method `getWebhookInfo`, see the [documentation](https://core.telegram.org/bots/api#getwebhookinfo)
|
|
146
144
|
|
|
147
145
|
Use this method to get current webhook status. Requires no parameters.
|
|
@@ -215,11 +213,7 @@ class APIMethods:
|
|
|
215
213
|
protect_content: bool | None = None,
|
|
216
214
|
reply_parameters: ReplyParameters | None = None,
|
|
217
215
|
reply_markup: (
|
|
218
|
-
InlineKeyboardMarkup
|
|
219
|
-
| ReplyKeyboardMarkup
|
|
220
|
-
| ReplyKeyboardRemove
|
|
221
|
-
| ForceReply
|
|
222
|
-
| None
|
|
216
|
+
InlineKeyboardMarkup | ReplyKeyboardMarkup | ReplyKeyboardRemove | ForceReply | None
|
|
223
217
|
) = None,
|
|
224
218
|
**other: typing.Any,
|
|
225
219
|
) -> Result[Message, APIError]:
|
|
@@ -357,11 +351,7 @@ class APIMethods:
|
|
|
357
351
|
protect_content: bool | None = None,
|
|
358
352
|
reply_parameters: ReplyParameters | None = None,
|
|
359
353
|
reply_markup: (
|
|
360
|
-
InlineKeyboardMarkup
|
|
361
|
-
| ReplyKeyboardMarkup
|
|
362
|
-
| ReplyKeyboardRemove
|
|
363
|
-
| ForceReply
|
|
364
|
-
| None
|
|
354
|
+
InlineKeyboardMarkup | ReplyKeyboardMarkup | ReplyKeyboardRemove | ForceReply | None
|
|
365
355
|
) = None,
|
|
366
356
|
**other: typing.Any,
|
|
367
357
|
) -> Result[MessageId, APIError]:
|
|
@@ -473,11 +463,7 @@ class APIMethods:
|
|
|
473
463
|
protect_content: bool | None = None,
|
|
474
464
|
reply_parameters: ReplyParameters | None = None,
|
|
475
465
|
reply_markup: (
|
|
476
|
-
InlineKeyboardMarkup
|
|
477
|
-
| ReplyKeyboardMarkup
|
|
478
|
-
| ReplyKeyboardRemove
|
|
479
|
-
| ForceReply
|
|
480
|
-
| None
|
|
466
|
+
InlineKeyboardMarkup | ReplyKeyboardMarkup | ReplyKeyboardRemove | ForceReply | None
|
|
481
467
|
) = None,
|
|
482
468
|
**other: typing.Any,
|
|
483
469
|
) -> Result[Message, APIError]:
|
|
@@ -546,11 +532,7 @@ class APIMethods:
|
|
|
546
532
|
protect_content: bool | None = None,
|
|
547
533
|
reply_parameters: ReplyParameters | None = None,
|
|
548
534
|
reply_markup: (
|
|
549
|
-
InlineKeyboardMarkup
|
|
550
|
-
| ReplyKeyboardMarkup
|
|
551
|
-
| ReplyKeyboardRemove
|
|
552
|
-
| ForceReply
|
|
553
|
-
| None
|
|
535
|
+
InlineKeyboardMarkup | ReplyKeyboardMarkup | ReplyKeyboardRemove | ForceReply | None
|
|
554
536
|
) = None,
|
|
555
537
|
**other: typing.Any,
|
|
556
538
|
) -> Result[Message, APIError]:
|
|
@@ -630,11 +612,7 @@ class APIMethods:
|
|
|
630
612
|
protect_content: bool | None = None,
|
|
631
613
|
reply_parameters: ReplyParameters | None = None,
|
|
632
614
|
reply_markup: (
|
|
633
|
-
InlineKeyboardMarkup
|
|
634
|
-
| ReplyKeyboardMarkup
|
|
635
|
-
| ReplyKeyboardRemove
|
|
636
|
-
| ForceReply
|
|
637
|
-
| None
|
|
615
|
+
InlineKeyboardMarkup | ReplyKeyboardMarkup | ReplyKeyboardRemove | ForceReply | None
|
|
638
616
|
) = None,
|
|
639
617
|
**other: typing.Any,
|
|
640
618
|
) -> Result[Message, APIError]:
|
|
@@ -714,11 +692,7 @@ class APIMethods:
|
|
|
714
692
|
protect_content: bool | None = None,
|
|
715
693
|
reply_parameters: ReplyParameters | None = None,
|
|
716
694
|
reply_markup: (
|
|
717
|
-
InlineKeyboardMarkup
|
|
718
|
-
| ReplyKeyboardMarkup
|
|
719
|
-
| ReplyKeyboardRemove
|
|
720
|
-
| ForceReply
|
|
721
|
-
| None
|
|
695
|
+
InlineKeyboardMarkup | ReplyKeyboardMarkup | ReplyKeyboardRemove | ForceReply | None
|
|
722
696
|
) = None,
|
|
723
697
|
**other: typing.Any,
|
|
724
698
|
) -> Result[Message, APIError]:
|
|
@@ -805,11 +779,7 @@ class APIMethods:
|
|
|
805
779
|
protect_content: bool | None = None,
|
|
806
780
|
reply_parameters: ReplyParameters | None = None,
|
|
807
781
|
reply_markup: (
|
|
808
|
-
InlineKeyboardMarkup
|
|
809
|
-
| ReplyKeyboardMarkup
|
|
810
|
-
| ReplyKeyboardRemove
|
|
811
|
-
| ForceReply
|
|
812
|
-
| None
|
|
782
|
+
InlineKeyboardMarkup | ReplyKeyboardMarkup | ReplyKeyboardRemove | ForceReply | None
|
|
813
783
|
) = None,
|
|
814
784
|
**other: typing.Any,
|
|
815
785
|
) -> Result[Message, APIError]:
|
|
@@ -889,11 +859,7 @@ class APIMethods:
|
|
|
889
859
|
protect_content: bool | None = None,
|
|
890
860
|
reply_parameters: ReplyParameters | None = None,
|
|
891
861
|
reply_markup: (
|
|
892
|
-
InlineKeyboardMarkup
|
|
893
|
-
| ReplyKeyboardMarkup
|
|
894
|
-
| ReplyKeyboardRemove
|
|
895
|
-
| ForceReply
|
|
896
|
-
| None
|
|
862
|
+
InlineKeyboardMarkup | ReplyKeyboardMarkup | ReplyKeyboardRemove | ForceReply | None
|
|
897
863
|
) = None,
|
|
898
864
|
**other: typing.Any,
|
|
899
865
|
) -> Result[Message, APIError]:
|
|
@@ -960,11 +926,7 @@ class APIMethods:
|
|
|
960
926
|
protect_content: bool | None = None,
|
|
961
927
|
reply_parameters: ReplyParameters | None = None,
|
|
962
928
|
reply_markup: (
|
|
963
|
-
InlineKeyboardMarkup
|
|
964
|
-
| ReplyKeyboardMarkup
|
|
965
|
-
| ReplyKeyboardRemove
|
|
966
|
-
| ForceReply
|
|
967
|
-
| None
|
|
929
|
+
InlineKeyboardMarkup | ReplyKeyboardMarkup | ReplyKeyboardRemove | ForceReply | None
|
|
968
930
|
) = None,
|
|
969
931
|
**other: typing.Any,
|
|
970
932
|
) -> Result[Message, APIError]:
|
|
@@ -1020,9 +982,7 @@ class APIMethods:
|
|
|
1020
982
|
async def send_media_group(
|
|
1021
983
|
self,
|
|
1022
984
|
chat_id: int | str,
|
|
1023
|
-
media: list[
|
|
1024
|
-
InputMediaAudio | InputMediaDocument | InputMediaPhoto | InputMediaVideo
|
|
1025
|
-
],
|
|
985
|
+
media: list[InputMediaAudio | InputMediaDocument | InputMediaPhoto | InputMediaVideo],
|
|
1026
986
|
business_connection_id: str | None = None,
|
|
1027
987
|
message_thread_id: int | None = None,
|
|
1028
988
|
disable_notification: bool | None = None,
|
|
@@ -1076,11 +1036,7 @@ class APIMethods:
|
|
|
1076
1036
|
protect_content: bool | None = None,
|
|
1077
1037
|
reply_parameters: ReplyParameters | None = None,
|
|
1078
1038
|
reply_markup: (
|
|
1079
|
-
InlineKeyboardMarkup
|
|
1080
|
-
| ReplyKeyboardMarkup
|
|
1081
|
-
| ReplyKeyboardRemove
|
|
1082
|
-
| ForceReply
|
|
1083
|
-
| None
|
|
1039
|
+
InlineKeyboardMarkup | ReplyKeyboardMarkup | ReplyKeyboardRemove | ForceReply | None
|
|
1084
1040
|
) = None,
|
|
1085
1041
|
**other: typing.Any,
|
|
1086
1042
|
) -> Result[Message, APIError]:
|
|
@@ -1147,11 +1103,7 @@ class APIMethods:
|
|
|
1147
1103
|
protect_content: bool | None = None,
|
|
1148
1104
|
reply_parameters: ReplyParameters | None = None,
|
|
1149
1105
|
reply_markup: (
|
|
1150
|
-
InlineKeyboardMarkup
|
|
1151
|
-
| ReplyKeyboardMarkup
|
|
1152
|
-
| ReplyKeyboardRemove
|
|
1153
|
-
| ForceReply
|
|
1154
|
-
| None
|
|
1106
|
+
InlineKeyboardMarkup | ReplyKeyboardMarkup | ReplyKeyboardRemove | ForceReply | None
|
|
1155
1107
|
) = None,
|
|
1156
1108
|
**other: typing.Any,
|
|
1157
1109
|
) -> Result[Message, APIError]:
|
|
@@ -1216,11 +1168,7 @@ class APIMethods:
|
|
|
1216
1168
|
protect_content: bool | None = None,
|
|
1217
1169
|
reply_parameters: ReplyParameters | None = None,
|
|
1218
1170
|
reply_markup: (
|
|
1219
|
-
InlineKeyboardMarkup
|
|
1220
|
-
| ReplyKeyboardMarkup
|
|
1221
|
-
| ReplyKeyboardRemove
|
|
1222
|
-
| ForceReply
|
|
1223
|
-
| None
|
|
1171
|
+
InlineKeyboardMarkup | ReplyKeyboardMarkup | ReplyKeyboardRemove | ForceReply | None
|
|
1224
1172
|
) = None,
|
|
1225
1173
|
**other: typing.Any,
|
|
1226
1174
|
) -> Result[Message, APIError]:
|
|
@@ -1285,11 +1233,7 @@ class APIMethods:
|
|
|
1285
1233
|
protect_content: bool | None = None,
|
|
1286
1234
|
reply_parameters: ReplyParameters | None = None,
|
|
1287
1235
|
reply_markup: (
|
|
1288
|
-
InlineKeyboardMarkup
|
|
1289
|
-
| ReplyKeyboardMarkup
|
|
1290
|
-
| ReplyKeyboardRemove
|
|
1291
|
-
| ForceReply
|
|
1292
|
-
| None
|
|
1236
|
+
InlineKeyboardMarkup | ReplyKeyboardMarkup | ReplyKeyboardRemove | ForceReply | None
|
|
1293
1237
|
) = None,
|
|
1294
1238
|
**other: typing.Any,
|
|
1295
1239
|
) -> Result[Message, APIError]:
|
|
@@ -1373,11 +1317,7 @@ class APIMethods:
|
|
|
1373
1317
|
protect_content: bool | None = None,
|
|
1374
1318
|
reply_parameters: ReplyParameters | None = None,
|
|
1375
1319
|
reply_markup: (
|
|
1376
|
-
InlineKeyboardMarkup
|
|
1377
|
-
| ReplyKeyboardMarkup
|
|
1378
|
-
| ReplyKeyboardRemove
|
|
1379
|
-
| ForceReply
|
|
1380
|
-
| None
|
|
1320
|
+
InlineKeyboardMarkup | ReplyKeyboardMarkup | ReplyKeyboardRemove | ForceReply | None
|
|
1381
1321
|
) = None,
|
|
1382
1322
|
**other: typing.Any,
|
|
1383
1323
|
) -> Result[Message, APIError]:
|
|
@@ -2379,9 +2319,7 @@ class APIMethods:
|
|
|
2379
2319
|
)
|
|
2380
2320
|
return full_result(method_response, bool)
|
|
2381
2321
|
|
|
2382
|
-
async def get_forum_topic_icon_stickers(
|
|
2383
|
-
self, **other: typing.Any
|
|
2384
|
-
) -> Result[list[Sticker], APIError]:
|
|
2322
|
+
async def get_forum_topic_icon_stickers(self, **other: typing.Any) -> Result[list[Sticker], APIError]:
|
|
2385
2323
|
"""Method `getForumTopicIconStickers`, see the [documentation](https://core.telegram.org/bots/api#getforumtopiciconstickers)
|
|
2386
2324
|
|
|
2387
2325
|
Use this method to get custom emoji stickers, which can be used as a forum
|
|
@@ -3011,9 +2949,7 @@ class APIMethods:
|
|
|
3011
2949
|
self,
|
|
3012
2950
|
chat_id: int | None = None,
|
|
3013
2951
|
**other: typing.Any,
|
|
3014
|
-
) -> Result[
|
|
3015
|
-
Variative[MenuButtonCommands, MenuButtonWebApp, MenuButtonDefault], APIError
|
|
3016
|
-
]:
|
|
2952
|
+
) -> Result[Variative[MenuButtonCommands, MenuButtonWebApp, MenuButtonDefault], APIError]:
|
|
3017
2953
|
"""Method `getChatMenuButton`, see the [documentation](https://core.telegram.org/bots/api#getchatmenubutton)
|
|
3018
2954
|
|
|
3019
2955
|
Use this method to get the current value of the bot's menu button in a private
|
|
@@ -3028,8 +2964,7 @@ class APIMethods:
|
|
|
3028
2964
|
get_params(locals()),
|
|
3029
2965
|
)
|
|
3030
2966
|
return full_result(
|
|
3031
|
-
method_response,
|
|
3032
|
-
Variative[MenuButtonCommands, MenuButtonWebApp, MenuButtonDefault],
|
|
2967
|
+
method_response, Variative[MenuButtonCommands, MenuButtonWebApp, MenuButtonDefault]
|
|
3033
2968
|
)
|
|
3034
2969
|
|
|
3035
2970
|
async def set_my_default_administrator_rights(
|
|
@@ -3424,11 +3359,7 @@ class APIMethods:
|
|
|
3424
3359
|
protect_content: bool | None = None,
|
|
3425
3360
|
reply_parameters: ReplyParameters | None = None,
|
|
3426
3361
|
reply_markup: (
|
|
3427
|
-
InlineKeyboardMarkup
|
|
3428
|
-
| ReplyKeyboardMarkup
|
|
3429
|
-
| ReplyKeyboardRemove
|
|
3430
|
-
| ForceReply
|
|
3431
|
-
| None
|
|
3362
|
+
InlineKeyboardMarkup | ReplyKeyboardMarkup | ReplyKeyboardRemove | ForceReply | None
|
|
3432
3363
|
) = None,
|
|
3433
3364
|
**other: typing.Any,
|
|
3434
3365
|
) -> Result[Message, APIError]:
|
telegrinder/types/objects.py
CHANGED
|
@@ -492,9 +492,7 @@ class ChatFullInfo(Model):
|
|
|
492
492
|
personal_chat: Option["Chat"] = Nothing
|
|
493
493
|
"""Optional. For private chats, the personal channel of the user."""
|
|
494
494
|
|
|
495
|
-
available_reactions: Option[
|
|
496
|
-
list[Variative["ReactionTypeEmoji", "ReactionTypeCustomEmoji"]]
|
|
497
|
-
] = Nothing
|
|
495
|
+
available_reactions: Option[list[Variative["ReactionTypeEmoji", "ReactionTypeCustomEmoji"]]] = Nothing
|
|
498
496
|
"""Optional. List of available reactions allowed in the chat. If omitted,
|
|
499
497
|
then all emoji reactions are allowed."""
|
|
500
498
|
|
|
@@ -647,12 +645,7 @@ class Message(MaybeInaccessibleMessage):
|
|
|
647
645
|
bot chat which might share the same identifier."""
|
|
648
646
|
|
|
649
647
|
forward_origin: Option[
|
|
650
|
-
Variative[
|
|
651
|
-
"MessageOriginUser",
|
|
652
|
-
"MessageOriginHiddenUser",
|
|
653
|
-
"MessageOriginChat",
|
|
654
|
-
"MessageOriginChannel",
|
|
655
|
-
]
|
|
648
|
+
Variative["MessageOriginUser", "MessageOriginHiddenUser", "MessageOriginChat", "MessageOriginChannel"]
|
|
656
649
|
] = Nothing
|
|
657
650
|
"""Optional. Information about the original message for forwarded messages."""
|
|
658
651
|
|
|
@@ -941,9 +934,7 @@ class Message(MaybeInaccessibleMessage):
|
|
|
941
934
|
Full name, for `private` chat."""
|
|
942
935
|
|
|
943
936
|
return (
|
|
944
|
-
self.chat.full_name.unwrap()
|
|
945
|
-
if self.chat.type == ChatType.PRIVATE
|
|
946
|
-
else self.chat.title.unwrap()
|
|
937
|
+
self.chat.full_name.unwrap() if self.chat.type == ChatType.PRIVATE else self.chat.title.unwrap()
|
|
947
938
|
)
|
|
948
939
|
|
|
949
940
|
def __eq__(self, other: typing.Any) -> bool:
|
|
@@ -1049,10 +1040,7 @@ class ExternalReplyInfo(Model):
|
|
|
1049
1040
|
"""
|
|
1050
1041
|
|
|
1051
1042
|
origin: Variative[
|
|
1052
|
-
"MessageOriginUser",
|
|
1053
|
-
"MessageOriginHiddenUser",
|
|
1054
|
-
"MessageOriginChat",
|
|
1055
|
-
"MessageOriginChannel",
|
|
1043
|
+
"MessageOriginUser", "MessageOriginHiddenUser", "MessageOriginChat", "MessageOriginChannel"
|
|
1056
1044
|
]
|
|
1057
1045
|
"""Origin of the message replied to by the given message."""
|
|
1058
1046
|
|
|
@@ -1785,9 +1773,7 @@ class BackgroundTypeFill(BackgroundType):
|
|
|
1785
1773
|
type: typing.Literal["fill"]
|
|
1786
1774
|
"""Type of the background, always `fill`."""
|
|
1787
1775
|
|
|
1788
|
-
fill: Variative[
|
|
1789
|
-
"BackgroundFillSolid", "BackgroundFillGradient", "BackgroundFillFreeformGradient"
|
|
1790
|
-
]
|
|
1776
|
+
fill: Variative["BackgroundFillSolid", "BackgroundFillGradient", "BackgroundFillFreeformGradient"]
|
|
1791
1777
|
"""The background fill."""
|
|
1792
1778
|
|
|
1793
1779
|
dark_theme_dimming: int
|
|
@@ -1829,9 +1815,7 @@ class BackgroundTypePattern(BackgroundType):
|
|
|
1829
1815
|
document: "Document"
|
|
1830
1816
|
"""Document with the pattern."""
|
|
1831
1817
|
|
|
1832
|
-
fill: Variative[
|
|
1833
|
-
"BackgroundFillSolid", "BackgroundFillGradient", "BackgroundFillFreeformGradient"
|
|
1834
|
-
]
|
|
1818
|
+
fill: Variative["BackgroundFillSolid", "BackgroundFillGradient", "BackgroundFillFreeformGradient"]
|
|
1835
1819
|
"""The background fill that is combined with the pattern."""
|
|
1836
1820
|
|
|
1837
1821
|
intensity: int
|
|
@@ -1865,10 +1849,7 @@ class ChatBackground(Model):
|
|
|
1865
1849
|
"""
|
|
1866
1850
|
|
|
1867
1851
|
type: Variative[
|
|
1868
|
-
"BackgroundTypeFill",
|
|
1869
|
-
"BackgroundTypeWallpaper",
|
|
1870
|
-
"BackgroundTypePattern",
|
|
1871
|
-
"BackgroundTypeChatTheme",
|
|
1852
|
+
"BackgroundTypeFill", "BackgroundTypeWallpaper", "BackgroundTypePattern", "BackgroundTypeChatTheme"
|
|
1872
1853
|
]
|
|
1873
1854
|
"""Type of the background."""
|
|
1874
1855
|
|
|
@@ -3111,9 +3092,7 @@ class Birthdate(Model):
|
|
|
3111
3092
|
"""Optional. Contains the user's age, if the user has a birth year specified."""
|
|
3112
3093
|
|
|
3113
3094
|
return self.year.map(
|
|
3114
|
-
lambda year: (
|
|
3115
|
-
(datetime.now() - datetime(year, self.month, self.day)) // 365
|
|
3116
|
-
).days
|
|
3095
|
+
lambda year: ((datetime.now() - datetime(year, self.month, self.day)) // 365).days
|
|
3117
3096
|
)
|
|
3118
3097
|
|
|
3119
3098
|
|
|
@@ -3528,9 +3507,7 @@ class ChatBoost(Model):
|
|
|
3528
3507
|
"""Point in time (Unix timestamp) when the boost will automatically expire,
|
|
3529
3508
|
unless the booster's Telegram Premium subscription is prolonged."""
|
|
3530
3509
|
|
|
3531
|
-
source: Variative[
|
|
3532
|
-
"ChatBoostSourcePremium", "ChatBoostSourceGiftCode", "ChatBoostSourceGiveaway"
|
|
3533
|
-
]
|
|
3510
|
+
source: Variative["ChatBoostSourcePremium", "ChatBoostSourceGiftCode", "ChatBoostSourceGiveaway"]
|
|
3534
3511
|
"""Source of the added boost."""
|
|
3535
3512
|
|
|
3536
3513
|
|
|
@@ -3562,9 +3539,7 @@ class ChatBoostRemoved(Model):
|
|
|
3562
3539
|
remove_date: datetime
|
|
3563
3540
|
"""Point in time (Unix timestamp) when the boost was removed."""
|
|
3564
3541
|
|
|
3565
|
-
source: Variative[
|
|
3566
|
-
"ChatBoostSourcePremium", "ChatBoostSourceGiftCode", "ChatBoostSourceGiveaway"
|
|
3567
|
-
]
|
|
3542
|
+
source: Variative["ChatBoostSourcePremium", "ChatBoostSourceGiftCode", "ChatBoostSourceGiveaway"]
|
|
3568
3543
|
"""Source of the removed boost."""
|
|
3569
3544
|
|
|
3570
3545
|
|
|
@@ -4196,9 +4171,7 @@ class InlineQueryResultGif(InlineQueryResult):
|
|
|
4196
4171
|
gif_duration: Option[int] = Nothing
|
|
4197
4172
|
"""Optional. Duration of the GIF in seconds."""
|
|
4198
4173
|
|
|
4199
|
-
thumbnail_mime_type: Option[
|
|
4200
|
-
typing.Literal["image/jpeg", "image/gif", "video/mp4"]
|
|
4201
|
-
] = Nothing
|
|
4174
|
+
thumbnail_mime_type: Option[typing.Literal["image/jpeg", "image/gif", "video/mp4"]] = Nothing
|
|
4202
4175
|
"""Optional. MIME type of the thumbnail, must be one of `image/jpeg`, `image/gif`,
|
|
4203
4176
|
or `video/mp4`. Defaults to `image/jpeg`."""
|
|
4204
4177
|
|
|
@@ -4259,9 +4232,7 @@ class InlineQueryResultMpeg4Gif(InlineQueryResult):
|
|
|
4259
4232
|
mpeg4_duration: Option[int] = Nothing
|
|
4260
4233
|
"""Optional. Video duration in seconds."""
|
|
4261
4234
|
|
|
4262
|
-
thumbnail_mime_type: Option[
|
|
4263
|
-
typing.Literal["image/jpeg", "image/gif", "video/mp4"]
|
|
4264
|
-
] = Nothing
|
|
4235
|
+
thumbnail_mime_type: Option[typing.Literal["image/jpeg", "image/gif", "video/mp4"]] = Nothing
|
|
4265
4236
|
"""Optional. MIME type of the thumbnail, must be one of `image/jpeg`, `image/gif`,
|
|
4266
4237
|
or `video/mp4`. Defaults to `image/jpeg`."""
|
|
4267
4238
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: telegrinder
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.dev168
|
|
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
|
|
@@ -49,23 +49,23 @@ Still in development.
|
|
|
49
49
|
|
|
50
50
|
Install using pip:
|
|
51
51
|
|
|
52
|
-
```
|
|
52
|
+
```console
|
|
53
53
|
pip install telegrinder
|
|
54
54
|
```
|
|
55
55
|
|
|
56
56
|
Using poetry:
|
|
57
57
|
|
|
58
|
-
```
|
|
58
|
+
```console
|
|
59
59
|
poetry add telegrinder
|
|
60
60
|
```
|
|
61
61
|
|
|
62
62
|
Install from github:
|
|
63
63
|
|
|
64
|
-
```
|
|
64
|
+
```console
|
|
65
65
|
pip install -U https://github.com/timoniq/telegrinder/archive/dev.zip
|
|
66
66
|
```
|
|
67
67
|
|
|
68
|
-
```
|
|
68
|
+
```console
|
|
69
69
|
poetry add git+https://github.com/timoniq/telegrinder.git#dev
|
|
70
70
|
```
|
|
71
71
|
|
|
@@ -8,7 +8,7 @@ telegrinder/bot/__init__.py,sha256=91NKeAbQH10sZ0Lzm-qENoxJRHz2SNvOy-30Ww5gzkA,1
|
|
|
8
8
|
telegrinder/bot/bot.py,sha256=FZFyi-CLEcJYlOz5BbL5Ev6dZQ5VhVqxh1nYburXplQ,2464
|
|
9
9
|
telegrinder/bot/cute_types/__init__.py,sha256=XDcZJMKDFYJExvaNSm3B-bMQ2_wRETALz7-OWAytBC0,457
|
|
10
10
|
telegrinder/bot/cute_types/base.py,sha256=k20aJtTNoLn_63xQUFU-upVcwvwT0OX6odTLnCBY-xQ,4521
|
|
11
|
-
telegrinder/bot/cute_types/callback_query.py,sha256=
|
|
11
|
+
telegrinder/bot/cute_types/callback_query.py,sha256=1Ss32Qkl2b_nGQt0B8GxWNAdL1qYf3akd2PV7ZjRII4,20237
|
|
12
12
|
telegrinder/bot/cute_types/chat_join_request.py,sha256=Rkgu8myVlxbyGX2YIyyMRk5Io_fXqzNFcaTjzuBJ-jw,2237
|
|
13
13
|
telegrinder/bot/cute_types/chat_member_updated.py,sha256=3zoAiSSiFScXcAp8956nxsHTzaiD44boHKALFx_9XkY,10883
|
|
14
14
|
telegrinder/bot/cute_types/inline_query.py,sha256=QmaYkXSOQHrkWs7N6eD_HiTGGOtegN10hVppU37z3bE,2475
|
|
@@ -19,10 +19,10 @@ telegrinder/bot/dispatch/__init__.py,sha256=z4pWNEdWBHKP902bvtUe4WWhtMKW-LgPj5Dd
|
|
|
19
19
|
telegrinder/bot/dispatch/abc.py,sha256=YX184RfqSTMtxrt6qyNRu9uhlPHJLEJY3RKsLfBV7nw,462
|
|
20
20
|
telegrinder/bot/dispatch/composition.py,sha256=bR_fBib4mHEDFgDyGvmejGG1hHBV5zeFWuv2RBHPKXY,2942
|
|
21
21
|
telegrinder/bot/dispatch/context.py,sha256=lVnFaZm1jWlfG9JbtE5c_0pBV1pWlExvh24ESkO5Nag,2278
|
|
22
|
-
telegrinder/bot/dispatch/dispatch.py,sha256=
|
|
22
|
+
telegrinder/bot/dispatch/dispatch.py,sha256=9ym7VUFxwMvT1Eq92zSMWatbKmEXgoE-buuvk9ampTs,5226
|
|
23
23
|
telegrinder/bot/dispatch/handler/__init__.py,sha256=mzchbArrm0eoTEeVKHYrtJX4WSfW5t6T4xDU3-mtYaA,169
|
|
24
24
|
telegrinder/bot/dispatch/handler/abc.py,sha256=ry5gMUxB6buiDksAFiuWM-LcIAg5S8rJZlW_0PWpVJA,570
|
|
25
|
-
telegrinder/bot/dispatch/handler/func.py,sha256=
|
|
25
|
+
telegrinder/bot/dispatch/handler/func.py,sha256=nfVpTf4MvHuOtH6tV07S-tdAR2iVWHeuD896a5SCyhg,3022
|
|
26
26
|
telegrinder/bot/dispatch/handler/message_reply.py,sha256=_3gb3NLAwfTw7FTd7iga2tSe5WZ8IU9AdxwDWq5nMqI,1811
|
|
27
27
|
telegrinder/bot/dispatch/middleware/__init__.py,sha256=qDuTt2ZZKX9UMjPdw5xaaNZdMI-i3P4Px2T8qbYCMJw,61
|
|
28
28
|
telegrinder/bot/dispatch/middleware/abc.py,sha256=Aj9aEQ0yNM-pprUOdnYAmoIbq4wPMgyhCP8EUAvxzXs,413
|
|
@@ -33,7 +33,7 @@ telegrinder/bot/dispatch/return_manager/callback_query.py,sha256=actPlW6JqZ2Qi8t
|
|
|
33
33
|
telegrinder/bot/dispatch/return_manager/inline_query.py,sha256=Clo6Uvl__Ja9u5yg6RSJBjyqhhSpJINtq2NFS_pG45Q,489
|
|
34
34
|
telegrinder/bot/dispatch/return_manager/message.py,sha256=ZrCrvq8wNmz8TTykoVMzneKk11cIqkCFZIOynZ5PjAQ,1160
|
|
35
35
|
telegrinder/bot/dispatch/view/__init__.py,sha256=x8qPwRWosGNTk89tvyiWZhHKvVK2IqFI87D7YTrRKbk,569
|
|
36
|
-
telegrinder/bot/dispatch/view/abc.py,sha256=
|
|
36
|
+
telegrinder/bot/dispatch/view/abc.py,sha256=xCqoH4b0Kb-ZTLTmnULCjpFAfI1nHG4svcZ-efMwjhc,7043
|
|
37
37
|
telegrinder/bot/dispatch/view/box.py,sha256=4cLaC6U31RbPC0AqrHIjtB_Av-Wbip9gJ0yODZ-jClA,3825
|
|
38
38
|
telegrinder/bot/dispatch/view/callback_query.py,sha256=ALQm-cUFDQggZqwGVOEVodvpTcYKXCebwYDbLcZ36cE,560
|
|
39
39
|
telegrinder/bot/dispatch/view/chat_join_request.py,sha256=y1wQMrPSiqxDHQm7TqdOA-ecAP3rnocYTzQxa7-7vws,447
|
|
@@ -42,9 +42,9 @@ telegrinder/bot/dispatch/view/inline_query.py,sha256=hRwrgfhgS5YF0E6eUrR8FuWVHUM
|
|
|
42
42
|
telegrinder/bot/dispatch/view/message.py,sha256=Fb7GRVCsVhE5xHZtFyiNntKcqtGCVzj2pEIOLcfFMm8,1175
|
|
43
43
|
telegrinder/bot/dispatch/view/raw.py,sha256=U1nY4sE_8TSR7nlyYh8Zn8qysfEWYS_dKhPGglE9VFw,3438
|
|
44
44
|
telegrinder/bot/dispatch/waiter_machine/__init__.py,sha256=RUuq-J1qZMeREL8omM8kxEfgAz3-7h3B9NhzSjLTMqA,190
|
|
45
|
-
telegrinder/bot/dispatch/waiter_machine/machine.py,sha256=
|
|
45
|
+
telegrinder/bot/dispatch/waiter_machine/machine.py,sha256=lmPHxGMXELFW18N4Z9UAcFSqthXZUIEbumINTo-2-OM,4047
|
|
46
46
|
telegrinder/bot/dispatch/waiter_machine/middleware.py,sha256=YdB3KSJRo11aoUfpV48Rm2GC14ea9ucJWL2ACRiTnig,2706
|
|
47
|
-
telegrinder/bot/dispatch/waiter_machine/short_state.py,sha256=
|
|
47
|
+
telegrinder/bot/dispatch/waiter_machine/short_state.py,sha256=qqKu5bt3GpP15CSEB6vutmARgCaElcuiTC3GymqWSBE,1575
|
|
48
48
|
telegrinder/bot/polling/__init__.py,sha256=OqfIFPS_V6UrCg-vCv9pkMFzTKdNbDP2faBfATs_TGg,94
|
|
49
49
|
telegrinder/bot/polling/abc.py,sha256=-5BpX55SJfDlEJWt15yOXWCizQRrgeY5oiA5eHkm1Nw,434
|
|
50
50
|
telegrinder/bot/polling/polling.py,sha256=omSV2HhNIY78DTzll5yswRrEtYbbhFZGi5Q4QGHI_fE,4681
|
|
@@ -55,7 +55,7 @@ telegrinder/bot/rules/adapter/abc.py,sha256=VxRGQbNtdfA6gZyTk0JjJBdB5n_7g6uwseew
|
|
|
55
55
|
telegrinder/bot/rules/adapter/errors.py,sha256=2r_UBTWm5-heU-NchBfobC1f848EWeC64nKvprGnAAY,73
|
|
56
56
|
telegrinder/bot/rules/adapter/event.py,sha256=SHCKW-bE0LS9jK6v2ciZTi5ELVw8WLcYJQ5b2qD53kc,2160
|
|
57
57
|
telegrinder/bot/rules/adapter/raw_update.py,sha256=K0bwq3Hh-hIs_xbEYDOgZHMS4r-Zvo3VKs1B3gkJLGA,752
|
|
58
|
-
telegrinder/bot/rules/callback_data.py,sha256=
|
|
58
|
+
telegrinder/bot/rules/callback_data.py,sha256=_-T3Mg0o0xmYwcXBn5a4dkIuXuCntK8EQ0WSvvMTqsE,5452
|
|
59
59
|
telegrinder/bot/rules/chat_join.py,sha256=pWVMhrKi40-1vhBNQqV24i98GGJ0SwhagrvGeL1hMas,1401
|
|
60
60
|
telegrinder/bot/rules/command.py,sha256=2qzcLr_r4g7i5Hndhfd7zyoDfVCLPplr-Ijbr_yE4jo,3322
|
|
61
61
|
telegrinder/bot/rules/enum_text.py,sha256=O8J1xm5AtLnLVfIIbY1B1lygm9XLZ86YeApa4LuDn1o,954
|
|
@@ -75,8 +75,8 @@ telegrinder/bot/rules/text.py,sha256=MIEbbIu6X2zcOD70hM0TrQI4jN2ulKmuREos3BN7Ii4
|
|
|
75
75
|
telegrinder/bot/rules/update.py,sha256=0ccDDD4QW2qx6hBMwNteUnGRbsGbrdE2fCkCx6AmuEA,480
|
|
76
76
|
telegrinder/bot/scenario/__init__.py,sha256=Ehe2uH-eQ-vRBPxIzdmE23B-FBOAa9YQyndmb6K8C5E,166
|
|
77
77
|
telegrinder/bot/scenario/abc.py,sha256=3AZYRjZlkbDtyFbsKdZ6BefzWYlJ0DOrGwh8jI3nzv4,474
|
|
78
|
-
telegrinder/bot/scenario/checkbox.py,sha256=
|
|
79
|
-
telegrinder/bot/scenario/choice.py,sha256=-
|
|
78
|
+
telegrinder/bot/scenario/checkbox.py,sha256=ULsdt40AXqqiTnN5iXiiw5TJ7j4IFoQOg92TF3zg_XA,4152
|
|
79
|
+
telegrinder/bot/scenario/choice.py,sha256=-Jes6CHx8nWgoKSClkDc3Y62t5IoG6HF1Ud3LG6yWZg,1519
|
|
80
80
|
telegrinder/client/__init__.py,sha256=ZiS1Wb_l_kv3FHzEEi1oXtFLwlA_HXmWOzeN0xA3E7Y,104
|
|
81
81
|
telegrinder/client/abc.py,sha256=OxsTX_PLYBEeFT9zpidFUzAbQL9BM7rQqru7zdn5DiQ,1611
|
|
82
82
|
telegrinder/client/aiohttp.py,sha256=AqmuHd6Z3zy96YBe7xIMC4U8Hi9SA7j-0EI7xYE3ZCU,4085
|
|
@@ -97,7 +97,7 @@ telegrinder/node/tools/__init__.py,sha256=TI_o7MbS4DUOSkNNgJGLocXfRybPFv2WOhBty0
|
|
|
97
97
|
telegrinder/node/tools/generator.py,sha256=rs7UcFxgnXgjiSdFPyChqZW4K4oRcmiPst6nYYOSrnw,1024
|
|
98
98
|
telegrinder/node/update.py,sha256=QD-m9soBgsP3voTbhaErWdE1FciwYyJCIFNDYf_zra0,253
|
|
99
99
|
telegrinder/rules.py,sha256=BFB8RFwKKxqs9HFfo_p0RfulQNonPZAX8cHpmnG7qCU,39
|
|
100
|
-
telegrinder/tools/__init__.py,sha256=
|
|
100
|
+
telegrinder/tools/__init__.py,sha256=rEVbGICWyacwGe_HmE_yTjK3ySAr37khJN3PumFNnZQ,2961
|
|
101
101
|
telegrinder/tools/buttons.py,sha256=0p-hebPWNVPfX6f_8CNtruRZ_W9monthz0Mb3rwPFRY,2414
|
|
102
102
|
telegrinder/tools/error_handler/__init__.py,sha256=WmYWZCNhhSk32j4lIOltEwzoYUx086TGTbOF5h3Ps7s,207
|
|
103
103
|
telegrinder/tools/error_handler/abc.py,sha256=w5t2sWa_xt9iy7pdphiFs1kgmsll7A7eaPbm3Yes8t0,888
|
|
@@ -120,7 +120,7 @@ telegrinder/tools/kb_set/__init__.py,sha256=k1KCQTnvEgJ2y4KlghhJWOh5rccwg_27cs82
|
|
|
120
120
|
telegrinder/tools/kb_set/base.py,sha256=mbZs-ViUErfSibzyN064IqZp76LBJPg3NB4D9v4VFtg,243
|
|
121
121
|
telegrinder/tools/kb_set/yaml.py,sha256=rDoVkdfxp3gz-pS82nB1LDQU8cyckErwMee4nCXHunI,2027
|
|
122
122
|
telegrinder/tools/keyboard.py,sha256=oHwFnqj_pmKsxI6AnvFgZWQYqSkyK-Lgnnd6qbNTmEI,3730
|
|
123
|
-
telegrinder/tools/limited_dict.py,sha256=
|
|
123
|
+
telegrinder/tools/limited_dict.py,sha256=rSWMDxgMVyhVj4z4q_JHoJGd16RE23EnsZS7wkYmw-k,1082
|
|
124
124
|
telegrinder/tools/loop_wrapper/__init__.py,sha256=ZQ5jmE1lOKnqJlMZ9k2OYmjvOEhOlHPijUWqZ4nHIgk,165
|
|
125
125
|
telegrinder/tools/loop_wrapper/abc.py,sha256=ET_Dp-kRz75Jo1fZB3qofUgEXN4FqlU0xH2diESKGCM,266
|
|
126
126
|
telegrinder/tools/loop_wrapper/loop_wrapper.py,sha256=4JvtVIy14oAMYUy0Z3hayFqFXvoh6cBdgmnFHMo4s0Y,5701
|
|
@@ -128,10 +128,10 @@ telegrinder/tools/magic.py,sha256=ijUw7LipMPn0vO7UJzUpx5kNNRL_MTFArTxnxn_8qEU,18
|
|
|
128
128
|
telegrinder/tools/parse_mode.py,sha256=JyQ-x9YAMPLhIIiUX01acyKkpWgs5TBA07W-iUyPHpE,92
|
|
129
129
|
telegrinder/types/__init__.py,sha256=IDaQRxugF7lh8LHFjs1fjAQY9y6Z5en_j8CezBdoL7E,6036
|
|
130
130
|
telegrinder/types/enums.py,sha256=LRPPSB95NhKnt5hd3dW_wMhiGEzGjyWSo5bheAfyz_s,19152
|
|
131
|
-
telegrinder/types/methods.py,sha256=
|
|
132
|
-
telegrinder/types/objects.py,sha256=
|
|
131
|
+
telegrinder/types/methods.py,sha256=XpyM-YbjOj-7MPZBfLt3lhvNgLLXzx26t3DkZzaaAGc,185746
|
|
132
|
+
telegrinder/types/objects.py,sha256=nJIU4UUTdWAW_t_v30JI6y1vwkKY1g_essO-G8p2HeE,228423
|
|
133
133
|
telegrinder/verification_utils.py,sha256=ZUgHsouZjs930D5rI_w7VGy0ub69vovwKXeKjqgrSNc,1028
|
|
134
|
-
telegrinder-0.1.
|
|
135
|
-
telegrinder-0.1.
|
|
136
|
-
telegrinder-0.1.
|
|
137
|
-
telegrinder-0.1.
|
|
134
|
+
telegrinder-0.1.dev168.dist-info/LICENSE,sha256=J9ngGsqHCNNjpm3xYPT7EnlzsnjhfqNXej5mJFjM6lw,1094
|
|
135
|
+
telegrinder-0.1.dev168.dist-info/METADATA,sha256=RdF6R_kPU7KoIJVFIdcCFBHkuz35NT_lp-tV2BVbjfs,2920
|
|
136
|
+
telegrinder-0.1.dev168.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
|
|
137
|
+
telegrinder-0.1.dev168.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|