spluspy 2.2.8__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.
- {spluspy-2.2.8/spluspy.egg-info → spluspy-2.2.10}/PKG-INFO +3 -3
- {spluspy-2.2.8 → spluspy-2.2.10}/README.md +2 -2
- {spluspy-2.2.8 → spluspy-2.2.10}/pyproject.toml +1 -1
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/client/extra.py +145 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/client/telegrambaseclient.py +12 -438
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/client/updates.py +45 -173
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/client/users.py +16 -2
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/events/chataction.py +6 -2
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/events/common.py +51 -4
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/sessions/memory.py +11 -3
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/utils.py +3 -5
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/version.py +1 -1
- {spluspy-2.2.8 → spluspy-2.2.10/spluspy.egg-info}/PKG-INFO +3 -3
- {spluspy-2.2.8 → spluspy-2.2.10}/LICENSE +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/setup.cfg +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/__init__.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/_updates/__init__.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/_updates/entitycache.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/_updates/messagebox.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/_updates/session.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/admin.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/client/__init__.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/client/account.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/client/auth.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/client/buttons.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/client/chats.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/client/dialogs.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/client/downloads.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/client/messageparse.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/client/messages.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/client/soroushclient.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/client/uploads.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/crypto/__init__.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/crypto/aes.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/crypto/aesctr.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/crypto/authkey.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/crypto/cdndecrypter.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/crypto/factorization.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/crypto/libssl.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/crypto/rsa.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/custom.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/enums.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/errors/__init__.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/errors/common.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/errors/exceptions.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/errors/rpcbaseerrors.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/errors/rpcerrorlist.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/events/__init__.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/events/album.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/events/messagedeleted.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/events/messageedited.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/events/messageread.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/events/newmessage.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/events/raw.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/events/userupdate.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/extensions/__init__.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/extensions/binaryreader.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/extensions/html.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/extensions/markdown.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/extensions/messagepacker.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/filters.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/functions.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/helpers.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/hints.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/network/__init__.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/network/authenticator.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/network/connection/__init__.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/network/connection/connection.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/network/connection/http.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/network/connection/tcpabridged.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/network/connection/tcpfull.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/network/connection/tcpintermediate.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/network/connection/tcpmtproxy.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/network/connection/tcpobfuscated.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/network/connection/websocket.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/network/mtprotoplainsender.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/network/mtprotosender.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/network/mtprotostate.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/network/requeststate.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/password.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/requestiter.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/resolvers.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/sessions/__init__.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/sessions/abstract.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/sessions/sqlite.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/sessions/string.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/sync.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/tl/__init__.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/tl/alltlobjects.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/tl/core/__init__.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/tl/core/gzippacked.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/tl/core/messagecontainer.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/tl/core/rpcresult.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/tl/core/tlmessage.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/tl/custom/__init__.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/tl/custom/adminlogevent.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/tl/custom/button.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/tl/custom/chatgetter.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/tl/custom/conversation.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/tl/custom/dialog.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/tl/custom/draft.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/tl/custom/file.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/tl/custom/forward.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/tl/custom/inputsizedfile.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/tl/custom/message.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/tl/custom/messagebutton.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/tl/custom/participantpermissions.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/tl/custom/qrlogin.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/tl/custom/sendergetter.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/tl/custom/types.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/tl/functions/__init__.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/tl/functions/account.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/tl/functions/auth.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/tl/functions/bots.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/tl/functions/channels.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/tl/functions/chatlists.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/tl/functions/conference.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/tl/functions/contacts.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/tl/functions/folders.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/tl/functions/help.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/tl/functions/langpack.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/tl/functions/messages.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/tl/functions/payments.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/tl/functions/phone.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/tl/functions/photos.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/tl/functions/premium.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/tl/functions/stats.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/tl/functions/stories.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/tl/functions/thirdParty.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/tl/functions/updates.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/tl/functions/upload.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/tl/functions/users.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/tl/patched/__init__.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/tl/tlobject.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/tl/types/__init__.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/tl/types/account.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/tl/types/auth.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/tl/types/bots.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/tl/types/channels.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/tl/types/chatlists.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/tl/types/conference.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/tl/types/contacts.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/tl/types/help.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/tl/types/messages.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/tl/types/payments.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/tl/types/phone.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/tl/types/photos.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/tl/types/premium.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/tl/types/stats.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/tl/types/stickers.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/tl/types/storage.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/tl/types/stories.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/tl/types/thirdParty.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/tl/types/update.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/tl/types/updates.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/tl/types/upload.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy/tl/types/users.py +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy.egg-info/SOURCES.txt +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy.egg-info/dependency_links.txt +0 -0
- {spluspy-2.2.8 → spluspy-2.2.10}/spluspy.egg-info/requires.txt +0 -0
- {spluspy-2.2.8 → 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.
|
|
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.
|
|
29
|
+
# SplusPy v2.2.10
|
|
30
30
|
|
|
31
31
|
|
|
32
32
|
**A fast, minimal, and fully-featured self-bot framework**
|
|
@@ -37,7 +37,7 @@ Dynamic: license-file
|
|
|
37
37
|
|
|
38
38
|
SplusPy is a Python library designed specifically for building **Soroush Plus self-bots** (userbots). It provides a clean, intuitive API for automating your personal Soroush Plus account with ease.
|
|
39
39
|
|
|
40
|
-
> ⚠️ **Note:** This is a **self-bot framework** — it operates on your personal account, not a bot account. Please adhere to
|
|
40
|
+
> ⚠️ **Note:** This is a **self-bot framework** — it operates on your personal account, not a bot account. Please adhere to Soroush's Terms of Service.
|
|
41
41
|
|
|
42
42
|
---
|
|
43
43
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# SplusPy v2.2.
|
|
1
|
+
# SplusPy v2.2.10
|
|
2
2
|
|
|
3
3
|
|
|
4
4
|
**A fast, minimal, and fully-featured self-bot framework**
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
|
|
10
10
|
SplusPy is a Python library designed specifically for building **Soroush Plus self-bots** (userbots). It provides a clean, intuitive API for automating your personal Soroush Plus account with ease.
|
|
11
11
|
|
|
12
|
-
> ⚠️ **Note:** This is a **self-bot framework** — it operates on your personal account, not a bot account. Please adhere to
|
|
12
|
+
> ⚠️ **Note:** This is a **self-bot framework** — it operates on your personal account, not a bot account. Please adhere to Soroush's Terms of Service.
|
|
13
13
|
|
|
14
14
|
---
|
|
15
15
|
|
|
@@ -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
|