telegrinder 0.1.dev163__py3-none-any.whl → 0.1.dev165__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.

Files changed (46) hide show
  1. telegrinder/__init__.py +36 -0
  2. telegrinder/bot/bot.py +9 -0
  3. telegrinder/bot/cute_types/message.py +1 -1
  4. telegrinder/bot/dispatch/abc.py +1 -1
  5. telegrinder/bot/dispatch/composition.py +15 -1
  6. telegrinder/bot/dispatch/context.py +8 -0
  7. telegrinder/bot/dispatch/dispatch.py +65 -28
  8. telegrinder/bot/dispatch/handler/abc.py +2 -4
  9. telegrinder/bot/dispatch/handler/func.py +31 -25
  10. telegrinder/bot/dispatch/handler/message_reply.py +21 -9
  11. telegrinder/bot/dispatch/middleware/abc.py +1 -1
  12. telegrinder/bot/dispatch/process.py +5 -3
  13. telegrinder/bot/dispatch/return_manager/abc.py +6 -0
  14. telegrinder/bot/dispatch/return_manager/callback_query.py +3 -1
  15. telegrinder/bot/dispatch/return_manager/inline_query.py +3 -1
  16. telegrinder/bot/dispatch/return_manager/message.py +9 -1
  17. telegrinder/bot/dispatch/view/abc.py +31 -5
  18. telegrinder/bot/dispatch/view/box.py +2 -1
  19. telegrinder/bot/dispatch/view/inline_query.py +1 -1
  20. telegrinder/bot/dispatch/view/message.py +1 -1
  21. telegrinder/bot/dispatch/waiter_machine/machine.py +14 -8
  22. telegrinder/bot/dispatch/waiter_machine/middleware.py +9 -7
  23. telegrinder/bot/dispatch/waiter_machine/short_state.py +17 -18
  24. telegrinder/bot/polling/polling.py +14 -0
  25. telegrinder/bot/rules/markup.py +1 -1
  26. telegrinder/bot/rules/text.py +1 -1
  27. telegrinder/bot/scenario/checkbox.py +16 -0
  28. telegrinder/model.py +10 -0
  29. telegrinder/msgspec_utils.py +13 -2
  30. telegrinder/node/base.py +1 -1
  31. telegrinder/node/composer.py +1 -1
  32. telegrinder/tools/__init__.py +2 -1
  33. telegrinder/tools/error_handler/abc.py +3 -3
  34. telegrinder/tools/error_handler/error_handler.py +21 -21
  35. telegrinder/tools/formatting/html.py +6 -12
  36. telegrinder/tools/formatting/links.py +12 -6
  37. telegrinder/tools/formatting/spec_html_formats.py +4 -5
  38. telegrinder/tools/global_context/global_context.py +2 -2
  39. telegrinder/tools/loop_wrapper/__init__.py +2 -2
  40. telegrinder/tools/loop_wrapper/abc.py +1 -4
  41. telegrinder/tools/loop_wrapper/loop_wrapper.py +79 -33
  42. telegrinder/verification_utils.py +31 -0
  43. {telegrinder-0.1.dev163.dist-info → telegrinder-0.1.dev165.dist-info}/METADATA +1 -1
  44. {telegrinder-0.1.dev163.dist-info → telegrinder-0.1.dev165.dist-info}/RECORD +46 -45
  45. {telegrinder-0.1.dev163.dist-info → telegrinder-0.1.dev165.dist-info}/WHEEL +1 -1
  46. {telegrinder-0.1.dev163.dist-info → telegrinder-0.1.dev165.dist-info}/LICENSE +0 -0
@@ -5,12 +5,33 @@ import typing
5
5
 
6
6
  from telegrinder.modules import logger
7
7
 
8
- from .abc import ABCLoopWrapper, CoroutineFunc, CoroutineTask
8
+ from .abc import ABCLoopWrapper
9
+
10
+ T = typing.TypeVar("T")
11
+ P = typing.ParamSpec("P")
12
+ CoroFunc = typing.TypeVar("CoroFunc", bound="CoroutineFunc")
13
+
14
+ CoroutineTask: typing.TypeAlias = typing.Coroutine[typing.Any, typing.Any, T]
15
+ CoroutineFunc: typing.TypeAlias = typing.Callable[P, CoroutineTask[T]]
16
+ Task: typing.TypeAlias = typing.Union[CoroutineFunc, CoroutineTask, "DelayedTask"]
17
+
18
+
19
+ def run_tasks(tasks: list[CoroutineTask[typing.Any]], loop: asyncio.AbstractEventLoop) -> None:
20
+ while len(tasks) != 0:
21
+ loop.run_until_complete(tasks.pop(0))
22
+
23
+
24
+ def to_coroutine_task(task: Task) -> CoroutineTask:
25
+ if asyncio.iscoroutinefunction(task) or isinstance(task, DelayedTask):
26
+ task = task()
27
+ elif not asyncio.iscoroutine(task):
28
+ raise TypeError("Task should be coroutine or coroutine function.")
29
+ return task
9
30
 
