diff --git a/compiler/docs/compiler.py b/compiler/docs/compiler.py index b5382438..01acf632 100644 --- a/compiler/docs/compiler.py +++ b/compiler/docs/compiler.py @@ -256,14 +256,17 @@ def pyrogram_api(): edit_chat_invite_link revoke_chat_invite_link delete_chat_invite_link - get_chat_invite_link_members - get_chat_invite_link_members_count + get_chat_invite_link_joiners + get_chat_invite_link_joiners_count get_chat_admin_invite_links get_chat_admin_invite_links_count get_chat_admins_with_invite_links + get_chat_join_requests delete_chat_admin_invite_links approve_chat_join_request + approve_all_chat_join_requests decline_chat_join_request + decline_all_chat_join_requests """, contacts=""" Contacts @@ -370,6 +373,7 @@ def pyrogram_api(): ChatEventFilter ChatMemberUpdated ChatJoinRequest + ChatJoiner Dialog Restriction """, diff --git a/pyrogram/methods/invite_links/__init__.py b/pyrogram/methods/invite_links/__init__.py index c2183d9b..67c1d149 100644 --- a/pyrogram/methods/invite_links/__init__.py +++ b/pyrogram/methods/invite_links/__init__.py @@ -17,8 +17,10 @@ # along with Pyrogram. If not, see . +from .approve_all_chat_join_requests import ApproveAllChatJoinRequests from .approve_chat_join_request import ApproveChatJoinRequest from .create_chat_invite_link import CreateChatInviteLink +from .decline_all_chat_join_requests import DeclineAllChatJoinRequests from .decline_chat_join_request import DeclineChatJoinRequest from .delete_chat_admin_invite_links import DeleteChatAdminInviteLinks from .delete_chat_invite_link import DeleteChatInviteLink @@ -28,8 +30,9 @@ from .get_chat_admin_invite_links import GetChatAdminInviteLinks from .get_chat_admin_invite_links_count import GetChatAdminInviteLinksCount from .get_chat_admins_with_invite_links import GetChatAdminsWithInviteLinks from .get_chat_invite_link import GetChatInviteLink -from .get_chat_invite_link_members import GetChatInviteLinkMembers -from .get_chat_invite_link_members_count import GetChatInviteLinkMembersCount +from .get_chat_invite_link_joiners import GetChatInviteLinkJoiners +from .get_chat_invite_link_joiners_count import GetChatInviteLinkJoinersCount +from .get_chat_join_requests import GetChatJoinRequests from .revoke_chat_invite_link import RevokeChatInviteLink @@ -38,8 +41,8 @@ class InviteLinks( DeleteChatInviteLink, EditChatInviteLink, CreateChatInviteLink, - GetChatInviteLinkMembers, - GetChatInviteLinkMembersCount, + GetChatInviteLinkJoiners, + GetChatInviteLinkJoinersCount, GetChatAdminInviteLinks, ExportChatInviteLink, DeleteChatAdminInviteLinks, @@ -47,6 +50,9 @@ class InviteLinks( GetChatAdminsWithInviteLinks, GetChatInviteLink, ApproveChatJoinRequest, - DeclineChatJoinRequest + DeclineChatJoinRequest, + ApproveAllChatJoinRequests, + DeclineAllChatJoinRequests, + GetChatJoinRequests ): pass diff --git a/pyrogram/methods/invite_links/get_chat_invite_link_members.py b/pyrogram/methods/invite_links/get_chat_invite_link_joiners.py similarity index 85% rename from pyrogram/methods/invite_links/get_chat_invite_link_members.py rename to pyrogram/methods/invite_links/get_chat_invite_link_joiners.py index 28121ccc..cfd68734 100644 --- a/pyrogram/methods/invite_links/get_chat_invite_link_members.py +++ b/pyrogram/methods/invite_links/get_chat_invite_link_joiners.py @@ -23,13 +23,13 @@ from pyrogram import raw from pyrogram import types -class GetChatInviteLinkMembers: - async def get_chat_invite_link_members( +class GetChatInviteLinkJoiners: + async def get_chat_invite_link_joiners( self: "pyrogram.Client", chat_id: Union[int, str], invite_link: str, limit: int = 0 - ) -> Optional[AsyncGenerator["types.ChatMember", None]]: + ) -> Optional[AsyncGenerator["types.ChatJoiner", None]]: """Get the members who joined the chat with the invite link. Parameters: @@ -45,10 +45,10 @@ class GetChatInviteLinkMembers: By default, no limit is applied and all invite links are returned. Returns: - ``Generator``: A generator yielding :obj:`~pyrogram.types.ChatMember` objects. + ``Generator``: A generator yielding :obj:`~pyrogram.types.ChatJoiner` objects. Yields: - :obj:`~pyrogram.types.ChatMember` objects. + :obj:`~pyrogram.types.ChatJoiner` objects. """ current = 0 total = abs(limit) or (1 << 31) - 1 @@ -77,13 +77,7 @@ class GetChatInviteLinkMembers: offset_user = await self.resolve_peer(r.importers[-1].user_id) for i in r.importers: - user = types.User._parse(self, users[i.user_id]) - - yield types.ChatMember( - user=user, - status="member", - joined_date=i.date - ) + yield types.ChatJoiner._parse(self, i, users) current += 1 diff --git a/pyrogram/methods/invite_links/get_chat_invite_link_members_count.py b/pyrogram/methods/invite_links/get_chat_invite_link_joiners_count.py similarity index 95% rename from pyrogram/methods/invite_links/get_chat_invite_link_members_count.py rename to pyrogram/methods/invite_links/get_chat_invite_link_joiners_count.py index d5428957..084fbae5 100644 --- a/pyrogram/methods/invite_links/get_chat_invite_link_members_count.py +++ b/pyrogram/methods/invite_links/get_chat_invite_link_joiners_count.py @@ -22,8 +22,8 @@ import pyrogram from pyrogram import raw -class GetChatInviteLinkMembersCount: - async def get_chat_invite_link_members_count( +class GetChatInviteLinkJoinersCount: + async def get_chat_invite_link_joiners_count( self: "pyrogram.Client", chat_id: Union[int, str], invite_link: str diff --git a/pyrogram/methods/invite_links/get_chat_join_requests.py b/pyrogram/methods/invite_links/get_chat_join_requests.py new file mode 100644 index 00000000..9a9bc387 --- /dev/null +++ b/pyrogram/methods/invite_links/get_chat_join_requests.py @@ -0,0 +1,86 @@ +# Pyrogram - Telegram MTProto API Client Library for Python +# Copyright (C) 2017-present Dan +# +# 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 . + +from typing import Union, Optional, AsyncGenerator + +import pyrogram +from pyrogram import raw +from pyrogram import types + + +class GetChatJoinRequests: + async def get_chat_join_requests( + self: "pyrogram.Client", + chat_id: Union[int, str], + limit: int = 0, + query: str = "" + ) -> Optional[AsyncGenerator["types.ChatJoiner", None]]: + """Get the pending join requests of a chat. + + Parameters: + chat_id (``int`` | ``str``): + Unique identifier for the target chat or username of the target channel/supergroup + (in the format @username). + + limit (``int``, *optional*): + Limits the number of invite links to be retrieved. + By default, no limit is applied and all invite links are returned. + + query (``str``, *optional*): + Query to search for a user. + + Returns: + ``Generator``: A generator yielding :obj:`~pyrogram.types.ChatJoiner` objects. + + Yields: + :obj:`~pyrogram.types.ChatJoiner` objects. + """ + current = 0 + total = abs(limit) or (1 << 31) - 1 + limit = min(100, total) + + offset_date = 0 + offset_user = raw.types.InputUserEmpty() + + while True: + r = await self.invoke( + raw.functions.messages.GetChatInviteImporters( + peer=await self.resolve_peer(chat_id), + limit=limit, + offset_date=offset_date, + offset_user=offset_user, + requested=True, + q=query + ) + ) + + if not r.importers: + break + + users = {i.id: i for i in r.users} + + offset_date = r.importers[-1].date + offset_user = await self.resolve_peer(r.importers[-1].user_id) + + for i in r.importers: + yield types.ChatJoiner._parse(self, i, users) + + current += 1 + + if current >= total: + return diff --git a/pyrogram/types/user_and_chats/__init__.py b/pyrogram/types/user_and_chats/__init__.py index 15ddf8c9..bf508279 100644 --- a/pyrogram/types/user_and_chats/__init__.py +++ b/pyrogram/types/user_and_chats/__init__.py @@ -22,6 +22,7 @@ from .chat_event import ChatEvent from .chat_event_filter import ChatEventFilter from .chat_invite_link import ChatInviteLink from .chat_join_request import ChatJoinRequest +from .chat_joiner import ChatJoiner from .chat_member import ChatMember from .chat_member_updated import ChatMemberUpdated from .chat_permissions import ChatPermissions @@ -57,5 +58,6 @@ __all__ = [ "ChatMemberUpdated", "VoiceChatScheduled", "ChatJoinRequest", - "ChatPrivileges" + "ChatPrivileges", + "ChatJoiner" ] diff --git a/pyrogram/types/user_and_chats/chat_joiner.py b/pyrogram/types/user_and_chats/chat_joiner.py new file mode 100644 index 00000000..024f88ea --- /dev/null +++ b/pyrogram/types/user_and_chats/chat_joiner.py @@ -0,0 +1,82 @@ +# Pyrogram - Telegram MTProto API Client Library for Python +# Copyright (C) 2017-present Dan +# +# 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 . + +from datetime import datetime +from typing import Dict + +import pyrogram +from pyrogram import raw, types, utils +from ..object import Object + + +class ChatJoiner(Object): + """Contains information about a joiner member of a chat. + + Parameters: + user (:obj:`~pyrogram.types.User`): + Information about the user. + + date (:py:obj:`~datetime.datetime`): + Date when the user joined. + + bio (``str``, *optional*): + Bio of the user. + + pending (``bool``, *optional*): + True in case the chat joiner has a pending request. + + approved_by (:obj:`~pyrogram.types.User`, *optional*): + Administrator who approved this chat joiner. + """ + + def __init__( + self, + *, + client: "pyrogram.Client", + user: "types.User", + date: datetime = None, + bio: str = None, + pending: bool = None, + approved_by: "types.User" = None, + ): + super().__init__(client) + + self.user = user + self.date = date + self.bio = bio + self.pending = pending + self.approved_by = approved_by + + @staticmethod + def _parse( + client: "pyrogram.Client", + joiner: "raw.base.ChatInviteImporter", + users: Dict[int, "raw.base.User"], + ) -> "ChatJoiner": + return ChatJoiner( + user=types.User._parse(client, users[joiner.user_id]), + date=utils.timestamp_to_datetime(joiner.date), + pending=joiner.requested, + bio=joiner.about, + approved_by=( + types.User._parse(client, users[joiner.approved_by]) + if joiner.approved_by + else None + ), + client=client + )