Skip to content

Commit e73f32f

Browse files
Refactor folders
1 parent a4b92aa commit e73f32f

8 files changed

Lines changed: 336 additions & 161 deletions

File tree

compiler/docs/compiler.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -248,7 +248,6 @@ def get_title_list(s: str) -> list:
248248
toggle_forum_topics
249249
delete_folder
250250
export_folder_link
251-
get_folder
252251
get_folders
253252
update_folder
254253
""",
@@ -684,10 +683,11 @@ def get_title_list(s: str) -> list:
684683
folder="""
685684
Folder
686685
Folder.delete
687-
Folder.update_peers
688-
Folder.pin_chat
686+
Folder.update
689687
Folder.include_chat
690688
Folder.exclude_chat
689+
Folder.pin_chat
690+
Folder.remove_chat
691691
Folder.export_link
692692
"""
693693
)

pyrogram/methods/chats/__init__.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@
4040
from .get_chat_online_count import GetChatOnlineCount
4141
from .get_dialogs import GetDialogs
4242
from .get_dialogs_count import GetDialogsCount
43-
from .get_folder import GetFolder
4443
from .get_folders import GetFolders
4544
from .get_forum_topics import GetForumTopics
4645
from .get_forum_topics_by_id import GetForumTopicsByID
@@ -96,7 +95,6 @@ class Chats(
9695
SetChatUsername,
9796
SetChatPermissions,
9897
GetDialogsCount,
99-
GetFolder,
10098
GetFolders,
10199
GetForumTopics,
102100
GetForumTopicsByID,

pyrogram/methods/chats/export_folder_link.py

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -38,20 +38,27 @@ async def export_folder_link(
3838
# Export folder link
3939
app.export_folder_link(123456789)
4040
"""
41-
folder = await self.get_folder(folder_id)
41+
folder = await self.get_folders(folder_id)
4242

4343
if not folder:
4444
return
4545

46+
peers = []
47+
48+
if folder.included_chats:
49+
peers.extend(iter(folder.included_chats))
50+
51+
if folder.excluded_chats:
52+
peers.extend(iter(folder.included_chats))
53+
54+
if folder.pinned_chats:
55+
peers.extend(iter(folder.included_chats))
56+
4657
r = await self.invoke(
4758
raw.functions.chatlists.ExportChatlistInvite(
48-
chatlist=raw.types.InputChatlistDialogFilter(
49-
filter_id=folder_id
50-
),
59+
chatlist=raw.types.InputChatlistDialogFilter(filter_id=folder_id),
5160
title=folder.title,
52-
peers=[await self.resolve_peer(i.id) for i in folder.pinned_peers] if folder.pinned_peers else []
53-
+ [await self.resolve_peer(i.id) for i in folder.included_peers] if folder.included_peers else []
54-
+ [await self.resolve_peer(i.id) for i in folder.excluded_peers] if folder.excluded_peers else [],
61+
peers=[await self.resolve_peer(i.id) for i in peers],
5562
)
5663
)
5764

pyrogram/methods/chats/get_folder.py

Lines changed: 0 additions & 45 deletions
This file was deleted.

pyrogram/methods/chats/get_folders.py

Lines changed: 39 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
# You should have received a copy of the GNU Lesser General Public License
1717
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
1818

19-
from typing import AsyncGenerator, Optional
19+
from typing import Union, List, Iterable
2020