10
31
 
11
32
  @dataclasses.dataclass
12
- class DelayedTask:
13
- handler: CoroutineFunc
33
+ class DelayedTask(typing.Generic[CoroFunc]):
34
+ handler: CoroFunc
14
35
  seconds: float
15
36
  repeat: bool = dataclasses.field(default=False, kw_only=True)
16
37
  _cancelled: bool = dataclasses.field(default=False, init=False, repr=False)
@@ -33,28 +54,59 @@ class DelayedTask:
33
54
  self._cancelled = True
34
55
 
35
56
 
57
+ @dataclasses.dataclass(kw_only=True)
58
+ class Lifespan:
59
+ startup_tasks: list[CoroutineTask[typing.Any]] = dataclasses.field(default_factory=lambda: [])
60
+ shutdown_tasks: list[CoroutineTask[typing.Any]] = dataclasses.field(default_factory=lambda: [])
61
+
62
+ def on_startup(self, task_or_func: Task) -> Task:
63
+ task_or_func = to_coroutine_task(task_or_func)
64
+ self.startup_tasks.append(task_or_func)
65
+ return task_or_func
66
+
67
+ def on_shutdown(self, task_or_func: Task) -> Task:
68
+ task_or_func = to_coroutine_task(task_or_func)
69
+ self.shutdown_tasks.append(task_or_func)
70
+ return task_or_func
71
+
72
+ def start(self, loop: asyncio.AbstractEventLoop) -> None:
73
+ run_tasks(self.startup_tasks, loop)
74
+
75
+ def shutdown(self, loop: asyncio.AbstractEventLoop) -> None:
76
+ run_tasks(self.shutdown_tasks, loop)
77
+
78
+
36
79
  class LoopWrapper(ABCLoopWrapper):
37
- def __init__(self, tasks: list[CoroutineTask] | None = None):
38
- self.on_startup: list[CoroutineTask] = []
39
- self.on_shutdown: list[CoroutineTask] = []
40
- self.tasks = tasks or []
80
+ def __init__(
81
+ self,
82
+ *,
83
+ tasks: list[CoroutineTask[typing.Any]] | None = None,
84
+ lifespan: Lifespan | None = None,
85
+ ) -> None:
86
+ self.tasks: list[CoroutineTask[typing.Any]] = tasks or []
87
+ self.lifespan = lifespan or Lifespan()
41
88
  self._loop = asyncio.new_event_loop()
89
+
90
+ def __repr__(self) -> str:
91
+ return "<{}: loop={!r} with tasks={!r}, lifespan={!r}>".format(
92
+ self.__class__.__name__,
93
+ self._loop,
94
+ self.tasks,
95
+ self.lifespan,
96
+ )
42
97
 
43
98
  def run_event_loop(self) -> None:
44
99
  if not self.tasks:
45
100
  logger.warning("You run loop with 0 tasks!")
46
101
 
47
- for startup_task in self.on_startup:
48
- self._loop.run_until_complete(startup_task)
49
- for task in self.tasks:
50
- self._loop.create_task(task)
51
-
52
- self.tasks.clear()
102
+ self.lifespan.start(self._loop)
103
+ run_tasks(self.tasks, self._loop)
53
104
  tasks = asyncio.all_tasks(self._loop)
105
+
54
106
  try:
55
107
  while tasks:
56
108
  tasks_results, _ = self._loop.run_until_complete(
57
- asyncio.wait(tasks, return_when=asyncio.FIRST_EXCEPTION)
109
+ asyncio.wait(tasks, return_when=asyncio.FIRST_EXCEPTION),
58
110
  )
59
111
  for task_result in tasks_results:
60
112
  try:
@@ -64,19 +116,15 @@ class LoopWrapper(ABCLoopWrapper):
64
116
  tasks = asyncio.all_tasks(self._loop)
65
117
  except KeyboardInterrupt:
66
118
  print() # blank print for ^C
