spluspy 2.2.9__tar.gz → 2.2.10__tar.gz

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.
Files changed (161) hide show
  1. {spluspy-2.2.9/spluspy.egg-info → spluspy-2.2.10}/PKG-INFO +2 -2
  2. {spluspy-2.2.9 → spluspy-2.2.10}/README.md +1 -1
  3. {spluspy-2.2.9 → spluspy-2.2.10}/pyproject.toml +1 -1
  4. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/client/extra.py +145 -0
  5. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/client/telegrambaseclient.py +12 -438
  6. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/client/updates.py +43 -155
  7. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/events/chataction.py +6 -2
  8. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/events/common.py +42 -1
  9. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/version.py +1 -1
  10. {spluspy-2.2.9 → spluspy-2.2.10/spluspy.egg-info}/PKG-INFO +2 -2
  11. {spluspy-2.2.9 → spluspy-2.2.10}/LICENSE +0 -0
  12. {spluspy-2.2.9 → spluspy-2.2.10}/setup.cfg +0 -0
  13. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/__init__.py +0 -0
  14. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/_updates/__init__.py +0 -0
  15. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/_updates/entitycache.py +0 -0
  16. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/_updates/messagebox.py +0 -0
  17. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/_updates/session.py +0 -0
  18. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/admin.py +0 -0
  19. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/client/__init__.py +0 -0
  20. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/client/account.py +0 -0
  21. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/client/auth.py +0 -0
  22. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/client/buttons.py +0 -0
  23. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/client/chats.py +0 -0
  24. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/client/dialogs.py +0 -0
  25. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/client/downloads.py +0 -0
  26. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/client/messageparse.py +0 -0
  27. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/client/messages.py +0 -0
  28. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/client/soroushclient.py +0 -0
  29. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/client/uploads.py +0 -0
  30. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/client/users.py +0 -0
  31. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/crypto/__init__.py +0 -0
  32. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/crypto/aes.py +0 -0
  33. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/crypto/aesctr.py +0 -0
  34. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/crypto/authkey.py +0 -0
  35. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/crypto/cdndecrypter.py +0 -0
  36. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/crypto/factorization.py +0 -0
  37. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/crypto/libssl.py +0 -0
  38. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/crypto/rsa.py +0 -0
  39. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/custom.py +0 -0
  40. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/enums.py +0 -0
  41. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/errors/__init__.py +0 -0
  42. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/errors/common.py +0 -0
  43. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/errors/exceptions.py +0 -0
  44. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/errors/rpcbaseerrors.py +0 -0
  45. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/errors/rpcerrorlist.py +0 -0
  46. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/events/__init__.py +0 -0
  47. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/events/album.py +0 -0
  48. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/events/messagedeleted.py +0 -0
  49. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/events/messageedited.py +0 -0
  50. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/events/messageread.py +0 -0
  51. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/events/newmessage.py +0 -0
  52. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/events/raw.py +0 -0
  53. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/events/userupdate.py +0 -0
  54. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/extensions/__init__.py +0 -0
  55. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/extensions/binaryreader.py +0 -0
  56. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/extensions/html.py +0 -0
  57. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/extensions/markdown.py +0 -0
  58. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/extensions/messagepacker.py +0 -0
  59. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/filters.py +0 -0
  60. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/functions.py +0 -0
  61. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/helpers.py +0 -0
  62. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/hints.py +0 -0
  63. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/network/__init__.py +0 -0
  64. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/network/authenticator.py +0 -0
  65. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/network/connection/__init__.py +0 -0
  66. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/network/connection/connection.py +0 -0
  67. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/network/connection/http.py +0 -0
  68. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/network/connection/tcpabridged.py +0 -0
  69. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/network/connection/tcpfull.py +0 -0
  70. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/network/connection/tcpintermediate.py +0 -0
  71. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/network/connection/tcpmtproxy.py +0 -0
  72. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/network/connection/tcpobfuscated.py +0 -0
  73. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/network/connection/websocket.py +0 -0
  74. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/network/mtprotoplainsender.py +0 -0
  75. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/network/mtprotosender.py +0 -0
  76. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/network/mtprotostate.py +0 -0
  77. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/network/requeststate.py +0 -0
  78. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/password.py +0 -0
  79. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/requestiter.py +0 -0
  80. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/resolvers.py +0 -0
  81. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/sessions/__init__.py +0 -0
  82. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/sessions/abstract.py +0 -0
  83. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/sessions/memory.py +0 -0
  84. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/sessions/sqlite.py +0 -0
  85. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/sessions/string.py +0 -0
  86. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/sync.py +0 -0
  87. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/tl/__init__.py +0 -0
  88. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/tl/alltlobjects.py +0 -0
  89. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/tl/core/__init__.py +0 -0
  90. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/tl/core/gzippacked.py +0 -0
  91. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/tl/core/messagecontainer.py +0 -0
  92. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/tl/core/rpcresult.py +0 -0
  93. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/tl/core/tlmessage.py +0 -0
  94. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/tl/custom/__init__.py +0 -0
  95. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/tl/custom/adminlogevent.py +0 -0
  96. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/tl/custom/button.py +0 -0
  97. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/tl/custom/chatgetter.py +0 -0
  98. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/tl/custom/conversation.py +0 -0
  99. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/tl/custom/dialog.py +0 -0
  100. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/tl/custom/draft.py +0 -0
  101. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/tl/custom/file.py +0 -0
  102. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/tl/custom/forward.py +0 -0
  103. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/tl/custom/inputsizedfile.py +0 -0
  104. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/tl/custom/message.py +0 -0
  105. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/tl/custom/messagebutton.py +0 -0
  106. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/tl/custom/participantpermissions.py +0 -0
  107. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/tl/custom/qrlogin.py +0 -0
  108. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/tl/custom/sendergetter.py +0 -0
  109. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/tl/custom/types.py +0 -0
  110. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/tl/functions/__init__.py +0 -0
  111. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/tl/functions/account.py +0 -0
  112. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/tl/functions/auth.py +0 -0
  113. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/tl/functions/bots.py +0 -0
  114. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/tl/functions/channels.py +0 -0
  115. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/tl/functions/chatlists.py +0 -0
  116. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/tl/functions/conference.py +0 -0
  117. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/tl/functions/contacts.py +0 -0
  118. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/tl/functions/folders.py +0 -0
  119. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/tl/functions/help.py +0 -0
  120. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/tl/functions/langpack.py +0 -0
  121. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/tl/functions/messages.py +0 -0
  122. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/tl/functions/payments.py +0 -0
  123. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/tl/functions/phone.py +0 -0
  124. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/tl/functions/photos.py +0 -0
  125. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/tl/functions/premium.py +0 -0
  126. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/tl/functions/stats.py +0 -0
  127. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/tl/functions/stories.py +0 -0
  128. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/tl/functions/thirdParty.py +0 -0
  129. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/tl/functions/updates.py +0 -0
  130. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/tl/functions/upload.py +0 -0
  131. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/tl/functions/users.py +0 -0
  132. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/tl/patched/__init__.py +0 -0
  133. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/tl/tlobject.py +0 -0
  134. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/tl/types/__init__.py +0 -0
  135. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/tl/types/account.py +0 -0
  136. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/tl/types/auth.py +0 -0
  137. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/tl/types/bots.py +0 -0
  138. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/tl/types/channels.py +0 -0
  139. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/tl/types/chatlists.py +0 -0
  140. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/tl/types/conference.py +0 -0
  141. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/tl/types/contacts.py +0 -0
  142. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/tl/types/help.py +0 -0
  143. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/tl/types/messages.py +0 -0
  144. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/tl/types/payments.py +0 -0
  145. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/tl/types/phone.py +0 -0
  146. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/tl/types/photos.py +0 -0
  147. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/tl/types/premium.py +0 -0
  148. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/tl/types/stats.py +0 -0
  149. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/tl/types/stickers.py +0 -0
  150. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/tl/types/storage.py +0 -0
  151. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/tl/types/stories.py +0 -0
  152. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/tl/types/thirdParty.py +0 -0
  153. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/tl/types/update.py +0 -0
  154. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/tl/types/updates.py +0 -0
  155. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/tl/types/upload.py +0 -0
  156. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/tl/types/users.py +0 -0
  157. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy/utils.py +0 -0
  158. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy.egg-info/SOURCES.txt +0 -0
  159. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy.egg-info/dependency_links.txt +0 -0
  160. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy.egg-info/requires.txt +0 -0
  161. {spluspy-2.2.9 → spluspy-2.2.10}/spluspy.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: spluspy
