mirror of
https://github.com/TeamPGM/pyrogram.git
synced 2024-11-27 16:45:19 +00:00
Refactor folders
This commit is contained in:
parent
a4b92aabd1
commit
e73f32f847
@ -248,7 +248,6 @@ def pyrogram_api():
|
|||||||
toggle_forum_topics
|
toggle_forum_topics
|
||||||
delete_folder
|
delete_folder
|
||||||
export_folder_link
|
export_folder_link
|
||||||
get_folder
|
|
||||||
get_folders
|
get_folders
|
||||||
update_folder
|
update_folder
|
||||||
""",
|
""",
|
||||||
@ -684,10 +683,11 @@ def pyrogram_api():
|
|||||||
folder="""
|
folder="""
|
||||||
Folder
|
Folder
|
||||||
Folder.delete
|
Folder.delete
|
||||||
Folder.update_peers
|
Folder.update
|
||||||
Folder.pin_chat
|
|
||||||
Folder.include_chat
|
Folder.include_chat
|
||||||
Folder.exclude_chat
|
Folder.exclude_chat
|
||||||
|
Folder.pin_chat
|
||||||
|
Folder.remove_chat
|
||||||
Folder.export_link
|
Folder.export_link
|
||||||
"""
|
"""
|
||||||
)
|
)
|
||||||
|
@ -40,7 +40,6 @@ from .get_chat_members_count import GetChatMembersCount
|
|||||||
from .get_chat_online_count import GetChatOnlineCount
|
from .get_chat_online_count import GetChatOnlineCount
|
||||||
from .get_dialogs import GetDialogs
|
from .get_dialogs import GetDialogs
|
||||||
from .get_dialogs_count import GetDialogsCount
|
from .get_dialogs_count import GetDialogsCount
|
||||||
from .get_folder import GetFolder
|
|
||||||
from .get_folders import GetFolders
|
from .get_folders import GetFolders
|
||||||
from .get_forum_topics import GetForumTopics
|
from .get_forum_topics import GetForumTopics
|
||||||
from .get_forum_topics_by_id import GetForumTopicsByID
|
from .get_forum_topics_by_id import GetForumTopicsByID
|
||||||
@ -96,7 +95,6 @@ class Chats(
|
|||||||
SetChatUsername,
|
SetChatUsername,
|
||||||
SetChatPermissions,
|
SetChatPermissions,
|
||||||
GetDialogsCount,
|
GetDialogsCount,
|
||||||
GetFolder,
|
|
||||||
GetFolders,
|
GetFolders,
|
||||||
GetForumTopics,
|
GetForumTopics,
|
||||||
GetForumTopicsByID,
|
GetForumTopicsByID,
|
||||||
|
@ -38,20 +38,27 @@ class ExportFolderLink:
|
|||||||
# Export folder link
|
# Export folder link
|
||||||
app.export_folder_link(123456789)
|
app.export_folder_link(123456789)
|
||||||
"""
|
"""
|
||||||
folder = await self.get_folder(folder_id)
|
folder = await self.get_folders(folder_id)
|
||||||
|
|
||||||
if not folder:
|
if not folder:
|
||||||
return
|
return
|
||||||
|
|
||||||
|
peers = []
|
||||||
|
|
||||||
|
if folder.included_chats:
|
||||||
|
peers.extend(iter(folder.included_chats))
|
||||||
|
|
||||||
|
if folder.excluded_chats:
|
||||||
|
peers.extend(iter(folder.included_chats))
|
||||||
|
|
||||||
|
if folder.pinned_chats:
|
||||||
|
peers.extend(iter(folder.included_chats))
|
||||||
|
|
||||||
r = await self.invoke(
|
r = await self.invoke(
|
||||||
raw.functions.chatlists.ExportChatlistInvite(
|
raw.functions.chatlists.ExportChatlistInvite(
|
||||||
chatlist=raw.types.InputChatlistDialogFilter(
|
chatlist=raw.types.InputChatlistDialogFilter(filter_id=folder_id),
|
||||||
filter_id=folder_id
|
|
||||||
),
|
|
||||||
title=folder.title,
|
title=folder.title,
|
||||||
peers=[await self.resolve_peer(i.id) for i in folder.pinned_peers] if folder.pinned_peers else []
|
peers=[await self.resolve_peer(i.id) for i in peers],
|
||||||
+ [await self.resolve_peer(i.id) for i in folder.included_peers] if folder.included_peers else []
|
|
||||||
+ [await self.resolve_peer(i.id) for i in folder.excluded_peers] if folder.excluded_peers else [],
|
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -1,45 +0,0 @@
|
|||||||
# Pyrogram - Telegram MTProto API Client Library for Python
|
|
||||||
# Copyright (C) 2017-present Dan <https://github.com/delivrance>
|
|
||||||
#
|
|
||||||
# This file is part of Pyrogram.
|
|
||||||
#
|
|
||||||
# Pyrogram is free software: you can redistribute it and/or modify
|
|
||||||
# it under the terms of the GNU Lesser General Public License as published
|
|
||||||
# by the Free Software Foundation, either version 3 of the License, or
|
|
||||||
# (at your option) any later version.
|
|
||||||
#
|
|
||||||
# Pyrogram is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU Lesser General Public License for more details.
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU Lesser General Public License
|
|
||||||
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
from typing import Optional
|
|
||||||
|
|
||||||
import pyrogram
|
|
||||||
from pyrogram import types
|
|
||||||
|
|
||||||
|
|
||||||
class GetFolder:
|
|
||||||
async def get_folder(
|
|
||||||
self: "pyrogram.Client",
|
|
||||||
folder_id: int
|
|
||||||
) -> Optional["types.Folder"]:
|
|
||||||
"""Get a user's folder by id.
|
|
||||||
|
|
||||||
.. include:: /_includes/usable-by/users.rst
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
:obj:`~pyrogram.types.Folder`: On success, the user's folder is returned.
|
|
||||||
|
|
||||||
Example:
|
|
||||||
.. code-block:: python
|
|
||||||
|
|
||||||
# Get folder by id
|
|
||||||
await app.get_folder(123456789)
|
|
||||||
"""
|
|
||||||
async for folder in self.get_folders():
|
|
||||||
if folder.id == folder_id:
|
|
||||||
return folder
|
|
@ -16,7 +16,7 @@
|
|||||||
# You should have received a copy of the GNU Lesser General Public License
|
# You should have received a copy of the GNU Lesser General Public License
|
||||||
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
|
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
from typing import AsyncGenerator, Optional
|
from typing import Union, List, Iterable
|
||||||
|
|
||||||
import pyrogram
|
import pyrogram
|
||||||
from pyrogram import types, raw
|
from pyrogram import types, raw
|
||||||
@ -25,48 +25,66 @@ from pyrogram import types, raw
|
|||||||
class GetFolders:
|
class GetFolders:
|
||||||
async def get_folders(
|
async def get_folders(
|
||||||
self: "pyrogram.Client",
|
self: "pyrogram.Client",
|
||||||
) -> AsyncGenerator["types.Folder", None]:
|
folder_ids: Union[int, Iterable[int]] = None,
|
||||||
"""Get a user's folders with chats sequentially.
|
) -> Union["types.Folder", List["types.Folder"]]:
|
||||||
|
"""Get one or more folders by using folder identifiers.
|
||||||
|
|
||||||
.. include:: /_includes/usable-by/users.rst
|
.. include:: /_includes/usable-by/users.rst
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
folder_ids (``int`` | Iterable of ``int``, *optional*):
|
||||||
|
Pass a single folder identifier or an iterable of folder ids (as integers) to get the content of the
|
||||||
|
folders themselves.
|
||||||
|
By default all folders are returned.
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
``Generator``: A generator yielding :obj:`~pyrogram.types.Folder` objects.
|
:obj:`~pyrogram.types.Folder` | List of :obj:`~pyrogram.types.Folder`: In case *folder_ids* was not
|
||||||
|
a list, a single folder is returned, otherwise a list of folders is returned.
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
# Iterate through all folders
|
# Get one folder
|
||||||
async for folder in app.get_folders():
|
await app.get_folders(12345)
|
||||||
print(folder.title)
|
|
||||||
|
# Get more than one folders (list of folders)
|
||||||
|
await app.get_folders([12345, 12346])
|
||||||
|
|
||||||
|
# Get all folders
|
||||||
|
await app.get_folders()
|
||||||
"""
|
"""
|
||||||
|
is_iterable = hasattr(folder_ids, "__iter__")
|
||||||
|
ids = list(folder_ids) if is_iterable else [folder_ids]
|
||||||
|
|
||||||
raw_folders = await self.invoke(raw.functions.messages.GetDialogFilters())
|
raw_folders = await self.invoke(raw.functions.messages.GetDialogFilters())
|
||||||
dialog_peers = []
|
dialog_peers = []
|
||||||
|
|
||||||
for folder in raw_folders:
|
for folder in raw_folders:
|
||||||
if not isinstance(folder, (raw.types.DialogFilter, raw.types.DialogFilterChatlist)):
|
if isinstance(folder, (raw.types.DialogFilter, raw.types.DialogFilterChatlist)):
|
||||||
continue
|
peers = folder.pinned_peers + folder.include_peers + getattr(folder, "exclude_peers", [])
|
||||||
|
input_peers = [raw.types.InputDialogPeer(peer=peer) for peer in peers] + [raw.types.InputDialogPeerFolder(folder_id=folder.id)]
|
||||||
|
|
||||||
peers = folder.pinned_peers + folder.include_peers + getattr(folder, "exclude_peers", [])
|
dialog_peers.extend(input_peers)
|
||||||
input_peers = [raw.types.InputDialogPeer(peer=peer) for peer in peers] + [raw.types.InputDialogPeerFolder(folder_id=folder.id)]
|
|
||||||
dialog_peers.extend(input_peers)
|
|
||||||
|
|
||||||
r = await self.invoke(raw.functions.messages.GetPeerDialogs(peers=dialog_peers))
|
r = await self.invoke(raw.functions.messages.GetPeerDialogs(peers=dialog_peers))
|
||||||
|
|
||||||
users = {i.id: i for i in r.users}
|
users = {i.id: i for i in r.users}
|
||||||
chats = {i.id: i for i in r.chats}
|
chats = {i.id: i for i in r.chats}
|
||||||
peers = {**users, **chats}
|
|
||||||
|
|
||||||
folders = []
|
folders = types.List([])
|
||||||
|
|
||||||
for folder in raw_folders:
|
for folder in raw_folders:
|
||||||
if not isinstance(folder, (raw.types.DialogFilter, raw.types.DialogFilterChatlist)):
|
if isinstance(folder, (raw.types.DialogFilter, raw.types.DialogFilterChatlist)):
|
||||||
continue
|
folders.append(types.Folder._parse(self, folder, users, chats))
|
||||||
|
|
||||||
folders.append(types.Folder._parse(self, folder, peers))
|
|
||||||
|
|
||||||
if not folders:
|
if not folders:
|
||||||
return
|
return None
|
||||||
|
|
||||||
for folder in folders:
|
if folder_ids:
|
||||||
yield folder
|
folders = types.List([folder for folder in folders if folder.id in ids])
|
||||||
|
if is_iterable:
|
||||||
|
return folders or None
|
||||||
|
else:
|
||||||
|
return folders[0] if folders else None
|
||||||
|
|
||||||
|
return folders
|
||||||
|
@ -26,14 +26,14 @@ class UpdateFolder:
|
|||||||
async def update_folder(
|
async def update_folder(
|
||||||
self: "pyrogram.Client",
|
self: "pyrogram.Client",
|
||||||
folder_id: int,
|
folder_id: int,
|
||||||
title: str,
|
included_chats: Union[Union[int, str], List[Union[int, str]]] = None,
|
||||||
pinned_peers: Union[Union[int, str], List[Union[int, str]]],
|
excluded_chats: Union[Union[int, str], List[Union[int, str]]] = None,
|
||||||
included_peers: Union[Union[int, str], List[Union[int, str]]],
|
pinned_chats: Union[Union[int, str], List[Union[int, str]]] = None,
|
||||||
excluded_peers: Union[Union[int, str], List[Union[int, str]]],
|
title: str = None,
|
||||||
contacts: bool = None,
|
contacts: bool = None,
|
||||||
non_contacts: bool = None,
|
non_contacts: bool = None,
|
||||||
groups: bool = None,
|
groups: bool = None,
|
||||||
broadcasts: bool = None,
|
channels: bool = None,
|
||||||
bots: bool = None,
|
bots: bool = None,
|
||||||
exclude_muted: bool = None,
|
exclude_muted: bool = None,
|
||||||
exclude_read: bool = None,
|
exclude_read: bool = None,
|
||||||
@ -44,6 +44,53 @@ class UpdateFolder:
|
|||||||
|
|
||||||
.. include:: /_includes/usable-by/users.rst
|
.. include:: /_includes/usable-by/users.rst
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
folder_id (``int``):
|
||||||
|
Unique folder identifier.
|
||||||
|
|
||||||
|
included_chats (``int`` | ``str`` | List of ``int`` or ``str``, *optional*):
|
||||||
|
Users or chats that should added in the folder
|
||||||
|
You can pass an ID (int), username (str) or phone number (str).
|
||||||
|
Multiple users can be added by passing a list of IDs, usernames or phone numbers.
|
||||||
|
|
||||||
|
excluded_chats (``int`` | ``str`` | List of ``int`` or ``str``, *optional*):
|
||||||
|
Users or chats that should excluded from the folder
|
||||||
|
You can pass an ID (int), username (str) or phone number (str).
|
||||||
|
Multiple users can be added by passing a list of IDs, usernames or phone numbers.
|
||||||
|
|
||||||
|
pinned_chats (``int`` | ``str`` | List of ``int`` or ``str``, *optional*):
|
||||||
|
Users or chats that should pinned in the folder
|
||||||
|
You can pass an ID (int), username (str) or phone number (str).
|
||||||
|
Multiple users can be added by passing a list of IDs, usernames or phone numbers.
|
||||||
|
|
||||||
|
title (``str``, *optional*):
|
||||||
|
A folder title was changed to this value.
|
||||||
|
|
||||||
|
contacts (``bool``, *optional*):
|
||||||
|
Pass True if folder should contain contacts.
|
||||||
|
|
||||||
|
non_contacts (``bool``, *optional*):
|
||||||
|
Pass True if folder should contain non contacts.
|
||||||
|
|
||||||
|
groups (``bool``, *optional*):
|
||||||
|
Pass True if folder should contain groups.
|
||||||
|
|
||||||
|
channels (``bool``, *optional*):
|
||||||
|
Pass True if folder should contain channels.
|
||||||
|
|
||||||
|
bots (``bool``, *optional*):
|
||||||
|
Pass True if folder should contain bots.
|
||||||
|
|
||||||
|
exclude_muted (``bool``, *optional*):
|
||||||
|
Pass True if folder should exclude muted users.
|
||||||
|
|
||||||
|
exclude_archived (``bool``, *optional*):
|
||||||
|
Pass True if folder should exclude archived users.
|
||||||
|
|
||||||
|
emoji (``str``, *optional*):
|
||||||
|
Folder emoji.
|
||||||
|
Pass None to leave the folder icon as default.
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
``bool``: True, on success.
|
``bool``: True, on success.
|
||||||
|
|
||||||
@ -51,14 +98,14 @@ class UpdateFolder:
|
|||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
# Delete folder
|
# Delete folder
|
||||||
app.delete_folder(folder_id)
|
app.update_folder(folder_id, title="New folder", included_chats=["me"])
|
||||||
"""
|
"""
|
||||||
if not isinstance(pinned_peers, list):
|
if not isinstance(included_chats, list):
|
||||||
pinned_peers = [pinned_peers]
|
included_chats = [included_chats]
|
||||||
if not isinstance(included_peers, list):
|
if not isinstance(excluded_chats, list):
|
||||||
included_peers = [included_peers]
|
excluded_chats = [excluded_chats]
|
||||||
if not isinstance(excluded_peers, list):
|
if not isinstance(pinned_chats, list):
|
||||||
excluded_peers = [excluded_peers]
|
pinned_chats = [pinned_chats]
|
||||||
|
|
||||||
r = await self.invoke(
|
r = await self.invoke(
|
||||||
raw.functions.messages.UpdateDialogFilter(
|
raw.functions.messages.UpdateDialogFilter(
|
||||||
@ -68,20 +115,20 @@ class UpdateFolder:
|
|||||||
title=title,
|
title=title,
|
||||||
pinned_peers=[
|
pinned_peers=[
|
||||||
await self.resolve_peer(user_id)
|
await self.resolve_peer(user_id)
|
||||||
for user_id in pinned_peers
|
for user_id in pinned_chats
|
||||||
],
|
],
|
||||||
include_peers=[
|
include_peers=[
|
||||||
await self.resolve_peer(user_id)
|
await self.resolve_peer(user_id)
|
||||||
for user_id in included_peers
|
for user_id in included_chats
|
||||||
],
|
],
|
||||||
exclude_peers=[
|
exclude_peers=[
|
||||||
await self.resolve_peer(user_id)
|
await self.resolve_peer(user_id)
|
||||||
for user_id in excluded_peers
|
for user_id in excluded_chats
|
||||||
],
|
],
|
||||||
contacts=contacts,
|
contacts=contacts,
|
||||||
non_contacts=non_contacts,
|
non_contacts=non_contacts,
|
||||||
groups=groups,
|
groups=groups,
|
||||||
broadcasts=broadcasts,
|
broadcasts=channels,
|
||||||
bots=bots,
|
bots=bots,
|
||||||
exclude_muted=exclude_muted,
|
exclude_muted=exclude_muted,
|
||||||
exclude_read=exclude_read,
|
exclude_read=exclude_read,
|
||||||
|
@ -344,9 +344,9 @@ class Chat(Object):
|
|||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _parse_dialog(client, peer, users: dict, chats: dict):
|
def _parse_dialog(client, peer, users: dict, chats: dict):
|
||||||
if isinstance(peer, raw.types.PeerUser):
|
if isinstance(peer, (raw.types.PeerUser, raw.types.InputPeerUser)):
|
||||||
return Chat._parse_user_chat(client, users[peer.user_id])
|
return Chat._parse_user_chat(client, users[peer.user_id])
|
||||||
elif isinstance(peer, raw.types.PeerChat):
|
elif isinstance(peer, (raw.types.PeerChat, raw.types.InputPeerChat)):
|
||||||
return Chat._parse_chat_chat(client, chats[peer.chat_id])
|
return Chat._parse_chat_chat(client, chats[peer.chat_id])
|
||||||
else:
|
else:
|
||||||
return Chat._parse_channel_chat(client, chats[peer.channel_id])
|
return Chat._parse_channel_chat(client, chats[peer.channel_id])
|
||||||
|
@ -21,8 +21,8 @@ from typing import List, Union
|
|||||||
import pyrogram
|
import pyrogram
|
||||||
from pyrogram import raw
|
from pyrogram import raw
|
||||||
from pyrogram import types
|
from pyrogram import types
|
||||||
|
from pyrogram import utils
|
||||||
from ..object import Object
|
from ..object import Object
|
||||||
from ... import utils
|
|
||||||
|
|
||||||
|
|
||||||
class Folder(Object):
|
class Folder(Object):
|
||||||
@ -35,15 +35,15 @@ class Folder(Object):
|
|||||||
title (``str``):
|
title (``str``):
|
||||||
The folder title.
|
The folder title.
|
||||||
|
|
||||||
pinned_peers (List of :obj:`~pyrogram.types.Chat`):
|
included_chats (List of :obj:`~pyrogram.types.Chat`, *optional*):
|
||||||
A list of pinned chats in folder.
|
|
||||||
|
|
||||||
included_peers (List of :obj:`~pyrogram.types.Chat`):
|
|
||||||
A list of included chats in folder.
|
A list of included chats in folder.
|
||||||
|
|
||||||
excluded_peers (List of :obj:`~pyrogram.types.Chat`, *optional*):
|
excluded_chats (List of :obj:`~pyrogram.types.Chat`, *optional*):
|
||||||
A list of excluded chats in folder.
|
A list of excluded chats in folder.
|
||||||
|
|
||||||
|
pinned_chats (List of :obj:`~pyrogram.types.Chat`, *optional*):
|
||||||
|
A list of pinned chats in folder.
|
||||||
|
|
||||||
contacts (``bool``, *optional*):
|
contacts (``bool``, *optional*):
|
||||||
True, if the folder includes contacts.
|
True, if the folder includes contacts.
|
||||||
|
|
||||||
@ -53,8 +53,8 @@ class Folder(Object):
|
|||||||
groups (``bool``, *optional*):
|
groups (``bool``, *optional*):
|
||||||
True, if the folder includes groups.
|
True, if the folder includes groups.
|
||||||
|
|
||||||
broadcasts (``bool``, *optional*):
|
channels (``bool``, *optional*):
|
||||||
True, if the folder includes broadcasts.
|
True, if the folder includes channels.
|
||||||
|
|
||||||
bots (``bool``, *optional*):
|
bots (``bool``, *optional*):
|
||||||
True, if the folder includes bots.
|
True, if the folder includes bots.
|
||||||
@ -78,13 +78,13 @@ class Folder(Object):
|
|||||||
client: "pyrogram.Client" = None,
|
client: "pyrogram.Client" = None,
|
||||||
id: int,
|
id: int,
|
||||||
title: str,
|
title: str,
|
||||||
pinned_peers: List["types.Chat"] = None,
|
included_chats: List["types.Chat"] = None,
|
||||||
included_peers: List["types.Chat"] = None,
|
excluded_chats: List["types.Chat"] = None,
|
||||||
excluded_peers: List["types.Chat"] = None,
|
pinned_chats: List["types.Chat"] = None,
|
||||||
contacts: bool = None,
|
contacts: bool = None,
|
||||||
non_contacts: bool = None,
|
non_contacts: bool = None,
|
||||||
groups: bool = None,
|
groups: bool = None,
|
||||||
broadcasts: bool = None,
|
channels: bool = None,
|
||||||
bots: bool = None,
|
bots: bool = None,
|
||||||
exclude_muted: bool = None,
|
exclude_muted: bool = None,
|
||||||
exclude_read: bool = None,
|
exclude_read: bool = None,
|
||||||
@ -96,13 +96,13 @@ class Folder(Object):
|
|||||||
|
|
||||||
self.id = id
|
self.id = id
|
||||||
self.title = title
|
self.title = title
|
||||||
self.pinned_peers = pinned_peers
|
self.included_chats = included_chats
|
||||||
self.included_peers = included_peers
|
self.excluded_chats = excluded_chats
|
||||||
self.excluded_peers = excluded_peers
|
self.pinned_chats = pinned_chats
|
||||||
self.contacts = contacts
|
self.contacts = contacts
|
||||||
self.non_contacts = non_contacts
|
self.non_contacts = non_contacts
|
||||||
self.groups = groups
|
self.groups = groups
|
||||||
self.broadcasts = broadcasts
|
self.channels = channels
|
||||||
self.bots = bots
|
self.bots = bots
|
||||||
self.exclude_muted = exclude_muted
|
self.exclude_muted = exclude_muted
|
||||||
self.exclude_read = exclude_read
|
self.exclude_read = exclude_read
|
||||||
@ -110,21 +110,32 @@ class Folder(Object):
|
|||||||
self.emoji = emoji
|
self.emoji = emoji
|
||||||
self.has_my_invites = has_my_invites
|
self.has_my_invites = has_my_invites
|
||||||
|
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _parse(client, folder: "raw.types.DialogFilter", peers) -> "Folder":
|
def _parse(client, folder: "raw.types.DialogFilter", users, chats) -> "Folder":
|
||||||
# TODO: Change types.Chat._parse to types.Dialog._parse
|
included_chats = []
|
||||||
|
excluded_chats = []
|
||||||
|
pinned_chats = []
|
||||||
|
|
||||||
|
for peer in folder.include_peers:
|
||||||
|
included_chats.append(types.Chat._parse_dialog(client, peer, users, chats))
|
||||||
|
|
||||||
|
if getattr(folder, "exclude_peers", None):
|
||||||
|
for peer in folder.exclude_peers:
|
||||||
|
excluded_chats.append(types.Chat._parse_dialog(client, peer, users, chats))
|
||||||
|
|
||||||
|
for peer in folder.pinned_peers:
|
||||||
|
pinned_chats.append(types.Chat._parse_dialog(client, peer, users, chats))
|
||||||
|
|
||||||
return Folder(
|
return Folder(
|
||||||
id=folder.id,
|
id=folder.id,
|
||||||
title=folder.title,
|
title=folder.title,
|
||||||
pinned_peers=types.List(types.Chat._parse_chat(client, peers.get(utils.get_input_peer_id(i), None)) for i in folder.pinned_peers) or None,
|
included_chats=types.List(included_chats) or None,
|
||||||
included_peers=types.List(types.Chat._parse_chat(client, peers.get(utils.get_input_peer_id(i), None)) for i in folder.include_peers) or None,
|
excluded_chats=types.List(excluded_chats) or None,
|
||||||
excluded_peers=types.List(types.Chat._parse_chat(client, peers.get(utils.get_input_peer_id(i), None)) for i in folder.exclude_peers) or None if getattr(folder, "exclude_peers", None) else None,
|
pinned_chats=types.List(pinned_chats) or None,
|
||||||
contacts=getattr(folder, "contacts", None),
|
contacts=getattr(folder, "contacts", None),
|
||||||
non_contacts=getattr(folder, "non_contacts", None),
|
non_contacts=getattr(folder, "non_contacts", None),
|
||||||
groups=getattr(folder, "groups", None),
|
groups=getattr(folder, "groups", None),
|
||||||
broadcasts=getattr(folder, "broadcasts", None),
|
channels=getattr(folder, "broadcasts", None),
|
||||||
bots=getattr(folder, "bots", None),
|
bots=getattr(folder, "bots", None),
|
||||||
exclude_muted=getattr(folder, "exclude_muted", None),
|
exclude_muted=getattr(folder, "exclude_muted", None),
|
||||||
exclude_read=getattr(folder, "exclude_read", None),
|
exclude_read=getattr(folder, "exclude_read", None),
|
||||||
@ -154,63 +165,110 @@ class Folder(Object):
|
|||||||
|
|
||||||
return await self._client.delete_folder(self.id)
|
return await self._client.delete_folder(self.id)
|
||||||
|
|
||||||
async def update_peers(self, pinned_peers: List[Union[int, str]], included_peers: List[Union[int, str]], excluded_peers: List[Union[int, str]]):
|
async def update(
|
||||||
|
self,
|
||||||
|
included_chats: List[Union[int, str]] = None,
|
||||||
|
excluded_chats: List[Union[int, str]] = None,
|
||||||
|
pinned_chats: List[Union[int, str]] = None,
|
||||||
|
title: str = None,
|
||||||
|
contacts: bool = None,
|
||||||
|
non_contacts: bool = None,
|
||||||
|
groups: bool = None,
|
||||||
|
channels: bool = None,
|
||||||
|
bots: bool = None,
|
||||||
|
exclude_muted: bool = None,
|
||||||
|
exclude_read: bool = None,
|
||||||
|
exclude_archived: bool = None,
|
||||||
|
emoji: str = None
|
||||||
|
):
|
||||||
"""Bound method *update_peers* of :obj:`~pyrogram.types.Folder`.
|
"""Bound method *update_peers* of :obj:`~pyrogram.types.Folder`.
|
||||||
|
|
||||||
Use as a shortcut for:
|
Use as a shortcut for:
|
||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
await client.update_folder(123456789, ...)
|
await client.update_folder(
|
||||||
|
folder_id,
|
||||||
|
title="New folder",
|
||||||
|
included_chats=["me"]
|
||||||
|
)
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
await folder.update_peers(...)
|
await folder.update(included_chats=["me"])
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
included_chats (``int`` | ``str`` | List of ``int`` or ``str``, *optional*):
|
||||||
|
Users or chats that should added in the folder
|
||||||
|
You can pass an ID (int), username (str) or phone number (str).
|
||||||
|
Multiple users can be added by passing a list of IDs, usernames or phone numbers.
|
||||||
|
|
||||||
|
excluded_chats (``int`` | ``str`` | List of ``int`` or ``str``, *optional*):
|
||||||
|
Users or chats that should excluded from the folder
|
||||||
|
You can pass an ID (int), username (str) or phone number (str).
|
||||||
|
Multiple users can be added by passing a list of IDs, usernames or phone numbers.
|
||||||
|
|
||||||
|
pinned_chats (``int`` | ``str`` | List of ``int`` or ``str``, *optional*):
|
||||||
|
Users or chats that should pinned in the folder
|
||||||
|
You can pass an ID (int), username (str) or phone number (str).
|
||||||
|
Multiple users can be added by passing a list of IDs, usernames or phone numbers.
|
||||||
|
|
||||||
|
title (``str``, *optional*):
|
||||||
|
A folder title was changed to this value.
|
||||||
|
|
||||||
|
contacts (``bool``, *optional*):
|
||||||
|
Pass True if folder should contain contacts.
|
||||||
|
|
||||||
|
non_contacts (``bool``, *optional*):
|
||||||
|
Pass True if folder should contain non contacts.
|
||||||
|
|
||||||
|
groups (``bool``, *optional*):
|
||||||
|
Pass True if folder should contain groups.
|
||||||
|
|
||||||
|
channels (``bool``, *optional*):
|
||||||
|
Pass True if folder should contain channels.
|
||||||
|
|
||||||
|
bots (``bool``, *optional*):
|
||||||
|
Pass True if folder should contain bots.
|
||||||
|
|
||||||
|
exclude_muted (``bool``, *optional*):
|
||||||
|
Pass True if folder should exclude muted users.
|
||||||
|
|
||||||
|
exclude_archived (``bool``, *optional*):
|
||||||
|
Pass True if folder should exclude archived users.
|
||||||
|
|
||||||
|
emoji (``str``, *optional*):
|
||||||
|
Folder emoji.
|
||||||
|
Pass None to leave the folder icon as default.
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
True on success.
|
True on success.
|
||||||
"""
|
"""
|
||||||
|
if not included_chats:
|
||||||
|
included_chats = [i.id for i in self.included_chats or []]
|
||||||
|
|
||||||
|
if not included_chats:
|
||||||
|
excluded_chats = [i.id for i in self.excluded_chats or []]
|
||||||
|
|
||||||
|
if not included_chats:
|
||||||
|
pinned_chats = [i.id for i in self.pinned_chats or []]
|
||||||
|
|
||||||
return await self._client.update_folder(
|
return await self._client.update_folder(
|
||||||
folder_id=self.id,
|
folder_id=self.id,
|
||||||
title=self.title,
|
title=title or self.title,
|
||||||
pinned_peers=pinned_peers,
|
included_chats=included_chats,
|
||||||
included_peers=included_peers,
|
excluded_chats=excluded_chats,
|
||||||
excluded_peers=excluded_peers,
|
pinned_chats=pinned_chats,
|
||||||
contacts=self.contacts,
|
contacts=contacts or self.contacts,
|
||||||
non_contacts=self.non_contacts,
|
non_contacts=non_contacts or self.non_contacts,
|
||||||
groups=self.groups,
|
groups=groups or self.groups,
|
||||||
broadcasts=self.broadcasts,
|
channels=channels or self.channels,
|
||||||
bots=self.bots,
|
bots=bots or self.bots,
|
||||||
exclude_muted=self.exclude_muted,
|
exclude_muted=exclude_muted or self.exclude_muted,
|
||||||
exclude_read=self.exclude_read,
|
exclude_read=exclude_read or self.exclude_read,
|
||||||
exclude_archived=self.exclude_archived,
|
exclude_archived=exclude_archived or self.exclude_archived,
|
||||||
emoji=self.emoji
|
emoji=emoji or self.emoji
|
||||||
)
|
|
||||||
|
|
||||||
async def pin_chat(self, chat_id: Union[int, str]):
|
|
||||||
"""Bound method *pin_chat* of :obj:`~pyrogram.types.Folder`.
|
|
||||||
|
|
||||||
Use as a shortcut for:
|
|
||||||
|
|
||||||
.. code-block:: python
|
|
||||||
|
|
||||||
await client.update_folder(123456789, ...)
|
|
||||||
|
|
||||||
Example:
|
|
||||||
.. code-block:: python
|
|
||||||
|
|
||||||
await folder.pin_chat(chat_id)
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
True on success.
|
|
||||||
"""
|
|
||||||
|
|
||||||
return await self.update_peers(
|
|
||||||
pinned_peers=[i.id for i in self.pinned_peers] if self.pinned_peers else [] + [chat_id],
|
|
||||||
included_peers=[i.id for i in self.included_peers] if self.included_peers else [] + [chat_id],
|
|
||||||
excluded_peers=[i.id for i in self.excluded_peers] if self.excluded_peers else [],
|
|
||||||
)
|
)
|
||||||
|
|
||||||
async def include_chat(self, chat_id: Union[int, str]):
|
async def include_chat(self, chat_id: Union[int, str]):
|
||||||
@ -220,21 +278,31 @@ class Folder(Object):
|
|||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
await client.update_folder(123456789, ...)
|
await client.update_folder(
|
||||||
|
folder_id=123456789,
|
||||||
|
included_chats=[chat_id],
|
||||||
|
excluded_chats=[...],
|
||||||
|
pinned_chats=[...]
|
||||||
|
)
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
await folder.include_chat(chat_id)
|
await folder.include_chat(chat_id)
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
chat_id (``int`` | ``str``):
|
||||||
|
Unique identifier for the target chat or username of the target user/channel/supergroup
|
||||||
|
(in the format @username).
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
True on success.
|
True on success.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
return await self.update_peers(
|
return await self.update(
|
||||||
pinned_peers=[i.id for i in self.pinned_peers] if self.pinned_peers else [],
|
included_chats=[i.id for i in self.included_chats or []] + [chat_id],
|
||||||
included_peers=[i.id for i in self.included_peers] if self.included_peers else [] + [chat_id],
|
excluded_chats=[i.id for i in self.excluded_chats or []],
|
||||||
excluded_peers=[i.id for i in self.excluded_peers] if self.excluded_peers else [],
|
pinned_chats=[i.id for i in self.pinned_chats or []]
|
||||||
)
|
)
|
||||||
|
|
||||||
async def exclude_chat(self, chat_id: Union[int, str]):
|
async def exclude_chat(self, chat_id: Union[int, str]):
|
||||||
@ -244,21 +312,103 @@ class Folder(Object):
|
|||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
await client.update_folder(123456789, ...)
|
await client.update_folder(
|
||||||
|
folder_id=123456789,
|
||||||
|
included_chats=[...],
|
||||||
|
excluded_chats=[chat_id],
|
||||||
|
pinned_chats=[...]
|
||||||
|
)
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
await folder.exclude_chat(chat_id)
|
await folder.exclude_chat(chat_id)
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
chat_id (``int`` | ``str``):
|
||||||
|
Unique identifier for the target chat or username of the target user/channel/supergroup
|
||||||
|
(in the format @username).
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
True on success.
|
True on success.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
return await self.update_peers(
|
return await self.update(
|
||||||
pinned_peers=[i.id for i in self.pinned_peers] if self.pinned_peers else [],
|
included_chats=[i.id for i in self.included_chats or []],
|
||||||
included_peers=[i.id for i in self.included_peers] if self.included_peers else [],
|
excluded_chats=[i.id for i in self.excluded_chats or []] + [chat_id],
|
||||||
excluded_peers=[i.id for i in self.excluded_peers] if self.excluded_peers else [] + [chat_id],
|
pinned_chats=[i.id for i in self.pinned_chats or []],
|
||||||
|
)
|
||||||
|
|
||||||
|
async def pin_chat(self, chat_id: Union[int, str]):
|
||||||
|
"""Bound method *pin_chat* of :obj:`~pyrogram.types.Folder`.
|
||||||
|
|
||||||
|
Use as a shortcut for:
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
|
||||||
|
await client.update_folder(
|
||||||
|
folder_id=123456789,
|
||||||
|
included_chats=[chat_id],
|
||||||
|
excluded_chats=[chat_id],
|
||||||
|
pinned_chats=[...]
|
||||||
|
)
|
||||||
|
|
||||||
|
Example:
|
||||||
|
.. code-block:: python
|
||||||
|
|
||||||
|
await folder.pin_chat(chat_id)
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
chat_id (``int`` | ``str``):
|
||||||
|
Unique identifier for the target chat or username of the target user/channel/supergroup
|
||||||
|
(in the format @username).
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
True on success.
|
||||||
|
"""
|
||||||
|
|
||||||
|
return await self.update(
|
||||||
|
included_chats=[i.id for i in self.included_chats or []] + [chat_id],
|
||||||
|
excluded_chats=[i.id for i in self.excluded_chats or []],
|
||||||
|
pinned_chats=[i.id for i in self.pinned_chats or []] + [chat_id]
|
||||||
|
)
|
||||||
|
|
||||||
|
async def remove_chat(self, chat_id: Union[int, str]):
|
||||||
|
"""Bound method *remove_chat* of :obj:`~pyrogram.types.Folder`.
|
||||||
|
|
||||||
|
Remove chat from included, excluded and pinned chats.
|
||||||
|
|
||||||
|
Use as a shortcut for:
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
|
||||||
|
await client.update_folder(
|
||||||
|
folder_id=123456789,
|
||||||
|
included_chats=[...],
|
||||||
|
excluded_chats=[...],
|
||||||
|
pinned_chats=[...]
|
||||||
|
)
|
||||||
|
|
||||||
|
Example:
|
||||||
|
.. code-block:: python
|
||||||
|
|
||||||
|
await folder.remove_chat(chat_id)
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
chat_id (``int`` | ``str``):
|
||||||
|
Unique identifier for the target chat or username of the target user/channel/supergroup
|
||||||
|
(in the format @username).
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
True on success.
|
||||||
|
"""
|
||||||
|
peer = await self._client.resolve_peer(chat_id)
|
||||||
|
peer_id = utils.get_peer_id(peer)
|
||||||
|
|
||||||
|
return await self.update(
|
||||||
|
included_chats=[i.id for i in self.included_chats or [] if peer_id != i.id],
|
||||||
|
excluded_chats=[i.id for i in self.excluded_chats or [] if peer_id != i.id],
|
||||||
|
pinned_chats=[i.id for i in self.pinned_chats or [] if peer_id != i.id]
|
||||||
)
|
)
|
||||||
|
|
||||||
async def export_link(self):
|
async def export_link(self):
|
||||||
@ -268,12 +418,12 @@ class Folder(Object):
|
|||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
await client.export_link(123456789)
|
await client.export_folder_link(123456789)
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
await folder.export_folder_link(chat_id)
|
await folder.export_link()
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
``str``: On success, a link to the folder as string is returned.
|
``str``: On success, a link to the folder as string is returned.
|
||||||
|
Loading…
Reference in New Issue
Block a user