67
- logger.info("KeyboardInterrupt")
119
+ logger.info("Caught KeyboardInterrupt, cancellation...")
68
120
  self.complete_tasks(tasks)
69
121
  finally:
70
- for shutdown_task in self.on_shutdown:
71
- self._loop.run_until_complete(shutdown_task)
122
+ self.lifespan.shutdown(self._loop)
72
123
  if self._loop.is_running():
73
124
  self._loop.close()
74
125
 
75
- def add_task(self, task: CoroutineFunc | CoroutineTask | DelayedTask):
76
- if asyncio.iscoroutinefunction(task) or isinstance(task, DelayedTask):
77
- task = task()
78
- elif not asyncio.iscoroutine(task):
79
- raise TypeError("Task should be coroutine or coroutine function.")
126
+ def add_task(self, task: Task) -> None:
127
+ task = to_coroutine_task(task)
80
128
 
81
129
  if self._loop and self._loop.is_running():
82
130
  self._loop.create_task(task)
@@ -97,15 +145,14 @@ class LoopWrapper(ABCLoopWrapper):
97
145
  hours: int = 0,
98
146
  minutes: int = 0,
99
147
  seconds: float = 0,
100
- ) -> typing.Callable[[typing.Callable], DelayedTask]:
148
+ ):
101
149
  seconds += minutes * 60
102
150
  seconds += hours * 60 * 60
103
151
  seconds += days * 24 * 60 * 60
104
152
 
105
- def decorator(func: typing.Callable) -> DelayedTask:
106
- delayed_task = DelayedTask(func, seconds, repeat=False)
107
- self.add_task(delayed_task)
108
- return delayed_task
153
+ def decorator(func: CoroFunc) -> CoroFunc:
154
+ self.add_task(DelayedTask(func, seconds, repeat=False))
155
+ return func
109
156
 
110
157
  return decorator
111
158
 
@@ -116,17 +163,16 @@ class LoopWrapper(ABCLoopWrapper):
116
163
  hours: int = 0,
117
164
  minutes: int = 0,
118
165
  seconds: float = 0,
119
- ) -> typing.Callable[[typing.Callable], DelayedTask]:
166
+ ):
120
167
  seconds += minutes * 60
121
168
  seconds += hours * 60 * 60
122
169
  seconds += days * 24 * 60 * 60
123
170
 
124
- def decorator(func: typing.Callable) -> DelayedTask:
125
- delayed_task = DelayedTask(func, seconds, repeat=True)
126
- self.add_task(delayed_task)
127
- return delayed_task
171
+ def decorator(func: CoroFunc) -> CoroFunc:
172
+ self.add_task(DelayedTask(func, seconds, repeat=True))
173
+ return func
128
174
 
129
175
  return decorator
130
176
 
131
177
 
132
- __all__ = ("DelayedTask", "LoopWrapper")
178
+ __all__ = ("DelayedTask", "Lifespan", "LoopWrapper", "to_coroutine_task")
@@ -0,0 +1,31 @@
1
+ import hashlib
2
+ import hmac
3
+ import typing
4
+
5
+ from telegrinder.api.abc import Token
6
+
7
+
8
+ def verify_webapp_request(secret_token: str, request_headers: typing.Mapping[str, typing.Any]) -> bool:
9
+ """Verifies update request is from telegram."""
10
+
11
+ return request_headers.get("X-Telegram-Bot-Api-Secret-Token") == secret_token
12
+
13
+
14
+ def webapp_validate_request(
15
+ bot_token: Token,
16
+ request_query_params: typing.Mapping[str, typing.Any],
17
+ ) -> bool:
18
+ """Verifies authentity of webapp request by counting hash of its parameters."""
19
+
20
+ items = sorted(request_query_params.items(), key=lambda kv: kv[0])
21
+ data_check_string = "\n".join(f"{k}={param}" for k, param in items if k != "hash")
22
+ secret = hmac.new(
23
+ "WebAppData".encode(),
24
+ bot_token.encode(),
25
+ hashlib.sha256,
26
+ ).digest()
27
+ data_chk = hmac.new(secret, data_check_string.encode(), hashlib.sha256)
28
+ return data_chk.hexdigest() == request_query_params.get("hash")
29
+
30
+
31
+ __all__ = ("verify_webapp_request", "webapp_validate_request")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: telegrinder
3
- Version: 0.1.dev163
3
+ Version: 0.1.dev165
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
@@ -1,48 +1,48 @@
1
- telegrinder/__init__.py,sha256=iAaXnpZbc6xcdpHv56K6Hbi8KFryT--wC8UZo4sOUXk,2859
1
+ telegrinder/__init__.py,sha256=UWGzZrq4fnPTEiJr4lMBSK8gsnB4oV-v5YW7fOzTvKc,3593
2
2
  telegrinder/api/__init__.py,sha256=pIDtnsL0NwT5PgVm43Gkp-ByOqDsqnD-oFDiC9tcPT4,246
