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.

@@ -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 | None,
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
- await self.raw_event.process(event, api)
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
- await view.process(event, api)
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
- @classmethod
71
- def get_raw_event(cls, update: Update) -> Option[Model]:
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
- waiters = typing.cast(
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 | int | None = None,
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
- view_name = state_view.__class__.__name__
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][key] = short_state
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 e, ctx
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
- ctx = Context(**context)
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
- str, "typing.Any | type[typing.Any] | Validator | list[MapDict] | MapDict"
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 # type: ignore
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
- msg: str,
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.msg = msg
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.msg,
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.msg,
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.msg,
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([choice for choice in self.choices if choice.is_picked]) != 1:
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 list(choices.keys())[list(choices.values()).index(True)], m_id
43
+ return tuple(choices.keys())[tuple(choices.values()).index(True)], m_id
43
44
 
44
45
 
45
46
  __all__ = ("SingleChoice",)
@@ -100,8 +100,8 @@ __all__ = (
100
100
  "KeyboardSetBase",
101
101
  "KeyboardSetYAML",
102
102
  "Lifespan",
103
- "Link",
104
103
  "LimitedDict",
104
+ "Link",
105
105
  "LoopWrapper",
106
106
  "Mention",
107
107
  "ParseMode",
@@ -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 __setitem__(self, key: KT, value: VT, /) -> None:
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:
@@ -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]:
@@ -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.dev167
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=kCPjELrzRNEfa3h_gxbl12bkS6ejY8pTNxCJZTNZuNw,20244
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=PHwp3VfN8b9xiFZ2e5rR0VyezG7kHEcObjWxfX_W4so,5193
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=QBR8vudGmDn1euc3UuecWJxuWiB-yXzdEm0acZtcfKI,3018
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=AgtskFpCln5tYDdx9nJqYUaU8DO5W5AlXvfnygY6zwE,5639
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=rWAIwl9-igZ4V40XF87ItdiQBdjiqKvQmVzDKyZr39M,4114
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=zAtIVsQo1xHXwKeWn8GAsK4mlzzmzCDBUqc9g6r5FTg,1294
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=iZYDyOej2bSToo1eYQKRM7TryknC3KpvuZUJYJGcciQ,5398
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=vjedhLVurQtSbpFDPwMuLx5j5OJxa0Iv6aV8Ufd_jYw,4128
79
- telegrinder/bot/scenario/choice.py,sha256=-NYyzgfGI0njVuT-EY0j3jS4tPlsKOEkZaUagtns7dE,1442
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=lDcl3dDXQ_4daAmxoe9r8lyAsUhG79MZHgmq3uSpSko,2961
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=SkfHdDI3hb02zVDaKpFwTggcVU7yYqcudSRNsKqKYA4,763
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=RPDCeYHuVFtF0CT3XW4Gq8fI26P5ql4UqyVdQdIeXTE,186543
132
- telegrinder/types/objects.py,sha256=QWlpNjjJc1jRBpG8cFKGLXhSyIiwtUHP2aIw446oPo8,228684
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.dev167.dist-info/LICENSE,sha256=J9ngGsqHCNNjpm3xYPT7EnlzsnjhfqNXej5mJFjM6lw,1094
135
- telegrinder-0.1.dev167.dist-info/METADATA,sha256=CPe-uupiL9vzJsSSiPLo9qvA78F9CnRNsbKOUn-hBfA,2892
136
- telegrinder-0.1.dev167.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
137
- telegrinder-0.1.dev167.dist-info/RECORD,,
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,,