telegrinder 0.1.dev162__py3-none-any.whl → 0.1.dev163__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/bot.py CHANGED
@@ -11,11 +11,7 @@ PollingT = typing.TypeVar("PollingT", bound=ABCPolling, default=Polling)
11
11
  LoopWrapperT = typing.TypeVar("LoopWrapperT", bound=ABCLoopWrapper, default=LoopWrapper)
12
12
 
13
13
 
14
- class Telegrinder(typing.Generic[DispatchT, PollingT, LoopWrapperT]):
15
- dispatch: DispatchT
16
- polling: PollingT
17
- loop_wrapper: LoopWrapperT
18
-
14
+ class Telegrinder(typing.Generic[DispatchT, PollingT, LoopWrapperT]):
19
15
  def __init__(
20
16
  self,
21
17
  api: API,
@@ -25,9 +21,9 @@ class Telegrinder(typing.Generic[DispatchT, PollingT, LoopWrapperT]):
25
21
  loop_wrapper: LoopWrapperT | None = None,
26
22
  ) -> None:
27
23
  self.api = api
28
- self.dispatch = dispatch or Dispatch() # type: ignore
29
- self.polling = polling or Polling(api) # type: ignore
30
- self.loop_wrapper = loop_wrapper or LoopWrapper() # type: ignore
24
+ self.dispatch = typing.cast(DispatchT, dispatch or Dispatch())
25
+ self.polling = typing.cast(PollingT, polling or Polling(api))
26
+ self.loop_wrapper = typing.cast(LoopWrapperT, loop_wrapper or LoopWrapper())
31
27
 
32
28
  @property
33
29
  def on(self) -> DispatchT:
@@ -38,7 +34,7 @@ class Telegrinder(typing.Generic[DispatchT, PollingT, LoopWrapperT]):
38
34
  return
39
35
  await self.api.delete_webhook()
40
36
 
41
- async def run_polling(self, offset: int = 0, skip_updates: bool = False) -> None:
37
+ async def run_polling(self, *, offset: int = 0, skip_updates: bool = False) -> None:
42
38
  if skip_updates:
43
39
  logger.debug("Dropping pending updates")
44
40
  await self.reset_webhook()
@@ -50,9 +46,9 @@ class Telegrinder(typing.Generic[DispatchT, PollingT, LoopWrapperT]):
50
46
  logger.debug("Received update (update_id={})", update.update_id)
51
47
  self.loop_wrapper.add_task(self.dispatch.feed(update, self.api))
52
48
 
53
- def run_forever(self, offset: int = 0, skip_updates: bool = False) -> None:
49
+ def run_forever(self, *, offset: int = 0, skip_updates: bool = False) -> None:
54
50
  logger.debug("Running blocking polling (id={})", self.api.id)
55
- self.loop_wrapper.add_task(self.run_polling(offset, skip_updates=skip_updates))
51
+ self.loop_wrapper.add_task(self.run_polling(offset=offset, skip_updates=skip_updates))
56
52
  self.loop_wrapper.run_event_loop()
57
53
 
58
54
 
@@ -17,12 +17,11 @@ from .handler.func import ErrorHandlerT
17
17
  from .view.box import CallbackQueryViewT, InlineQueryViewT, MessageViewT, ViewBox
18
18
 
19
19
  T = typing.TypeVar("T")
20
-
21
- Event = typing.TypeVar("Event", bound=BaseCute)
22
20
  R = typing.TypeVar("R")
23
21
  P = typing.ParamSpec("P")
22
+ Event = typing.TypeVar("Event", bound=BaseCute)
24
23
 
25
- DEFAULT_DATACLASS = Update
24
+ DEFAULT_DATACLASS: typing.Final[type[Update]] = Update
26
25
 
27
26
 
28
27
  @dataclasses.dataclass(repr=False, kw_only=True)
