2
0
mirror of https://github.com/pyrogram/pyrogram synced 2025-08-22 18:07:21 +00:00

Add ChatJoiner and get_chat_join_requests

Rename get_chat_invite_link_{members -> joiners}
Rename get_chat_invite_link_{members -> joiners}_count
This commit is contained in:
Dan 2022-04-24 11:56:07 +02:00
parent f6f6141b19
commit d48cef9a26
7 changed files with 196 additions and 22 deletions

View File

@ -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
""",

View File

@ -17,8 +17,10 @@
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
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

View File

@ -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

View File

@ -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

View File

@ -0,0 +1,86 @@
# 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 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

View File

@ -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"
]

View File

@ -0,0 +1,82 @@
# 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 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
)