2121
import pyrogram
2222
from pyrogram import types, raw
@@ -25,48 +25,66 @@
2525
class GetFolders:
2626
async def get_folders(
2727
self: "pyrogram.Client",
28-
) -> AsyncGenerator["types.Folder", None]:
29-
"""Get a user's folders with chats sequentially.
28+
folder_ids: Union[int, Iterable[int]] = None,
29+
) -> Union["types.Folder", List["types.Folder"]]:
30+
"""Get one or more folders by using folder identifiers.
3031
3132
.. include:: /_includes/usable-by/users.rst
3233
34+
Parameters:
35+
folder_ids (``int`` | Iterable of ``int``, *optional*):
36+
Pass a single folder identifier or an iterable of folder ids (as integers) to get the content of the
37+
folders themselves.
38+
By default all folders are returned.
39+
3340
Returns:
34-
``Generator``: A generator yielding :obj:`~pyrogram.types.Folder` objects.
41+
:obj:`~pyrogram.types.Folder` | List of :obj:`~pyrogram.types.Folder`: In case *folder_ids* was not
42+
a list, a single folder is returned, otherwise a list of folders is returned.
3543
3644
Example:
3745
.. code-block:: python
3846
39-
# Iterate through all folders
40-
async for folder in app.get_folders():
41-
print(folder.title)
47+
# Get one folder
48+
await app.get_folders(12345)
49+
50+
# Get more than one folders (list of folders)
51+
await app.get_folders([12345, 12346])
52+
53+
# Get all folders
54+
await app.get_folders()
4255
"""
56+
is_iterable = hasattr(folder_ids, "__iter__")
57+
ids = list(folder_ids) if is_iterable else [folder_ids]
58+
4359
raw_folders = await self.invoke(raw.functions.messages.GetDialogFilters())
4460
dialog_peers = []
4561

4662
for folder in raw_folders:
47-
if not isinstance(folder, (raw.types.DialogFilter, raw.types.DialogFilterChatlist)):
48-
continue
63+
if isinstance(folder, (raw.types.DialogFilter, raw.types.DialogFilterChatlist)):
64+
peers = folder.pinned_peers + folder.include_peers + getattr(folder, "exclude_peers", [])
65+
input_peers = [raw.types.InputDialogPeer(peer=peer) for peer in peers] + [raw.types.InputDialogPeerFolder(folder_id=folder.id)]
4966

50-
peers = folder.pinned_peers + folder.include_peers + getattr(folder, "exclude_peers", [])
51-
input_peers = [raw.types.InputDialogPeer(peer=peer) for peer in peers] + [raw.types.InputDialogPeerFolder(folder_id=folder.id)]
52-
dialog_peers.extend(input_peers)
67+
dialog_peers.extend(input_peers)
5368

5469
r = await self.invoke(raw.functions.messages.GetPeerDialogs(peers=dialog_peers))
5570

5671
users = {i.id: i for i in r.users}
5772
chats = {i.id: i for i in r.chats}
58-
peers = {**users, **chats}
5973

60-
folders = []
74+
folders = types.List([])
6175

6276
for folder in raw_folders:
63-
if not isinstance(folder, (raw.types.DialogFilter, raw.types.DialogFilterChatlist)):
64-
continue
65-
66-
folders.append(types.Folder._parse(self, folder, peers))
77+
if isinstance(folder, (raw.types.DialogFilter, raw.types.DialogFilterChatlist)):
78+
folders.append(types.Folder._parse(self, folder, users, chats))
6779

6880
if not folders:
69-
return
81+
return None
82+
83+
if folder_ids:
84+
folders = types.List([folder for folder in folders if folder.id in ids])
85+
if is_iterable:
86+
return folders or None
87+
else:
88+
return folders[0] if folders else None
7089

71-
for folder in folders:
72-
yield folder
90+
return folders

pyrogram/methods/chats/update_folder.py

Lines changed: 63 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,14 @@ class UpdateFolder:
2626
async def update_folder(
2727
self: "pyrogram.Client",
2828
folder_id: int,
29-
title: str,
30-
pinned_peers: Union[Union[int, str], List[Union[int, str]]],
31-
included_peers: Union[Union[int, str], List[Union[int, str]]],
32-
excluded_peers: Union[Union[int, str], List[Union[int, str]]],
29+
included_chats: Union[Union[int, str], List[Union[int, str]]] = None,
30+
excluded_chats: Union[Union[int, str], List[Union[int, str]]] = None,
31+
pinned_chats: Union[Union[int, str], List[Union[int, str]]] = None,
32+
title: str = None,
3333
contacts: bool = None,
3434
non_contacts: bool = None,
3535
groups: bool = None,
36-
broadcasts: bool = None,
36+
channels: bool = None,
3737
bots: bool = None,
3838
exclude_muted: bool = None,
3939
exclude_read: bool = None,
@@ -44,21 +44,68 @@ async def update_folder(
4444
4545
.. include:: /_includes/usable-by/users.rst
4646
47+
Parameters:
48+
folder_id (``int``):
49+
Unique folder identifier.
50+
51+
included_chats (``int`` | ``str`` | List of ``int`` or ``str``, *optional*):
52+
Users or chats that should added in the folder
53+
You can pass an ID (int), username (str) or phone number (str).
54+
Multiple users can be added by passing a list of IDs, usernames or phone numbers.
55+
56+
excluded_chats (``int`` | ``str`` | List of ``int`` or ``str``, *optional*):
57+
Users or chats that should excluded from the folder
58+
You can pass an ID (int), username (str) or phone number (str).
59+
Multiple users can be added by passing a list of IDs, usernames or phone numbers.
60+
61+
pinned_chats (``int`` | ``str`` | List of ``int`` or ``str``, *optional*):
62+
Users or chats that should pinned in the folder
63+
You can pass an ID (int), username (str) or phone number (str).
64+
Multiple users can be added by passing a list of IDs, usernames or phone numbers.
65+
66+
title (``str``, *optional*):
67+
A folder title was changed to this value.
68+
69+
contacts (``bool``, *optional*):
70+
Pass True if folder should contain contacts.
71+
72+
non_contacts (``bool``, *optional*):
73+
Pass True if folder should contain non contacts.
74+
75+
groups (``bool``, *optional*):
76+
Pass True if folder should contain groups.
77+
78+
channels (``bool``, *optional*):
79+
Pass True if folder should contain channels.
80+
81+
bots (``bool``, *optional*):
82+
Pass True if folder should contain bots.
83+
84+
exclude_muted (``bool``, *optional*):
85+
Pass True if folder should exclude muted users.
86+
87+
exclude_archived (``bool``, *optional*):
88+
Pass True if folder should exclude archived users.
89+
90+
emoji (``str``, *optional*):
91+
Folder emoji.
92+
Pass None to leave the folder icon as default.
93+
4794
Returns:
4895
``bool``: True, on success.
4996
5097
Example:
5198
.. code-block:: python
5299
53100
# Delete folder
54-
app.delete_folder(folder_id)
101+
app.update_folder(folder_id, title="New folder", included_chats=["me"])
55102
"""
56-
if not isinstance(pinned_peers, list):
57-
pinned_peers = [pinned_peers]
58-
if not isinstance(included_peers, list):
59-
included_peers = [included_peers]
60-
if not isinstance(excluded_peers, list):
61-
excluded_peers = [excluded_peers]
103+
if not isinstance(included_chats, list):
104+
included_chats = [included_chats]
105+
if not isinstance(excluded_chats, list):
106+
excluded_chats = [excluded_chats]
107+
if not isinstance(pinned_chats, list):
108+
pinned_chats = [pinned_chats]
62109