@@ -18,14 +18,14 @@ MessageViewT = typing.TypeVar("MessageViewT", bound=ABCView, default=MessageView
18
18
 
19
19
  @dataclasses.dataclass(kw_only=True)
20
20
  class ViewBox(typing.Generic[CallbackQueryViewT, InlineQueryViewT, MessageViewT]):
21
- callback_query: CallbackQueryViewT = dataclasses.field( # type: ignore
22
- default_factory=lambda: CallbackQueryView(),
21
+ callback_query: CallbackQueryViewT = dataclasses.field(
22
+ default_factory=lambda: typing.cast(CallbackQueryViewT, CallbackQueryView()),
23
23
  )
24
- inline_query: InlineQueryViewT = dataclasses.field( # type: ignore
25
- default_factory=lambda: InlineQueryView(),
24
+ inline_query: InlineQueryViewT = dataclasses.field(
25
+ default_factory=lambda: typing.cast(InlineQueryViewT, InlineQueryView()),
26
26
  )
27
- message: MessageViewT = dataclasses.field( # type: ignore
28
- default_factory=lambda: MessageView(),
27
+ message: MessageViewT = dataclasses.field(
28
+ default_factory=lambda: typing.cast(MessageViewT, MessageView()),
29
29
  )
30
30
 
31
31
  def get_views(self) -> dict[str, ABCView]:
@@ -30,6 +30,8 @@ from .is_from import (
30
30
  IsDartDice,
31
31
  IsDice,
32
32
  IsForum,
33
+ IsForward,
34
+ IsForwardType,
33
35
  IsGroup,
34
36
  IsLanguageCode,
35
37
  IsPremium,
@@ -78,6 +80,8 @@ __all__ = (
78
80
  "IsDartDice",
79
81
  "IsDice",
80
82
  "IsForum",
83
+ "IsForward",
84
+ "IsForwardType",
81
85
  "IsGroup",
82
86
  "IsLanguageCode",
83
87
  "IsPremium",
@@ -12,13 +12,13 @@ T = typing.TypeVar("T", bound=BaseCute)
12
12
 
13
13
 
14
14
  @typing.runtime_checkable
15
- class HasFromProto(typing.Protocol):
15
+ class FromUserProto(typing.Protocol):
16
16
  from_: User | Option[User]
17
17
 
18
18
 
19
19
  class HasFrom(ABCRule[T]):
20
20
  async def check(self, event: T, ctx: Context) -> bool:
21
- return isinstance(event, HasFromProto) and bool(event.from_)
21
+ return isinstance(event, FromUserProto) and bool(event.from_)
22
22
 
23
23
 
24
24
  class HasDice(MessageRule):
@@ -26,6 +26,19 @@ class HasDice(MessageRule):
26
26
  return bool(message.dice)
27
27
 
28
28
 
29
+ class IsForward(MessageRule):
30
+ async def check(self, message: Message, ctx: Context) -> bool:
31
+ return bool(message.forward_origin)
32
+
33
+
34
+ class IsForwardType(MessageRule, requires=[IsForward()]):
35
+ def __init__(self, fwd_type: typing.Literal["user", "hidden_user", "chat", "channel"], /) -> None:
36
+ self.fwd_type = fwd_type
37
+
38
+ async def check(self, message: Message, ctx: Context) -> bool:
39
+ return message.forward_origin.unwrap().v.type == self.fwd_type
40
+
41
+
29
42
  class IsReply(MessageRule):
30
43
  async def check(self, message: Message, ctx: Context) -> bool:
31
44
  return bool(message.reply_to_message)
@@ -58,7 +71,7 @@ class IsLanguageCode(MessageRule, requires=[HasFrom()]):
58
71
  async def check(self, message: Message, ctx: Context) -> bool:
59
72
  if not message.from_user.language_code:
60
73
  return False
61
- return message.from_user.language_code.unwrap_or_none() in self.lang_codes
74
+ return message.from_user.language_code.unwrap() in self.lang_codes
62
75
 
63
76
 
64
77
  class IsForum(MessageRule):
@@ -141,6 +154,8 @@ __all__ = (
141
154
  "IsDartDice",
142
155
  "IsDice",
143
156
  "IsForum",
157
+ "IsForward",
158
+ "IsForwardType",
144
159
  "IsGroup",
145
160
  "IsLanguageCode",
146
161
  "IsPremium",
@@ -1,4 +1,3 @@
1
- import secrets
2
1
  import ssl
3
2
  import typing
4
3
 
@@ -31,7 +30,7 @@ class AiohttpClient(ABCClient):
31
30
  self.__class__.__name__,
32
31
  self.session,
33
32
  self.timeout,
34
- False if self.session is None else self.session.closed,
33
+ True if self.session is None else self.session.closed,
35
34
  )
36
35
 
37
36
  async def request_raw(
@@ -4,9 +4,6 @@ import fntypes.option
4
4
  import msgspec
5
5
  from fntypes.co import Error, Ok, Result, Variative
6
6
 
7
- T = typing.TypeVar("T")
8
- Ts = typing.TypeVarTuple("Ts")
9
-
10
7
  if typing.TYPE_CHECKING:
11
8
  from datetime import datetime
12
9
 
@@ -18,6 +15,7 @@ else:
18
15
 
19
16
  datetime = type("datetime", (dt,), {})
20
17
 
18
+
21
19
  class OptionMeta(type):
22
20
  def __instancecheck__(cls, __instance: typing.Any) -> bool:
23
21
  return isinstance(__instance, fntypes.option.Some | fntypes.option.Nothing)
@@ -26,6 +24,9 @@ else:
26
24
  class Option(typing.Generic[Value], metaclass=OptionMeta):
27
25
  pass
28
26
 
27
+ T = typing.TypeVar("T")
28
+ Ts = typing.TypeVarTuple("Ts")
29
+
29
30
  DecHook: typing.TypeAlias = typing.Callable[[type[T], typing.Any], object]
30
31
  EncHook: typing.TypeAlias = typing.Callable[[T], typing.Any]
31
32
 
@@ -90,6 +91,32 @@ def variative_dec_hook(tp: type[Variative], obj: typing.Any) -> Variative:
90
91
 
91
92
 
92
93
  class Decoder:
94
+ """Class `Decoder` for `msgspec` module with decode hook
95
+ for objects with the specified type.
96
+
97
+ ```
98
+ import enum
99
+
100
+ from datetime import datetime as dt
101
+
102
+ class Digit(enum.IntEnum):
103
+ ONE = 1
104
+ TWO = 2
105
+ THREE = 3
106
+
107
+ decoder = Encoder()
108
+ decoder.dec_hooks[dt] = lambda t, timestamp: t.fromtimestamp(timestamp)
109
+
110
+ decoder.dec_hook(dt, 1713354732) #> datetime.datetime(2024, 4, 17, 14, 52, 12)
111
+ decoder.dec_hook(int, "123") #> TypeError: Unknown type `int`. You can implement decode hook for this type.
112
+
113
+ decoder.convert("123", type=int, strict=False) #> 123
114
+ decoder.convert(1, type=Digit) #> <Digit.ONE: 1>
115
+
116
+ decoder.decode(b'{"digit":3}', type=dict[str, Digit]) #> {'digit': <Digit.THREE: 3>}
117
+ ```
118
+ """
119
+
93
120
  def __init__(self) -> None:
94
121
  self.dec_hooks: dict[typing.Any, DecHook[typing.Any]] = {
95
122
  Option: option_dec_hook,
@@ -119,7 +146,7 @@ class Decoder:
119
146
  type: type[T] = dict,
120
147
  strict: bool = True,
121
148
  from_attributes: bool = False,
122
- builtin_types: typing.Iterable[type] | None = None,
149
+ builtin_types: typing.Iterable[type[typing.Any]] | None = None,
123
150
  str_keys: bool = False,
124
151
  ) -> T:
125
152
  return msgspec.convert(
@@ -166,6 +193,21 @@ class Decoder:
166
193
 
167
194
 
168
195
  class Encoder:
196
+ """Class `Encoder` for `msgspec` module with encode hooks for objects.
197
+
198
+ ```
199
+ from datetime import datetime as dt
200
+
201
+ encoder = Encoder()
202
+ encoder.enc_hooks[dt] = lambda d: int(d.timestamp())
203
+
204
+ encoder.enc_hook(dt.now()) #> 1713354732
205
+ encoder.enc_hook(123) #> NotImplementedError: Not implemented encode hook for object of type `int`.
206
+
207
+ encoder.encode({'digit': Digit.ONE}) #> '{"digit":1}'
208
+ ```
209
+ """
210
+
169
211
  def __init__(self) -> None:
170
212
  self.enc_hooks: dict[typing.Any, EncHook[typing.Any]] = {
171
213
  fntypes.option.Some: lambda opt: opt.value,
@@ -174,9 +216,10 @@ class Encoder:
174
216
  datetime: lambda date: int(date.timestamp()),
175
217
  }
176
218
 
177
- def add_dec_hook(self, tp: type[T]):
219
+ def add_dec_hook(self, t: type[T]):
178
220
  def decorator(func: EncHook[T]) -> EncHook[T]:
179
- return self.enc_hooks.setdefault(get_origin(tp), func)
221
+ encode_hook = self.enc_hooks.setdefault(get_origin(t), func)
222
+ return func if encode_hook is not func else encode_hook
180
223
 
181
224
  return decorator
182
225
 
@@ -194,11 +237,11 @@ class Encoder:
194
237
  ...
195
238
 
196
239
  @typing.overload
197
- def encode(self, obj: typing.Any, *, as_str: typing.Literal[True] = True) -> str:
240
+ def encode(self, obj: typing.Any, *, as_str: typing.Literal[True]) -> str:
198
241
  ...
199
242
 
200
243
  @typing.overload
201
- def encode(self, obj: typing.Any, *, as_str: typing.Literal[False] = False) -> bytes:
244
+ def encode(self, obj: typing.Any, *, as_str: typing.Literal[False]) -> bytes:
202
245
  ...
203
246
 
204
247
  def encode(self, obj: typing.Any, *, as_str: bool = True) -> str | bytes:
@@ -2,7 +2,6 @@ import dataclasses
2
2
  import typing
3
3
 
4
4
  from telegrinder.api import API
5
- from telegrinder.msgspec_utils import Nothing, Option
6
5
  from telegrinder.types import Chat, Message
7
6
 
8
7
  from .base import DataNode
@@ -13,14 +12,14 @@ from .message import MessageNode
13
12
  class Source(DataNode):
14
13
  api: API
15
14
  chat: Chat
16
- thread_id: Option[int] = dataclasses.field(default_factory=lambda: Nothing)
15
+ thread_id: int | None = None
17
16
 
18
17
  @classmethod
19
18
  async def compose(cls, message: MessageNode) -> typing.Self:
20
19
  return cls(
21
20
  api=message.ctx_api,
22
21
  chat=message.chat,
23
- thread_id=message.message_thread_id,
22
+ thread_id=message.message_thread_id.unwrap_or_none(),
24
23
  )
25
24
 
26
25
  async def send(self, text: str) -> Message:
@@ -74,9 +74,9 @@ class Catcher(typing.Generic[EventT]):
74
74
 
75
75
  def match_exception(self, exception: BaseException) -> bool:
76
76
  for exc in self.exceptions:
77
- if isinstance(exc, type) and type(exception) == exc:
77
+ if isinstance(exc, type) and type(exception) is exc:
78
78
  return True
79
- if isinstance(exc, object) and type(exception) == type(exc):
79
+ if isinstance(exc, object) and type(exception) is type(exc):
80
80
  return True if not exc.args else exc.args == exception.args
81
81
  return False
82
82
 
@@ -23,11 +23,13 @@ else:
23
23
 
24
24
 
25
25
  def type_check(value: object, value_type: type[T]) -> typing.TypeGuard[T]:
26
- return (
27
- True
28
- if value_type in (typing.Any, object)
29
- else bool(msgspec_convert(value, value_type))
30
- )
26
+ if value_type in (typing.Any, object):
27
+ return True
28
+ match msgspec_convert(value, value_type):
29
+ case Ok(v):
30
+ return type(value) is type(v)
31
+ case Error(_):
32
+ return False
31
33
 
32
34
 
33
35
  def is_dunder(name: str) -> bool:
@@ -9,7 +9,7 @@ if typing.TYPE_CHECKING:
9
9
  T = typing.TypeVar("T", bound=ABCRule)
10
10
 
11
11
  FuncType: typing.TypeAlias = types.FunctionType | typing.Callable[..., typing.Any]
12
- TRANSLATIONS_KEY = "_translations"
12
+ TRANSLATIONS_KEY: typing.Final[str] = "_translations"
13
13
 
14
14
 
15
15
  def resolve_arg_names(func: FuncType, start_idx: int = 1) -> tuple[str, ...]:
@@ -2864,6 +2864,23 @@ class Birthdate(Model):
2864
2864
  year: Option[int] = Nothing
2865
2865
  """Optional. Year of the user's birth."""
2866
2866
 
2867
+ @property
2868
+ def is_birthday(self) -> bool:
2869
+ """True, if today is a user's birthday."""
2870
+
2871
+ now = datetime.now()
2872
+ return now.month == self.month and now.day == self.day
2873
+
2874
+ @property
2875
+ def age(self) -> Option[int]:
2876
+ """Optional. Contains the user's age, if the user has a birth year specified."""
2877
+
2878
+ return self.year.map(
2879
+ lambda year: (
2880
+ (datetime.now() - datetime(year, self.month, self.day)) // 365
2881
+ ).days
2882
+ )
2883
+
2867
2884
 
2868
2885
  class BusinessIntro(Model):
2869
2886
  """Object `BusinessIntro`, see the [documentation](https://core.telegram.org/bots/api#businessintro).
@@ -2902,11 +2919,11 @@ class BusinessOpeningHoursInterval(Model):
2902
2919
 
2903
2920
  opening_minute: int
2904
2921
  """The minute's sequence number in a week, starting on Monday, marking the
2905
- start of the time interval during which the business is open; 0 - 7 24 60."""
2922
+ start of the time interval during which the business is open; 0 - 7 * 24 * 60."""
2906
2923
 
2907
2924
  closing_minute: int
2908
2925
  """The minute's sequence number in a week, starting on Monday, marking the
2909
- end of the time interval during which the business is open; 0 - 8 24 60."""
2926
+ end of the time interval during which the business is open; 0 - 8 * 24 * 60."""
2910
2927
 
2911
2928
 
2912
2929
  class BusinessOpeningHours(Model):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: telegrinder
3
- Version: 0.1.dev162
3
+ Version: 0.1.dev163
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
@@ -5,7 +5,7 @@ telegrinder/api/api.py,sha256=6gq39odyNjyu58l7UrZKnOTMbgA5pR9nJ4ArAJFxNEY,2442
5
5
  telegrinder/api/error.py,sha256=KjZ-14L3xY3KB0VvKktspnzRpkMBCmtwP-rg_hbohwM,425
6
6
  telegrinder/api/response.py,sha256=d7Oxd5kOdbZNJiALkzkecHl8Y3K_BzCmsRq2Sn3otqA,491
7
7
  telegrinder/bot/__init__.py,sha256=tLEUne5ftvKUVlkMAtPTO1_TSHkYJBbG73LuiBeC7gk,1560
8
- telegrinder/bot/bot.py,sha256=7kft0Iz_RgpdMZpDkWgdlJ1DuVuFENgtKQGRPd7SNDs,2234
8
+ telegrinder/bot/bot.py,sha256=iOmbJ9bXL5P2NG_cO4n8lGyAr-QTv5idfwo4xtsdWjc,2195
9
9
  telegrinder/bot/cute_types/__init__.py,sha256=HeuWq297lY209MssrEbj5MsxsGfOhwVLo1pH_-pHv_I,295
10
10
  telegrinder/bot/cute_types/base.py,sha256=DDIJCCW-R6OxXp806aFSAdK88WSmzNPgUe1uzx6hgiI,4542
11
11
  telegrinder/bot/cute_types/callback_query.py,sha256=gSohTLjq9IQimya41Vl6i8HvGSKwLzbkjV00Jgp13QY,20270
@@ -17,7 +17,7 @@ telegrinder/bot/dispatch/__init__.py,sha256=o10t98PY1BuIGaJcloxfbgUYp0bf5ZqAaBQS
17
17
  telegrinder/bot/dispatch/abc.py,sha256=3bOKEFJTKarwqWTDqhscVw2U5FBllJ-TyId-aUPzb7c,454
18
18
  telegrinder/bot/dispatch/composition.py,sha256=0UbXqTxcs0X_DGB5COR6n_9RZBIhn83O2-1UNVoZQ8E,2558
19
19
  telegrinder/bot/dispatch/context.py,sha256=Uk_GFN3wlLuS5BGgBaLfLxU8xBp_yB4fPJcuzEd1ti4,2093
20
- telegrinder/bot/dispatch/dispatch.py,sha256=eBwfUPdOHtFmZ1UWPfw1NuLbVg2QtceqotNHJtqnIMM,3791
20
+ telegrinder/bot/dispatch/dispatch.py,sha256=UyzqfsYTfr-gXo12NbJcYLi6Y8ZorRYEE3H0DU1bT8s,3818
21
21
  telegrinder/bot/dispatch/handler/__init__.py,sha256=mzchbArrm0eoTEeVKHYrtJX4WSfW5t6T4xDU3-mtYaA,169
22
22
  telegrinder/bot/dispatch/handler/abc.py,sha256=ffa9zmIcaIkIuQk8JKBty2pf53woH6hzIkQb0wmqA3k,573
23
23
  telegrinder/bot/dispatch/handler/func.py,sha256=B2rUH5Adm5RI4bE-49cbf5FCYTxsw2M3cJ-2GMctC0o,2085
@@ -32,7 +32,7 @@ telegrinder/bot/dispatch/return_manager/inline_query.py,sha256=erJ54AXSG_1lACnzm
32
32
  telegrinder/bot/dispatch/return_manager/message.py,sha256=eXjQEm1qBv5W9MfvdAfleytarR7UY_Ksnpv4EAaMfQY,824
33
33
  telegrinder/bot/dispatch/view/__init__.py,sha256=iMReW_At2YzenjUGOgrVnOcHLVJAIQAfI9DdQElZdcM,379
34
34
  telegrinder/bot/dispatch/view/abc.py,sha256=YJ_FI1SkF2bMg6yFjz2JuvwE7j_Qv6_jky-Ytfe_1Ow,4685
35
- telegrinder/bot/dispatch/view/box.py,sha256=PbIZrAArerS0DjrltTtDorUNqTMyTaXKyF_F6KwMHzc,1197
35
+ telegrinder/bot/dispatch/view/box.py,sha256=Le7HbD9Obl-P_5nnmwptKkv8VBNlBAfWmlPWFnerUos,1240
36
36
  telegrinder/bot/dispatch/view/callback_query.py,sha256=iL6DbB8ucXGvlv0w8eyMeZ94S1xz181pIn2yvYK1N_8,636
37
37
  telegrinder/bot/dispatch/view/inline_query.py,sha256=ZcT1iCE8uRQ_PeaXGcOsXrMmIl2ow0YTTtDzuQ2kgjU,527
38
38
  telegrinder/bot/dispatch/view/message.py,sha256=U80vO8tFtVsMfZHMA_LU9HunLB7nw0vbgEBltyZaSzk,498
@@ -43,7 +43,7 @@ telegrinder/bot/dispatch/waiter_machine/short_state.py,sha256=tmvoeJNA7c4h30khkl
43
43
  telegrinder/bot/polling/__init__.py,sha256=OqfIFPS_V6UrCg-vCv9pkMFzTKdNbDP2faBfATs_TGg,94
44
44
  telegrinder/bot/polling/abc.py,sha256=-5BpX55SJfDlEJWt15yOXWCizQRrgeY5oiA5eHkm1Nw,434
45
45
  telegrinder/bot/polling/polling.py,sha256=GPXXlAhI81PZVUMGXsPd4j67GO19zozMRJaVNAgsBMg,4280
46
- telegrinder/bot/rules/__init__.py,sha256=d53pGSOmyGwG810JoorPZ0wBArZCbiWmk1hYoDQL7FY,2047
46
+ telegrinder/bot/rules/__init__.py,sha256=4jBfvj6-xLt7bpEPUOUlcG7it-HLrGMzLbDQ4gYwUNc,2119
47
47
  telegrinder/bot/rules/abc.py,sha256=yqHIvvSuBTser6UCJgnVj1HHh7gfghzYaoV9hAFhfFM,3676
48
48
  telegrinder/bot/rules/adapter/__init__.py,sha256=jFWpi3te8n-Ega3caCwLiA3iTW7F86brae0TZzH_BaU,231
49
49
  telegrinder/bot/rules/adapter/abc.py,sha256=VxRGQbNtdfA6gZyTk0JjJBdB5n_7g6uwseewtovZEK8,558
@@ -57,7 +57,7 @@ telegrinder/bot/rules/func.py,sha256=rhLXf6FjS0p3Nx1ZHqmV7uelUYJOkCf1gwc-SZSyRCo
57
57
  telegrinder/bot/rules/fuzzy.py,sha256=ReweSKmql4a6AHFv2tXqCQoGktYpeezBLWvW_hS1YJg,712
58
58
  telegrinder/bot/rules/inline.py,sha256=iN3BQr-TabRBItk0Gcy_YeqPhebnVmKgP1c_MEMpR_Q,1950
59
59
  telegrinder/bot/rules/integer.py,sha256=iZWctQQbrUV5kIhv8GI-O3iYzeI2d0dUdQ8uCaLB9gQ,531
60
- telegrinder/bot/rules/is_from.py,sha256=lnpbu9WXXc_sTyrPZxOjBOhZlw1JCD10j2wCG2yXJFQ,4753
60
+ telegrinder/bot/rules/is_from.py,sha256=WdKAuU9tY9BaRt0997nCM4RKqw4jHjpSLlQIW4dgSWw,5263
61
61
  telegrinder/bot/rules/markup.py,sha256=bgLm4-GKxWB1jm0ZDcKFcqnU5OaKEpJHuiVhWuJqyhc,1107
62
62
  telegrinder/bot/rules/mention.py,sha256=ozXV3awsrJhkFKrTvPEl1iyVkDs0GWMmuRSLSnSdOmo,493
63
63
  telegrinder/bot/rules/message_entities.py,sha256=_lWHCNymbV1Sv-f2Q8Ca3SOxqIPSHVyVXgfYIBPy9dE,1096
@@ -71,11 +71,11 @@ telegrinder/bot/scenario/checkbox.py,sha256=H5XuhAwwvyJbMdVpRLDzCXg2VKDU029OnDbg
71
71
  telegrinder/bot/scenario/choice.py,sha256=-NYyzgfGI0njVuT-EY0j3jS4tPlsKOEkZaUagtns7dE,1442
72
72
  telegrinder/client/__init__.py,sha256=ZiS1Wb_l_kv3FHzEEi1oXtFLwlA_HXmWOzeN0xA3E7Y,104
73
73
  telegrinder/client/abc.py,sha256=OxsTX_PLYBEeFT9zpidFUzAbQL9BM7rQqru7zdn5DiQ,1611
74
- telegrinder/client/aiohttp.py,sha256=vGJDAttRVasDZJn39KgUFFZ0nowf7iXTRKcFTO85vwQ,4163
74
+ telegrinder/client/aiohttp.py,sha256=RLhjWy-RGZ7848o75ASXBD9bqo06gaPfOv3d8QlyRYI,4147
75
75
  telegrinder/model.py,sha256=VEM7meEQ8O7Gdt1cBGLjQxJODPqE4Q7lppeYWVchXYA,4380
76
76
  telegrinder/modules.py,sha256=wJM8C1MbciJE-T3iPmxNXpHEQxO1ln35eDv7joRDNwc,7977
77
77
  telegrinder/msgspec_json.py,sha256=phfyhUvYYZUGEcI6RAyRx9lnARPK_Fqtw3Q0MEJnuUk,226
78
- telegrinder/msgspec_utils.py,sha256=LBnKjzqcndpWTCbAMkLdhsvodAWClcVffVwDPQqwXD0,6702
78
+ telegrinder/msgspec_utils.py,sha256=ZA_qj36FabalE65J82j_Hp34umHhUFbNIOt8CBYbqvA,7987
79
79
  telegrinder/node/__init__.py,sha256=01XTe8GPUBp5LXayDshihTxre7ejf99NYte20d08JLM,706
80
80
  telegrinder/node/attachment.py,sha256=vMnD2tWQQQ6PFuXEIq2ZdL91xcBxiwlAkMkqJqseLlk,2587
81
81
  telegrinder/node/base.py,sha256=iszAnP2pD3REDpUfufbVyJmg0rkXt2-ByeG6LgmS7Zc,2221
@@ -83,7 +83,7 @@ telegrinder/node/composer.py,sha256=f6l8qLjewu6lJTcxAucKyiQ4t-4d614YF6ssk9kYCZg,
83
83
  telegrinder/node/container.py,sha256=sECP3TyC6AaNcJqKOfrL1T7-N8fkZzP2vB84kku6Jxg,636
84
84
  telegrinder/node/message.py,sha256=2IW6DjF0KqH2_TZbZ-MXNsDioQRVPg9TUt86aQos0Kk,415
85
85
  telegrinder/node/rule.py,sha256=VGmS4lJAFCoR0hCZSLn56fonMt0FhOGyZ1BQn_1vgeg,1724
86
- telegrinder/node/source.py,sha256=ccKuqgA9pzAavE0krp_q0joHcz6uWjSyxO2wHSp2p1I,820
86
+ telegrinder/node/source.py,sha256=D5X5mOUM7qdffuDeN26DH3Y19WdkCRT080SFQYcAxFw,736
87
87
  telegrinder/node/text.py,sha256=4kVMHvYRi0hxztVNT4Cv0DvUoI9QSn7NIYMG4U-uqYM,303
88
88
  telegrinder/node/tools/__init__.py,sha256=TI_o7MbS4DUOSkNNgJGLocXfRybPFv2WOhBty058wrY,57
89
89
  telegrinder/node/tools/generator.py,sha256=bc3kJSvS2TdIcBXkEbI4tpfhnvVe16m9ba5-WcIPy0c,1025
@@ -94,14 +94,14 @@ telegrinder/tools/buttons.py,sha256=qMvtpawzkjdqopqE7o9C0k-no1dGJVy5gjFX4SiOE6A,
94
94
  telegrinder/tools/error_handler/__init__.py,sha256=WmYWZCNhhSk32j4lIOltEwzoYUx086TGTbOF5h3Ps7s,207
95
95
  telegrinder/tools/error_handler/abc.py,sha256=1w-X7dncSyO5ouv6r_LAnywFRGYz7SgA79eNfTqMG3M,881
96
96
  telegrinder/tools/error_handler/error.py,sha256=jVp3J4pMkkL20QHvDtlid9hKtAc66jZIcpsecB3-f98,188
97
- telegrinder/tools/error_handler/error_handler.py,sha256=vu32XqmUwcWbSl3UlF1Iv59SI-afSY5UeeDVrRCuAiU,5993
97
+ telegrinder/tools/error_handler/error_handler.py,sha256=LIAQNSTb14AhKhvhddhW4EQCwBpyNjAZJZSfcy4Fsas,5993
98
98
  telegrinder/tools/formatting/__init__.py,sha256=_oxb-4y_vyIgALlO2rfaa-azqicySpHHIcaYBrVPdSg,1609
99
99
  telegrinder/tools/formatting/html.py,sha256=-tvN1zJK_Q7evil3-XgRdvsdYsOgaG9eX2KsIQkt0m8,8718
100
100
  telegrinder/tools/formatting/links.py,sha256=ABglEz8EA6XitSM5xJt2FU78ffUdXVNbziJUjoUjKnI,1074
101
101
  telegrinder/tools/formatting/spec_html_formats.py,sha256=VMPw39IQEM7XUy0r9uzpkGfYmyE2ItJiSEmXCbyKUuE,2750
102
102
  telegrinder/tools/global_context/__init__.py,sha256=QcNZpVTS-ZsPGdF4BQ10wnrfr1fZ3jX9aI-6It0nQxE,282
103
103
  telegrinder/tools/global_context/abc.py,sha256=twwAmbTk49KGl_POImr4yj6POr-zdx8mz74McuphZH0,1644
104
- telegrinder/tools/global_context/global_context.py,sha256=wA22ouq9FmIFnJa1Bwf0GUxsiy1Cn7E8rQOrXyvbWF4,13860
104
+ telegrinder/tools/global_context/global_context.py,sha256=hXlGkU2M4Cw8m_-b1uFZojlVDkhzUhNfBFbp-nr78eE,13947
105
105
  telegrinder/tools/global_context/telegrinder_ctx.py,sha256=g4iXYlK2IEi2sbJz1MqfBIDBrqF_4vznddjOUSEW8f8,651
106
106
  telegrinder/tools/i18n/__init__.py,sha256=CLUoiCJzOZzF-dqDIHZ5Fc8QUa38cYhIG4WF-ctPLfE,288
107
107
  telegrinder/tools/i18n/base.py,sha256=sJwgw6lobMIQEKIC4QH5O4sPKZADHAcxltZJvTtvaFE,637
@@ -115,13 +115,13 @@ telegrinder/tools/keyboard.py,sha256=TZ5vVRQKbXrVqZNnok9jrbwNQYSaGpA41wsGHUNJkwo
115
115
  telegrinder/tools/loop_wrapper/__init__.py,sha256=os6kfzNEpGa7EHBbwFpym-iEnQvJGokEyHtyuVIOtks,143
116
116
  telegrinder/tools/loop_wrapper/abc.py,sha256=nUr2o24jaja4mpCcvbZRxHYq4hDsnGReC9yYHacQ4pw,443
117
117
  telegrinder/tools/loop_wrapper/loop_wrapper.py,sha256=ZEwuqqEz-r5BehCRG-E5K1lg2i4ODyyhOh0iKFT8GDw,4306
118
- telegrinder/tools/magic.py,sha256=TUHl-tsDWMLZSDykk8ezOYPifRqGg0wqje6XxCUMo0U,1837
118
+ telegrinder/tools/magic.py,sha256=AA7jVv5NNOepWjv8rdPdUmeYj7_XfeCl3laYdRreZc0,1856
119
119
  telegrinder/tools/parse_mode.py,sha256=JyQ-x9YAMPLhIIiUX01acyKkpWgs5TBA07W-iUyPHpE,92
120
120
  telegrinder/types/__init__.py,sha256=pvPKWDXq9PBiIOCW8dFcJMqgr1kAqodPhwT-u8I4kug,78
121
121
  telegrinder/types/enums.py,sha256=9ZYiz_KRP1o7jB5If6730YLDfLt_-wKVK8UFs5a6CVI,18330
122
122
  telegrinder/types/methods.py,sha256=CbeuZgtH5IIH1cKZlMWVkTnNAFqQLOYLw-_DeWHKKhk,186385
123
- telegrinder/types/objects.py,sha256=ZezgvcBKs9gj0QAOrXg3iM-MvoA7hnS47tmPovWf780,214297
124
- telegrinder-0.1.dev162.dist-info/LICENSE,sha256=J9ngGsqHCNNjpm3xYPT7EnlzsnjhfqNXej5mJFjM6lw,1094
125
- telegrinder-0.1.dev162.dist-info/METADATA,sha256=qA5wDXMLI31op7upuE_WYkSKwhMvJ6TkskNGX6cuEdE,2892
126
- telegrinder-0.1.dev162.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
127
- telegrinder-0.1.dev162.dist-info/RECORD,,
123
+ telegrinder/types/objects.py,sha256=znpGLbPrFu5GCUf4j6p_XA7iCVaxYqUZN1UqBEpr5FY,214803
124
+ telegrinder-0.1.dev163.dist-info/LICENSE,sha256=J9ngGsqHCNNjpm3xYPT7EnlzsnjhfqNXej5mJFjM6lw,1094
125
+ telegrinder-0.1.dev163.dist-info/METADATA,sha256=Njdjq7FipuHi822K2gkEmCd2HnEh5Y624RlBtzaM0_s,2892
126
+ telegrinder-0.1.dev163.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
127
+ telegrinder-0.1.dev163.dist-info/RECORD,,