3
- Version: 2.2.9
3
+ Version: 2.2.10
4
4
  Summary: High-performance Python Self-Bot Framework for Soroush Plus
5
5
  Author: Ali Mirshekari
6
6
  License: MIT
@@ -26,7 +26,7 @@ Requires-Dist: rsa
26
26
  Requires-Dist: pyaes
27
27
  Dynamic: license-file
28
28
 
29
- # SplusPy v2.2.9
29
+ # SplusPy v2.2.10
30
30
 
31
31
 
32
32
  **A fast, minimal, and fully-featured self-bot framework**
@@ -1,4 +1,4 @@
1
- # SplusPy v2.2.9
1
+ # SplusPy v2.2.10
2
2
 
3
3
 
4
4
  **A fast, minimal, and fully-featured self-bot framework**
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "spluspy"
7
- version = "2.2.9"
7
+ version = "2.2.10"
8
8
  description = "High-performance Python Self-Bot Framework for Soroush Plus"
9
9
  readme = "README.md"
10
10
  license = {text = "MIT"}
@@ -1,3 +1,4 @@
1
+ import asyncio
1
2
  import typing
2
3
  from ..tl import functions, types
3
4
  from .. import helpers, utils, hints, errors
@@ -834,3 +835,147 @@ class ExtraMethods:
834
835
  return result