3
3
  telegrinder/api/abc.py,sha256=5pK6zqZtLphnOVAYwa8sT15F940gCQNzy53nyUTZWWQ,1803
4
4
  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=iOmbJ9bXL5P2NG_cO4n8lGyAr-QTv5idfwo4xtsdWjc,2195
8
+ telegrinder/bot/bot.py,sha256=TLpdgIWEvjAooMOL1hsIkAsdRZFJiZvRErIxLJWqYCw,2472
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
12
12
  telegrinder/bot/cute_types/inline_query.py,sha256=QmaYkXSOQHrkWs7N6eD_HiTGGOtegN10hVppU37z3bE,2475
13
- telegrinder/bot/cute_types/message.py,sha256=xYlbHfKP1kbVpUXOLed8yCuxW8v1cD7lV6NMopyq0PI,140752
13
+ telegrinder/bot/cute_types/message.py,sha256=lf5exKXqD0SzpJKGPj5y7umD0pq3qegUhANEKYjPlsA,140760
14
14
  telegrinder/bot/cute_types/update.py,sha256=VakZ2FwapOJvpEBIyzuiT8eftHHzBS-uPXrAUROQxOg,752
15
15
  telegrinder/bot/cute_types/utils.py,sha256=Gp7zHUn5gEfxFItIYbzkaj6wxWoPNe7hM9abHkn3Jug,16349
16
16
  telegrinder/bot/dispatch/__init__.py,sha256=o10t98PY1BuIGaJcloxfbgUYp0bf5ZqAaBQScIaV3VQ,1322
17
- telegrinder/bot/dispatch/abc.py,sha256=3bOKEFJTKarwqWTDqhscVw2U5FBllJ-TyId-aUPzb7c,454
18
- telegrinder/bot/dispatch/composition.py,sha256=0UbXqTxcs0X_DGB5COR6n_9RZBIhn83O2-1UNVoZQ8E,2558
19
- telegrinder/bot/dispatch/context.py,sha256=Uk_GFN3wlLuS5BGgBaLfLxU8xBp_yB4fPJcuzEd1ti4,2093
20
- telegrinder/bot/dispatch/dispatch.py,sha256=UyzqfsYTfr-gXo12NbJcYLi6Y8ZorRYEE3H0DU1bT8s,3818
17
+ telegrinder/bot/dispatch/abc.py,sha256=YX184RfqSTMtxrt6qyNRu9uhlPHJLEJY3RKsLfBV7nw,462
18
+ telegrinder/bot/dispatch/composition.py,sha256=EcIgiFJm1v7y8uaumrvBl-43vl8pABbjYLdgVNp4M-s,2973
19
+ telegrinder/bot/dispatch/context.py,sha256=ozsL1oy5BGjXADzVT-qhe8YohMxc-ORQKfUaKNbYm-Q,2322
20
+ telegrinder/bot/dispatch/dispatch.py,sha256=NSPLNAUu2q2-73JXLPAatF5cej1ySZykeiHaQD4XFhE,5048
21
21
  telegrinder/bot/dispatch/handler/__init__.py,sha256=mzchbArrm0eoTEeVKHYrtJX4WSfW5t6T4xDU3-mtYaA,169
22
- telegrinder/bot/dispatch/handler/abc.py,sha256=ffa9zmIcaIkIuQk8JKBty2pf53woH6hzIkQb0wmqA3k,573
23
- telegrinder/bot/dispatch/handler/func.py,sha256=B2rUH5Adm5RI4bE-49cbf5FCYTxsw2M3cJ-2GMctC0o,2085
24
- telegrinder/bot/dispatch/handler/message_reply.py,sha256=pfFINSLwTsx9buHwVW1ahVRWYQZn0QKyIazkO8D5MVo,1425
22
+ telegrinder/bot/dispatch/handler/abc.py,sha256=Qi7MDVlUdvMZYqYis3HuSoSW6KF23q3nqfvQ8FM5sEw,569
23
+ telegrinder/bot/dispatch/handler/func.py,sha256=IvDWA3ybQUcxXBOeEwteKeIVKp9-Lj9EEfKf2IIVQ40,2369
24
+ telegrinder/bot/dispatch/handler/message_reply.py,sha256=rpBRDHuJ4PdCUKq0CtFWgs7jCS4PlcgYoPFr6QOYpgw,1827
25
25
  telegrinder/bot/dispatch/middleware/__init__.py,sha256=qDuTt2ZZKX9UMjPdw5xaaNZdMI-i3P4Px2T8qbYCMJw,61
