B
    fd                 @   st   d dl Z d dlmZmZmZ d dlZd dlmZmZmZ e 	e
Zdeeef edeedddZG d	d
 d
ZdS )    N)UnionOptionalAsyncGenerator)rawtypesenumszpyrogram.Clientzenums.ChatMembersFilter)clientchat_idoffsetfilterlimitqueryc       	         s   |t jjt jjt jjgk}|r*|j|dn| }jtjj	j
|I d H |||ddddI d H }|j}dd |jD dd |jD   fd	d
|D S )N)qr   )Zchannelr   r
   r   hash<   )Zsleep_thresholdc             S   s   i | ]}||j qS  )id).0ur   r   K/tmp/pip-unpacked-wheel-rcokkf2l/pyrogram/methods/chats/get_chat_members.py
<dictcomp>6   s    zget_chunk.<locals>.<dictcomp>c             S   s   i | ]}||j qS r   )r   )r   cr   r   r   r   7   s    c                s   g | ]}t j| qS r   )r   
ChatMember_parse)r   member)chatsr   usersr   r   
<listcomp>9   s    zget_chunk.<locals>.<listcomp>)r   ChatMembersFilterSEARCHZBANNEDZ
RESTRICTEDvalueinvoker   	functionsZchannelsZGetParticipantsresolve_peerparticipantsr   r   )	r   r	   r
   r   r   r   Zis_queryablermembersr   )r   r   r   r   	get_chunk   s     r'   c            	   @   s@   e Zd Zddejjfdeeef eede	e
d  dddZd	S )
GetChatMembers r   zpyrogram.Clientzenums.ChatMembersFilter)ztypes.ChatMemberN)selfr	   r   r   r   returnc             C  s   |  |I dH }t|tjjr| tjjj|j	dI dH }t
|jjdg }dd |jD }x |D ]}	tj| |	|i V  qbW dS d}
d}t|pd}td|}xZt| |||||d	I dH }|sdS |t|7 }x&|D ]}	|	V  |
d
7 }
|
|krdS qW qW dS )a  Get the members list of a chat.

        A chat can be either a basic group, a supergroup or a channel.
        Requires administrator rights in channels.

        .. include:: /_includes/usable-by/users-bots.rst

        Parameters:
            chat_id (``int`` | ``str``):
                Unique identifier (int) or username (str) of the target chat.

            query (``str``, *optional*):
                Query string to filter members based on their display names and usernames.
                Only applicable to supergroups and channels. Defaults to "" (empty string).
                A query string is applicable only for :obj:`~pyrogram.enums.ChatMembersFilter.SEARCH`,
                :obj:`~pyrogram.enums.ChatMembersFilter.BANNED` and :obj:`~pyrogram.enums.ChatMembersFilter.RESTRICTED`
                filters only.

            limit (``int``, *optional*):
                Limits the number of members to be retrieved.

            filter (:obj:`~pyrogram.enums.ChatMembersFilter`, *optional*):
                Filter used to select the kind of members you want to retrieve. Only applicable for supergroups
                and channels.

        Returns:
            ``Generator``: On success, a generator yielding :obj:`~pyrogram.types.ChatMember` objects is returned.

        Example:
            .. code-block:: python

                from pyrogram import enums

                # Get members
                async for member in app.get_chat_members(chat_id):
                    print(member)

                # Get administrators
                administrators = []
                async for m in app.get_chat_members(chat_id, filter=enums.ChatMembersFilter.ADMINISTRATORS):
                    administrators.append(m)

                # Get bots
                bots = []
                async for m in app.get_chat_members(chat_id, filter=enums.ChatMembersFilter.BOTS):
                    bots.append(m)
        N)r	   r$   c             S   s   i | ]}||j qS r   )r   )r   ir   r   r   r   }   s    z3GetChatMembers.get_chat_members.<locals>.<dictcomp>r   i   )r   r	   r
   r   r   r      )r#   
isinstancer   r   ZInputPeerChatr!   r"   messagesZGetFullChatr	   getattrZ	full_chatr$   r   r   r   absminr'   len)r*   r	   r   r   r   Zpeerr%   r&   r   r   currentr
   totalr   r   r   get_chat_members=   s<    6


zGetChatMembers.get_chat_membersN)__name__
__module____qualname__r   r   r   r   intstrr   r   r7   r   r   r   r   r(   <   s   r(   )loggingtypingr   r   r   Zpyrogramr   r   r   	getLoggerr8   logr;   r<   r'   r(   r   r   r   r   <module>   s   