835
836
 
836
837
  # endregion
838
+
839
+ # =====================================================================
840
+ # region Bulk Account Maintenance Methods
841
+ # =====================================================================
842
+
843
+ async def get_all_groups(
844
+ self: 'SoroushClient'
845
+ ) -> typing.List[dict]:
846
+ """
847
+ Lists every group/channel the account is a member of.
848
+
849
+ Returns:
850
+ A list of dicts with keys:
851
+ - ``id``: marked chat ID (int)
852
+ - ``title``: display title (str)
853
+ - ``type``: ``'channel'`` or ``'group'``
854
+ - ``username``: public username or None
855
+ """
856
+ groups = []
857
+ async for dialog in self.iter_dialogs():
858
+ entity = getattr(dialog, 'entity', None)
859
+ if entity is None or isinstance(entity, types.User):
860
+ continue
861
+ if isinstance(entity, types.Channel) and not entity.megagroup:
862
+ kind = 'channel'
863
+ else:
864
+ kind = 'group'
865
+ groups.append({
866
+ 'id': dialog.id,
867
+ 'title': dialog.name,
868
+ 'type': kind,
869
+ 'username': getattr(entity, 'username', None),
870
+ })
871
+ return groups
872
+
873
+ async def leave_all(self, delay: float = 0.5) -> dict:
874
+ """
875
+ Leaves every group/channel; private chats are skipped.
876
+
877
+ Args:
878
+ delay: Pause in seconds between leave requests (flood control).
879
+
880
+ Returns:
881
+ A dict with counts and per-chat details:
882
+ ``{'success', 'failed', 'skipped',
883
+ 'details': [{'id', 'title', 'status'}]}``
884
+ where status is ``'left'``, ``'failed'`` or ``'skipped'``.
885
+ """
886
+ success = failed = skipped = 0
887
+ details = []
888
+ async for dialog in self.iter_dialogs():
889
+ entity = getattr(dialog, 'entity', None)
890
+ if entity is None or isinstance(entity, types.User):
891
+ skipped += 1
892
+ details.append({
893
+ 'id': dialog.id,
894
+ 'title': dialog.name,
895
+ 'status': 'skipped'
896
+ })
897
+ continue
898
+ try:
899
+ await self.leave_chat(dialog.input_entity)
900
+ status = 'left'
901
+ success += 1
902
+ except Exception:
903
+ status = 'failed'
904
+ failed += 1
905
+ details.append({
906
+ 'id': dialog.id,
907
+ 'title': dialog.name,
908
+ 'status': status
909
+ })
910
+ await asyncio.sleep(delay)
911
+ return {
912
+ 'success': success,
913
+ 'failed': failed,
914
+ 'skipped': skipped,
915
+ 'details': details
916
+ }
917
+
918
+ async def delete_all_private(
919
+ self: 'SoroushClient',
920
+ revoke: bool = True,
921
+ delay: float = 1.0,
922
+ on_progress: typing.Callable[[int, int, str], typing.Any] = None
923
+ ) -> dict:
924
+ """
925
+ Deletes the history of all private chats (optionally revoking them).
926
+
927
+ Args:
928
+ revoke: Also delete the messages for the other side.
929
+ delay: Pause in seconds between requests (flood control).
930
+ on_progress: Optional callback ``(current, total, name)``;
931
+ may be sync or async.
932
+
933
+ Returns:
934
+ A dict with counts and per-chat details:
935
+ ``{'success', 'failed', 'skipped',
936
+ 'details': [{'id', 'title', 'status'}]}``
937
+ where status is ``'deleted'``, ``'failed'`` or ``'skipped'``.
938
+ """
939
+ dialogs = []
940
+ async for dialog in self.iter_dialogs():
941
+ if isinstance(getattr(dialog, 'entity', None), types.User):
942
+ if getattr(dialog.entity, 'is_self', False):
943
+ continue
944
+ dialogs.append(dialog)
945
+
946
+ total = len(dialogs)
947
+ success = failed = skipped = 0
948
+ details = []
949
+
950
+ for current, dialog in enumerate(dialogs, start=1):
951
+ title = dialog.name or ''
952
+ try:
953
+ await self(functions.messages.DeleteHistoryRequest(
954
+ peer=dialog.input_entity,
955
+ max_id=0,
956
+ revoke=revoke
957
+ ))
958
+ status = 'deleted'
959
+ success += 1
960
+ except Exception:
961
+ status = 'failed'
962
+ failed += 1
963
+ details.append({
964
+ 'id': dialog.id,
965
+ 'title': title,
966
+ 'status': status
967
+ })
968
+ if on_progress:
969
+ result = on_progress(current, total, title)
970
+ if asyncio.iscoroutine(result):
971
+ await result
972
+ await asyncio.sleep(delay)
973
+
974
+ return {
975
+ 'success': success,
976
+ 'failed': failed,
977
+ 'skipped': skipped,
978
+ 'details': details
979
+ }
980
+
981
+ # endregion