26
- telegrinder/bot/dispatch/middleware/abc.py,sha256=RWmr1agbvCabsh-m1WeQORi-Lrkt1xRBidKkugzA41Y,421
27
- telegrinder/bot/dispatch/process.py,sha256=Z4iNCwqZQyBogGxFzeNK7Pbk3ldH_e0Z95AE9sm5R-0,2267
26
+ telegrinder/bot/dispatch/middleware/abc.py,sha256=mF_G22pes-qJg6wqK9Tf71sduODXSyPjWyPT1hAiDo0,429
27
+ telegrinder/bot/dispatch/process.py,sha256=J9MYuP-soXXa0eFjJ-5wE_bNEFmr4SukJzdajDSTfAw,2313
28
28
  telegrinder/bot/dispatch/return_manager/__init__.py,sha256=-4h9nU-vdyPgv7bqKi1fAlfzNOKTO9m9FtdTZOhrmuc,447
29
- telegrinder/bot/dispatch/return_manager/abc.py,sha256=dGPwsIUJW_6SRsNxSiWS69xOOwSOATzMP2a7FoD90sA,3150
30
- telegrinder/bot/dispatch/return_manager/callback_query.py,sha256=FV_bVdJRbtVNRvf_CvL1V5EFZqS83VqZQOWUi1x3pxk,624
31
- telegrinder/bot/dispatch/return_manager/inline_query.py,sha256=erJ54AXSG_1lACnzmP1CIQYT4RkHT4Ml5PeRD1bkHK4,452
32
- telegrinder/bot/dispatch/return_manager/message.py,sha256=eXjQEm1qBv5W9MfvdAfleytarR7UY_Ksnpv4EAaMfQY,824
29
+ telegrinder/bot/dispatch/return_manager/abc.py,sha256=5EWmdQJExdHkbmpqK4ZBU3Uj-aCkfnTp9B94KRU7-40,3346
30
+ telegrinder/bot/dispatch/return_manager/callback_query.py,sha256=LIkXTGGyEnAHY-L_F82sbtzQtjvOHBi2GeL2eiWsEFc,656
31
+ telegrinder/bot/dispatch/return_manager/inline_query.py,sha256=-GRnPcdnNamtKL0IbbxCynyO3Dimk9Uz-_-wegfr1h4,484
32
+ telegrinder/bot/dispatch/return_manager/message.py,sha256=MNML9jGAAkmza1bwUOQVn9l2FmFqGHP4npub6TM_vqs,1139
33
33
  telegrinder/bot/dispatch/view/__init__.py,sha256=iMReW_At2YzenjUGOgrVnOcHLVJAIQAfI9DdQElZdcM,379
34
- telegrinder/bot/dispatch/view/abc.py,sha256=YJ_FI1SkF2bMg6yFjz2JuvwE7j_Qv6_jky-Ytfe_1Ow,4685
35
- telegrinder/bot/dispatch/view/box.py,sha256=Le7HbD9Obl-P_5nnmwptKkv8VBNlBAfWmlPWFnerUos,1240
34
+ telegrinder/bot/dispatch/view/abc.py,sha256=E6fB_WRsX3y1i84_DwTYNhFyLUyOc0ougihvoxQSuFE,5564
35
+ telegrinder/bot/dispatch/view/box.py,sha256=rek4a2cxO6VTPRVXoz9KJsb0kU_rAYX2SlN-7LCZvsM,1252
36
36
  telegrinder/bot/dispatch/view/callback_query.py,sha256=iL6DbB8ucXGvlv0w8eyMeZ94S1xz181pIn2yvYK1N_8,636