63110
r = await self.invoke(
64111
raw.functions.messages.UpdateDialogFilter(
@@ -68,20 +115,20 @@ async def update_folder(
68115
title=title,
69116
pinned_peers=[
70117
await self.resolve_peer(user_id)
71-
for user_id in pinned_peers
118+
for user_id in pinned_chats
72119
],
73120
include_peers=[
74121
await self.resolve_peer(user_id)
75-
for user_id in included_peers
122+
for user_id in included_chats
76123
],
77124
exclude_peers=[
78125
await self.resolve_peer(user_id)
79-
for user_id in excluded_peers
126+
for user_id in excluded_chats
80127
],
81128
contacts=contacts,
82129
non_contacts=non_contacts,
83130
groups=groups,
84-
broadcasts=broadcasts,
131+
broadcasts=channels,
85132
bots=bots,
86133
exclude_muted=exclude_muted,
87134
exclude_read=exclude_read,

pyrogram/types/user_and_chats/chat.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -344,9 +344,9 @@ def _parse(
344344

345345
@staticmethod
346346
def _parse_dialog(client, peer, users: dict, chats: dict):
347-
if isinstance(peer, raw.types.PeerUser):
347+
if isinstance(peer, (raw.types.PeerUser, raw.types.InputPeerUser)):
348348
return Chat._parse_user_chat(client, users[peer.user_id])
349-
elif isinstance(peer, raw.types.PeerChat):
349+
elif isinstance(peer, (raw.types.PeerChat, raw.types.InputPeerChat)):
350350
return Chat._parse_chat_chat(client, chats[peer.chat_id])
351351
else:
352352
return Chat._parse_channel_chat(client, chats[peer.channel_id])

0 commit comments

Comments
 (0)