37
- telegrinder/bot/dispatch/view/inline_query.py,sha256=ZcT1iCE8uRQ_PeaXGcOsXrMmIl2ow0YTTtDzuQ2kgjU,527
38
- telegrinder/bot/dispatch/view/message.py,sha256=U80vO8tFtVsMfZHMA_LU9HunLB7nw0vbgEBltyZaSzk,498
37
+ telegrinder/bot/dispatch/view/inline_query.py,sha256=hRwrgfhgS5YF0E6eUrR8FuWVHUMlnA758kG7V049lkE,531
38
+ telegrinder/bot/dispatch/view/message.py,sha256=XX-_UmVf3_12-8I4TuH7utMRKxRcVKpWknXKhnGEx44,498
39
39
  telegrinder/bot/dispatch/waiter_machine/__init__.py,sha256=RUuq-J1qZMeREL8omM8kxEfgAz3-7h3B9NhzSjLTMqA,190
40
- telegrinder/bot/dispatch/waiter_machine/machine.py,sha256=IhbbDDzRFQQFjOcq1Pzh8tSFE90o3LmxIqe0fnyMM80,3412
41
- telegrinder/bot/dispatch/waiter_machine/middleware.py,sha256=MExbbYO9Bs_fBv1UTr28mOT3iozwY-H9Yg_7Z-B4Y5U,2483
42
- telegrinder/bot/dispatch/waiter_machine/short_state.py,sha256=tmvoeJNA7c4h30khkljt3tAGp_8LUt6lONN9C3OPuSg,1124
40
+ telegrinder/bot/dispatch/waiter_machine/machine.py,sha256=RHq0x6XOl7xcT3nZICIpkaDgVibiLLIEak_mYt5jnTw,3610
41
+ telegrinder/bot/dispatch/waiter_machine/middleware.py,sha256=6i_E2VPX71wYFnjESsUoCq1PaL4T6uaSXIWTgsTu874,2556
42
+ telegrinder/bot/dispatch/waiter_machine/short_state.py,sha256=2jYjr5RM2DknakcdbTc_xvH8FCrKKvDI8tsUwG0I5Hg,1200
43
43
  telegrinder/bot/polling/__init__.py,sha256=OqfIFPS_V6UrCg-vCv9pkMFzTKdNbDP2faBfATs_TGg,94
44
44
  telegrinder/bot/polling/abc.py,sha256=-5BpX55SJfDlEJWt15yOXWCizQRrgeY5oiA5eHkm1Nw,434
45
- telegrinder/bot/polling/polling.py,sha256=GPXXlAhI81PZVUMGXsPd4j67GO19zozMRJaVNAgsBMg,4280
45
+ telegrinder/bot/polling/polling.py,sha256=IhtdF-_n77T9epntZuX6y25-pPZUkogxJelVYm308k8,4717
46
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
@@ -58,28 +58,28 @@ telegrinder/bot/rules/fuzzy.py,sha256=ReweSKmql4a6AHFv2tXqCQoGktYpeezBLWvW_hS1YJ
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
60
  telegrinder/bot/rules/is_from.py,sha256=WdKAuU9tY9BaRt0997nCM4RKqw4jHjpSLlQIW4dgSWw,5263
61
- telegrinder/bot/rules/markup.py,sha256=bgLm4-GKxWB1jm0ZDcKFcqnU5OaKEpJHuiVhWuJqyhc,1107
61
+ telegrinder/bot/rules/markup.py,sha256=pqmuEhBpnZBVyLA-P2mqgfZ_MqACeu6mDNlYPAFcr8I,1110
62
62
  telegrinder/bot/rules/mention.py,sha256=ozXV3awsrJhkFKrTvPEl1iyVkDs0GWMmuRSLSnSdOmo,493
63
63
  telegrinder/bot/rules/message_entities.py,sha256=_lWHCNymbV1Sv-f2Q8Ca3SOxqIPSHVyVXgfYIBPy9dE,1096
64
64
  telegrinder/bot/rules/regex.py,sha256=wqGEEiFqe5t_RwX9KjVCtg0wRZfwqo1ktGvNBo9JaKE,1191
65
65
  telegrinder/bot/rules/rule_enum.py,sha256=BUd78f7fEa0hfu1Paa384_Q-r0lB-ZWWukqkrFXdn58,2083
66
66
  telegrinder/bot/rules/start.py,sha256=5ok581Ww56g27rE4QkrykbBZ-ER-SnATQNzMGut2PHA,1183
67
- telegrinder/bot/rules/text.py,sha256=LaY8A2KUYDZpIllYTRSXXCwWfDN6dnFFmdvXM1nCKvA,1147
67
+ telegrinder/bot/rules/text.py,sha256=FUynYklF7VCFwOXj-cFCXWOA2N5Ul9BV9Wolbi5X72c,1158
68
68
  telegrinder/bot/scenario/__init__.py,sha256=Ehe2uH-eQ-vRBPxIzdmE23B-FBOAa9YQyndmb6K8C5E,166
69
69
  telegrinder/bot/scenario/abc.py,sha256=3AZYRjZlkbDtyFbsKdZ6BefzWYlJ0DOrGwh8jI3nzv4,474
70
- telegrinder/bot/scenario/checkbox.py,sha256=H5XuhAwwvyJbMdVpRLDzCXg2VKDU029OnDbgcANB3IE,3738
70
+ telegrinder/bot/scenario/checkbox.py,sha256=IIpC6F1JTtnH3D49R9xrXXrBd7A6klWzpDRCeBHwGg8,4202
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
74
  telegrinder/client/aiohttp.py,sha256=RLhjWy-RGZ7848o75ASXBD9bqo06gaPfOv3d8QlyRYI,4147
75
- telegrinder/model.py,sha256=VEM7meEQ8O7Gdt1cBGLjQxJODPqE4Q7lppeYWVchXYA,4380
75
+ telegrinder/model.py,sha256=OpOiiW_KEi7lwhzIT0zmqgBO-LRyzaDOdoEgPFKuXck,4675
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=ZA_qj36FabalE65J82j_Hp34umHhUFbNIOt8CBYbqvA,7987
78
+ telegrinder/msgspec_utils.py,sha256=BciLRVZh3IJHawFN3Hia-QC3SK587JhinULEigzPEtk,8213
79
79
  telegrinder/node/__init__.py,sha256=01XTe8GPUBp5LXayDshihTxre7ejf99NYte20d08JLM,706
80
80
  telegrinder/node/attachment.py,sha256=vMnD2tWQQQ6PFuXEIq2ZdL91xcBxiwlAkMkqJqseLlk,2587
81
- telegrinder/node/base.py,sha256=iszAnP2pD3REDpUfufbVyJmg0rkXt2-ByeG6LgmS7Zc,2221
82
- telegrinder/node/composer.py,sha256=f6l8qLjewu6lJTcxAucKyiQ4t-4d614YF6ssk9kYCZg,2225
81
+ telegrinder/node/base.py,sha256=rEYPjLQ5EqahyIvH9ktlk_iOiym2NGK2wzh9akVIs6I,2220
82
+ telegrinder/node/composer.py,sha256=pGB41IzjLOJz909bVP72gzB9RZF_kqt18e1etqj_GeU,2240
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
@@ -89,19 +89,19 @@ telegrinder/node/tools/__init__.py,sha256=TI_o7MbS4DUOSkNNgJGLocXfRybPFv2WOhBty0
89
89
  telegrinder/node/tools/generator.py,sha256=bc3kJSvS2TdIcBXkEbI4tpfhnvVe16m9ba5-WcIPy0c,1025
90
90
  telegrinder/node/update.py,sha256=QD-m9soBgsP3voTbhaErWdE1FciwYyJCIFNDYf_zra0,253
91
91
  telegrinder/rules.py,sha256=BFB8RFwKKxqs9HFfo_p0RfulQNonPZAX8cHpmnG7qCU,39
92
- telegrinder/tools/__init__.py,sha256=EssNbs2XHkoL-tRMB_nk5pQsgdDLg2zb0nSUY8liXIM,2878
92
+ telegrinder/tools/__init__.py,sha256=9KScN5t8fuyjN2ERf20PRu4eLBwfVtfRyE6zsJmL08E,2904
93
93
  telegrinder/tools/buttons.py,sha256=qMvtpawzkjdqopqE7o9C0k-no1dGJVy5gjFX4SiOE6A,2430
94
94
  telegrinder/tools/error_handler/__init__.py,sha256=WmYWZCNhhSk32j4lIOltEwzoYUx086TGTbOF5h3Ps7s,207
95
- telegrinder/tools/error_handler/abc.py,sha256=1w-X7dncSyO5ouv6r_LAnywFRGYz7SgA79eNfTqMG3M,881
95
+ telegrinder/tools/error_handler/abc.py,sha256=ymQGDXgnIkfjMMBsLeNcpekQ-p7lj9kSSTLFWqpZ8Ok,952
96
96
  telegrinder/tools/error_handler/error.py,sha256=jVp3J4pMkkL20QHvDtlid9hKtAc66jZIcpsecB3-f98,188
97
- telegrinder/tools/error_handler/error_handler.py,sha256=LIAQNSTb14AhKhvhddhW4EQCwBpyNjAZJZSfcy4Fsas,5993
97
+ telegrinder/tools/error_handler/error_handler.py,sha256=GpGNkEHZAv_4awk96tpJwcnm_YdI3MAfWVILS49jNQ4,5992
98
98
  telegrinder/tools/formatting/__init__.py,sha256=_oxb-4y_vyIgALlO2rfaa-azqicySpHHIcaYBrVPdSg,1609
99
- telegrinder/tools/formatting/html.py,sha256=-tvN1zJK_Q7evil3-XgRdvsdYsOgaG9eX2KsIQkt0m8,8718
100
- telegrinder/tools/formatting/links.py,sha256=ABglEz8EA6XitSM5xJt2FU78ffUdXVNbziJUjoUjKnI,1074
101
- telegrinder/tools/formatting/spec_html_formats.py,sha256=VMPw39IQEM7XUy0r9uzpkGfYmyE2ItJiSEmXCbyKUuE,2750
99
+ telegrinder/tools/formatting/html.py,sha256=QxgCSmfuESnsIsg-UjRPBcBjWNT04j1xV_6G4z9FtR8,8580
100
+ telegrinder/tools/formatting/links.py,sha256=thRwOUBoJvg7iLUD1WMeV23V7T4XUj_J4EJgLcAOXts,1334
101
+ telegrinder/tools/formatting/spec_html_formats.py,sha256=gBsPlDCOEzPMPk_wUmmNEQUFxV8USHQgBuJOyE4y0EY,2747
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=hXlGkU2M4Cw8m_-b1uFZojlVDkhzUhNfBFbp-nr78eE,13947
104
+ telegrinder/tools/global_context/global_context.py,sha256=XhrpRGYcW7I3Ke3D89ervSRZbMa6crkkiqeH8n9eqt0,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
@@ -112,16 +112,17 @@ telegrinder/tools/kb_set/__init__.py,sha256=k1KCQTnvEgJ2y4KlghhJWOh5rccwg_27cs82
112
112
  telegrinder/tools/kb_set/base.py,sha256=mbZs-ViUErfSibzyN064IqZp76LBJPg3NB4D9v4VFtg,243
113
113
  telegrinder/tools/kb_set/yaml.py,sha256=rDoVkdfxp3gz-pS82nB1LDQU8cyckErwMee4nCXHunI,2027
114
114
  telegrinder/tools/keyboard.py,sha256=TZ5vVRQKbXrVqZNnok9jrbwNQYSaGpA41wsGHUNJkwo,3738
115
- telegrinder/tools/loop_wrapper/__init__.py,sha256=os6kfzNEpGa7EHBbwFpym-iEnQvJGokEyHtyuVIOtks,143
116
- telegrinder/tools/loop_wrapper/abc.py,sha256=nUr2o24jaja4mpCcvbZRxHYq4hDsnGReC9yYHacQ4pw,443
117
- telegrinder/tools/loop_wrapper/loop_wrapper.py,sha256=ZEwuqqEz-r5BehCRG-E5K1lg2i4ODyyhOh0iKFT8GDw,4306
115
+ telegrinder/tools/loop_wrapper/__init__.py,sha256=ZQ5jmE1lOKnqJlMZ9k2OYmjvOEhOlHPijUWqZ4nHIgk,165
116
+ telegrinder/tools/loop_wrapper/abc.py,sha256=ET_Dp-kRz75Jo1fZB3qofUgEXN4FqlU0xH2diESKGCM,266
117
+ telegrinder/tools/loop_wrapper/loop_wrapper.py,sha256=A-kO6F5KzQJXkLbxe-2Vex_TNTAgpUEawyZ6JLFao2A,5702
118
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
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,,
124
+ telegrinder/verification_utils.py,sha256=zpQ_ZOJGj9Lix3gbWiHuVzIYg48jad5CqIaeu4QcfJQ,1017
125
+ telegrinder-0.1.dev165.dist-info/LICENSE,sha256=J9ngGsqHCNNjpm3xYPT7EnlzsnjhfqNXej5mJFjM6lw,1094
126
+ telegrinder-0.1.dev165.dist-info/METADATA,sha256=TePH1bhDDmVftka-P9VbCNVc5D6721ITDYM-7lWh68k,2892
127
+ telegrinder-0.1.dev165.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
128
+ telegrinder-0.1.dev165.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: poetry-core 1.8.1
2
+ Generator: poetry-core 1.9.0
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any