U
    2tct                     @   s   d Z ddlZddlmZmZmZmZmZmZ ddl	m
Z
mZmZ ddlmZmZ ddlmZ erlddl	mZ G dd	 d	e
ZG d
d deZG dd deZG dd deZG dd deZG dd deZG dd deZdS )zEThis module contains an object that represents a Telegram ChatMember.    N)TYPE_CHECKINGAnyOptionalClassVarDictType)TelegramObjectUser	constants)from_timestampto_timestamp)JSONDict)Botc                       s   e Zd ZU dZdZejZee	 e
d< ejZee	 e
d< ejZee	 e
d< ejZee	 e
d< ejZee	 e
d< ejZee	 e
d< dee	ejeeeeeeeeeeeeeeee	eeeeed
ddZeee ded  dddZed fddZ  ZS )
ChatMemberan#  Base class for Telegram ChatMember Objects.
    Currently, the following 6 types of chat members are supported:

    * :class:`telegram.ChatMemberOwner`
    * :class:`telegram.ChatMemberAdministrator`
    * :class:`telegram.ChatMemberMember`
    * :class:`telegram.ChatMemberRestricted`
    * :class:`telegram.ChatMemberLeft`
    * :class:`telegram.ChatMemberBanned`

    Objects of this class are comparable in terms of equality. Two objects of this class are
    considered equal, if their :attr:`user` and :attr:`status` are equal.

    Note:
        As of Bot API 5.3, :class:`ChatMember` is nothing but the base class for the subclasses
        listed above and is no longer returned directly by :meth:`~telegram.Bot.get_chat`.
        Therefore, most of the arguments and attributes were deprecated and you should no longer
        use :class:`ChatMember` directly.

    Args:
        user (:class:`telegram.User`): Information about the user.
        status (:obj:`str`): The member's status in the chat. Can be
            :attr:`~telegram.ChatMember.ADMINISTRATOR`, :attr:`~telegram.ChatMember.CREATOR`,
            :attr:`~telegram.ChatMember.KICKED`, :attr:`~telegram.ChatMember.LEFT`,
            :attr:`~telegram.ChatMember.MEMBER` or :attr:`~telegram.ChatMember.RESTRICTED`.
        custom_title (:obj:`str`, optional): Owner and administrators only.
            Custom title for this user.

            .. deprecated:: 13.7

        is_anonymous (:obj:`bool`, optional): Owner and administrators only. :obj:`True`, if the
            user's presence in the chat is hidden.

            .. deprecated:: 13.7

        until_date (:class:`datetime.datetime`, optional): Restricted and kicked only. Date when
            restrictions will be lifted for this user.

            .. deprecated:: 13.7

        can_be_edited (:obj:`bool`, optional): Administrators only. :obj:`True`, if the bot is
            allowed to edit administrator privileges of that user.

            .. deprecated:: 13.7

        can_manage_chat (:obj:`bool`, optional): Administrators only. :obj:`True`, if the
            administrator can access the chat event log, chat statistics, message statistics in
            channels, see channel members, see anonymous administrators in supergroups and ignore
            slow mode. Implied by any other administrator privilege.

            .. versionadded:: 13.4
            .. deprecated:: 13.7

        can_manage_voice_chats (:obj:`bool`, optional): Administrators only. :obj:`True`, if the
            administrator can manage voice chats.

            .. versionadded:: 13.4
            .. deprecated:: 13.7

        can_change_info (:obj:`bool`, optional): Administrators and restricted only. :obj:`True`,
            if the user can change the chat title, photo and other settings.

            .. deprecated:: 13.7

        can_post_messages (:obj:`bool`, optional): Administrators only. :obj:`True`, if the
            administrator can post in the channel, channels only.

            .. deprecated:: 13.7

        can_edit_messages (:obj:`bool`, optional): Administrators only. :obj:`True`, if the
            administrator can edit messages of other users and can pin messages; channels only.

            .. deprecated:: 13.7

        can_delete_messages (:obj:`bool`, optional): Administrators only. :obj:`True`, if the
            administrator can delete messages of other users.

            .. deprecated:: 13.7

        can_invite_users (:obj:`bool`, optional): Administrators and restricted only. :obj:`True`,
            if the user can invite new users to the chat.

            .. deprecated:: 13.7

        can_restrict_members (:obj:`bool`, optional): Administrators only. :obj:`True`, if the
            administrator can restrict, ban or unban chat members.

            .. deprecated:: 13.7

        can_pin_messages (:obj:`bool`, optional): Administrators and restricted only. :obj:`True`,
            if the user can pin messages, groups and supergroups only.

            .. deprecated:: 13.7

        can_promote_members (:obj:`bool`, optional): Administrators only. :obj:`True`, if the
            administrator can add new administrators with a subset of his own privileges or demote
            administrators that he has promoted, directly or indirectly (promoted by administrators
            that were appointed by the user).

            .. deprecated:: 13.7

        is_member (:obj:`bool`, optional): Restricted only. :obj:`True`, if the user is a member of
            the chat at the moment of the request.

            .. deprecated:: 13.7

        can_send_messages (:obj:`bool`, optional): Restricted only. :obj:`True`, if the user can
            send text messages, contacts, locations and venues.

            .. deprecated:: 13.7

        can_send_media_messages (:obj:`bool`, optional): Restricted only. :obj:`True`, if the user
            can send audios, documents, photos, videos, video notes and voice notes.

            .. deprecated:: 13.7

        can_send_polls (:obj:`bool`, optional): Restricted only. :obj:`True`, if the user is
            allowed to send polls.

            .. deprecated:: 13.7

        can_send_other_messages (:obj:`bool`, optional): Restricted only. :obj:`True`, if the user
            can send animations, games, stickers and use inline bots.

            .. deprecated:: 13.7

        can_add_web_page_previews (:obj:`bool`, optional): Restricted only. :obj:`True`, if user
            may add web page previews to his messages.

            .. deprecated:: 13.7

    Attributes:
        user (:class:`telegram.User`): Information about the user.
        status (:obj:`str`): The member's status in the chat.
        custom_title (:obj:`str`): Optional. Custom title for owner and administrators.

            .. deprecated:: 13.7

        is_anonymous (:obj:`bool`): Optional. :obj:`True`, if the user's presence in the chat is
            hidden.

            .. deprecated:: 13.7

        until_date (:class:`datetime.datetime`): Optional. Date when restrictions will be lifted
            for this user.

            .. deprecated:: 13.7

        can_be_edited (:obj:`bool`): Optional. If the bot is allowed to edit administrator
            privileges of that user.

            .. deprecated:: 13.7

        can_manage_chat (:obj:`bool`): Optional. If the administrator can access the chat event
            log, chat statistics, message statistics in channels, see channel members, see
            anonymous administrators in supergroups and ignore slow mode.

            .. versionadded:: 13.4
            .. deprecated:: 13.7

        can_manage_voice_chats (:obj:`bool`): Optional. if the administrator can manage
            voice chats.

            .. versionadded:: 13.4
            .. deprecated:: 13.7

        can_change_info (:obj:`bool`): Optional. If the user can change the chat title, photo and
            other settings.

            .. deprecated:: 13.7

        can_post_messages (:obj:`bool`): Optional. If the administrator can post in the channel.

            .. deprecated:: 13.7

        can_edit_messages (:obj:`bool`): Optional. If the administrator can edit messages of other
            users.

            .. deprecated:: 13.7

        can_delete_messages (:obj:`bool`): Optional. If the administrator can delete messages of
            other users.

            .. deprecated:: 13.7

        can_invite_users (:obj:`bool`): Optional. If the user can invite new users to the chat.

            .. deprecated:: 13.7

        can_restrict_members (:obj:`bool`): Optional. If the administrator can restrict, ban or
            unban chat members.

            .. deprecated:: 13.7

        can_pin_messages (:obj:`bool`): Optional. If the user can pin messages.

            .. deprecated:: 13.7

        can_promote_members (:obj:`bool`): Optional. If the administrator can add new
            administrators.

            .. deprecated:: 13.7

        is_member (:obj:`bool`): Optional. Restricted only. :obj:`True`, if the user is a member of
            the chat at the moment of the request.

            .. deprecated:: 13.7

        can_send_messages (:obj:`bool`): Optional. If the user can send text messages, contacts,
            locations and venues.

            .. deprecated:: 13.7

        can_send_media_messages (:obj:`bool`): Optional. If the user can send media messages,
            implies can_send_messages.

            .. deprecated:: 13.7

        can_send_polls (:obj:`bool`): Optional. :obj:`True`, if the user is allowed to
            send polls.

            .. deprecated:: 13.7

        can_send_other_messages (:obj:`bool`): Optional. If the user can send animations, games,
            stickers and use inline bots, implies can_send_media_messages.

            .. deprecated:: 13.7

        can_add_web_page_previews (:obj:`bool`): Optional. If user may add web page previews to his
            messages, implies can_send_media_messages

            .. deprecated:: 13.7

    )	is_membercan_restrict_memberscan_delete_messagescustom_titlecan_be_editedcan_post_messagescan_send_messagescan_edit_messagescan_send_media_messagesis_anonymouscan_add_web_page_previewscan_send_other_messagescan_invite_userscan_send_pollsusercan_promote_membersstatuscan_change_infocan_pin_messagescan_manage_chatcan_manage_voice_chatscan_manage_video_chats
until_date	_id_attrsADMINISTRATORCREATORKICKEDLEFTMEMBER
RESTRICTEDN)r   r    r&   r   r!   r   r   r   r   r   r"   r   r   r   r   r   r   r   r   r   r#   r$   r%   _kwargsc                 K   s   |d k	r |d k	r ||kr t d|| _|| _|| _|| _|| _|| _|| _|| _|| _	|| _
|	| _|
| _|| _|| _|| _|| _|| _|| _|| _|| _|| _|d k	r|n|}|| _|| _| j| jf| _d S )NzOOnly supply one of `can_manage_video_chats`/`can_manage_voice_chats`, not both.)
ValueErrorr   r    r   r   r&   r   r!   r   r   r   r   r   r"   r   r   r   r   r   r   r   r#   r$   r%   r'   )selfr   r    r&   r   r!   r   r   r   r   r   r"   r   r   r   r   r   r   r   r   r   r#   r$   r%   r.   temp r2   7/tmp/pip-unpacked-wheel-2u9rcp5s/telegram/chatmember.py__init__3  sB    zChatMember.__init__r   )databotreturnc                 C   s   |  |}|sdS t|d||d< t|dd|d< | jt| jt| j	t
| jt| jt| jti}| tkr||d | f |d|iS | f |S )z,See :meth:`telegram.TelegramObject.de_json`.Nr   r&   r    r6   )Z_parse_datar	   de_jsongetr   r)   ChatMemberOwnerr(   ChatMemberAdministratorr,   ChatMemberMemberr-   ChatMemberRestrictedr+   ChatMemberLeftr*   ChatMemberBannedr   )clsr5   r6   Z_class_mappingr2   r2   r3   r8   y  s*    
      	zChatMember.de_json)r7   c                    s   t   }t| j|d< |S )z,See :meth:`telegram.TelegramObject.to_dict`.r&   )superto_dictr   r&   )r0   r5   	__class__r2   r3   rB     s    
zChatMember.to_dict)NNNNNNNNNNNNNNNNNNNNN) __name__
__module____qualname____doc__	__slots__r
   ZCHATMEMBER_ADMINISTRATORr(   r   str__annotations__ZCHATMEMBER_CREATORr)   ZCHATMEMBER_KICKEDr*   ZCHATMEMBER_LEFTr+   ZCHATMEMBER_MEMBERr,   ZCHATMEMBER_RESTRICTEDr-   r	   datetimeboolr   r4   classmethodr   r   r8   rB   __classcell__r2   r2   rC   r3   r      sv   
 l                     Fr   c                       s2   e Zd ZdZdZdeeeed fddZ	  Z
S )r:   a  
    Represents a chat member that owns the chat
    and has all administrator privileges.

    .. versionadded:: 13.7

    Args:
        user (:class:`telegram.User`): Information about the user.
        custom_title (:obj:`str`, optional): Custom title for this user.
        is_anonymous (:obj:`bool`, optional): :obj:`True`, if the
            user's presence in the chat is hidden.

    Attributes:
        status (:obj:`str`): The member's status in the chat,
            always :attr:`telegram.ChatMember.CREATOR`.
        user (:class:`telegram.User`): Information about the user.
        custom_title (:obj:`str`): Optional. Custom title for
            this user.
        is_anonymous (:obj:`bool`): Optional. :obj:`True`, if the user's
            presence in the chat is hidden.
    r2   N)r   r   r   r.   c                    s   t  jtj|||d d S )N)r    r   r   r   )rA   r4   r   r)   )r0   r   r   r   r.   rC   r2   r3   r4     s    zChatMemberOwner.__init__)NN)rE   rF   rG   rH   rI   r	   rJ   rM   r   r4   rO   r2   r2   rC   r3   r:     s     r:   c                       sJ   e Zd ZdZdZdeeeeeeeeeeeeeeeed fddZ	  Z
S )r;   a0  
    Represents a chat member that has some additional privileges.

    .. versionadded:: 13.7

    .. versionchanged:: 13.12
        Since Bot API 6.0, voice chat was renamed to video chat.

    Args:
        user (:class:`telegram.User`): Information about the user.
        can_be_edited (:obj:`bool`, optional): :obj:`True`, if the bot
            is allowed to edit administrator privileges of that user.
        custom_title (:obj:`str`, optional): Custom title for this user.
        is_anonymous (:obj:`bool`, optional): :obj:`True`, if the  user's
            presence in the chat is hidden.
        can_manage_chat (:obj:`bool`, optional): :obj:`True`, if the administrator
            can access the chat event log, chat statistics, message statistics in
            channels, see channel members, see anonymous administrators in supergroups
            and ignore slow mode. Implied by any other administrator privilege.
        can_post_messages (:obj:`bool`, optional): :obj:`True`, if the
            administrator can post in the channel, channels only.
        can_edit_messages (:obj:`bool`, optional): :obj:`True`, if the
            administrator can edit messages of other users and can pin
            messages; channels only.
        can_delete_messages (:obj:`bool`, optional): :obj:`True`, if the
            administrator can delete messages of other users.
        can_manage_voice_chats (:obj:`bool`, optional): :obj:`True`, if the
            administrator can manage voice chats.

            .. deprecated:: 13.12
        can_manage_video_chats (:obj:`bool`): :obj:`True`, if the
            administrator can manage video chats.

            .. versionadded:: 13.12
        can_restrict_members (:obj:`bool`, optional): :obj:`True`, if the
            administrator can restrict, ban or unban chat members.
        can_promote_members (:obj:`bool`, optional): :obj:`True`, if the administrator
            can add new administrators with a subset of his own privileges or demote
            administrators that he has promoted, directly or indirectly (promoted by
            administrators that were appointed by the user).
        can_change_info (:obj:`bool`, optional): :obj:`True`, if the user can change
            the chat title, photo and other settings.
        can_invite_users (:obj:`bool`, optional): :obj:`True`, if the user can invite
            new users to the chat.
        can_pin_messages (:obj:`bool`, optional): :obj:`True`, if the user is allowed
            to pin messages; groups and supergroups only.

    Attributes:
        status (:obj:`str`): The member's status in the chat,
            always :attr:`telegram.ChatMember.ADMINISTRATOR`.
        user (:class:`telegram.User`): Information about the user.
        can_be_edited (:obj:`bool`): Optional. :obj:`True`, if the bot
            is allowed to edit administrator privileges of that user.
        custom_title (:obj:`str`): Optional. Custom title for this user.
        is_anonymous (:obj:`bool`): Optional. :obj:`True`, if the  user's
            presence in the chat is hidden.
        can_manage_chat (:obj:`bool`): Optional. :obj:`True`, if the administrator
            can access the chat event log, chat statistics, message statistics in
            channels, see channel members, see anonymous administrators in supergroups
            and ignore slow mode. Implied by any other administrator privilege.
        can_post_messages (:obj:`bool`): Optional. :obj:`True`, if the
            administrator can post in the channel, channels only.
        can_edit_messages (:obj:`bool`): Optional. :obj:`True`, if the
            administrator can edit messages of other users and can pin
            messages; channels only.
        can_delete_messages (:obj:`bool`): Optional. :obj:`True`, if the
            administrator can delete messages of other users.
        can_manage_voice_chats (:obj:`bool`): Optional. :obj:`True`, if the
            administrator can manage voice chats.

            .. deprecated:: 13.12 contains the same value as :attr:`can_manage_video_chats`
                for backwards compatibility.
        can_manage_video_chats (:obj:`bool`): :obj:`True`, if the
            administrator can manage video chats.

            .. versionadded:: 13.12
        can_restrict_members (:obj:`bool`): Optional. :obj:`True`, if the
            administrator can restrict, ban or unban chat members.
        can_promote_members (:obj:`bool`): Optional. :obj:`True`, if the administrator
            can add new administrators with a subset of his own privileges or demote
            administrators that he has promoted, directly or indirectly (promoted by
            administrators that were appointed by the user).
        can_change_info (:obj:`bool`): Optional. :obj:`True`, if the user can change
            the chat title, photo and other settings.
        can_invite_users (:obj:`bool`): Optional. :obj:`True`, if the user can invite
            new users to the chat.
        can_pin_messages (:obj:`bool`): Optional. :obj:`True`, if the user is allowed
            to pin messages; groups and supergroups only.
    r2   N)r   r   r   r   r#   r   r   r   r$   r   r   r!   r   r"   r%   r.   c                    s2   t  jtj|||||||||	|
|||||d d S )N)r    r   r   r   r   r#   r   r   r   r$   r   r   r!   r   r"   r%   )rA   r4   r   r(   )r0   r   r   r   r   r#   r   r   r   r$   r   r   r!   r   r"   r%   r.   rC   r2   r3   r4     s$    z ChatMemberAdministrator.__init__)NNNNNNNNNNNNNN)rE   rF   rG   rH   rI   r	   rM   rJ   r   r4   rO   r2   r2   rC   r3   r;     sD   Z              r;   c                       s,   e Zd ZdZdZeed fddZ  ZS )r<   a  
    Represents a chat member that has no additional
    privileges or restrictions.

    .. versionadded:: 13.7

    Args:
        user (:class:`telegram.User`): Information about the user.

    Attributes:
        status (:obj:`str`): The member's status in the chat,
            always :attr:`telegram.ChatMember.MEMBER`.
        user (:class:`telegram.User`): Information about the user.

    r2   r   r.   c                    s   t  jtj|d d S N)r    r   )rA   r4   r   r,   r0   r   r.   rC   r2   r3   r4   Y  s    zChatMemberMember.__init__	rE   rF   rG   rH   rI   r	   r   r4   rO   r2   r2   rC   r3   r<   F  s   r<   c                       sD   e Zd ZdZdZdeeeeeeeeeeejed fddZ	  Z
S )r=   a  
    Represents a chat member that is under certain restrictions
    in the chat. Supergroups only.

    .. versionadded:: 13.7

    Args:
        user (:class:`telegram.User`): Information about the user.
        is_member (:obj:`bool`, optional): :obj:`True`, if the user is a
            member of the chat at the moment of the request.
        can_change_info (:obj:`bool`, optional): :obj:`True`, if the user can change
            the chat title, photo and other settings.
        can_invite_users (:obj:`bool`, optional): :obj:`True`, if the user can invite
            new users to the chat.
        can_pin_messages (:obj:`bool`, optional): :obj:`True`, if the user is allowed
            to pin messages; groups and supergroups only.
        can_send_messages (:obj:`bool`, optional): :obj:`True`, if the user is allowed
            to send text messages, contacts, locations and venues.
        can_send_media_messages (:obj:`bool`, optional): :obj:`True`, if the user is allowed
            to send audios, documents, photos, videos, video notes and voice notes.
        can_send_polls (:obj:`bool`, optional): :obj:`True`, if the user is allowed
            to send polls.
        can_send_other_messages (:obj:`bool`, optional): :obj:`True`, if the user is allowed
            to send animations, games, stickers and use inline bots.
        can_add_web_page_previews (:obj:`bool`, optional): :obj:`True`, if the user is
           allowed to add web page previews to their messages.
        until_date (:class:`datetime.datetime`, optional): Date when restrictions
           will be lifted for this user.

    Attributes:
        status (:obj:`str`): The member's status in the chat,
            always :attr:`telegram.ChatMember.RESTRICTED`.
        user (:class:`telegram.User`): Information about the user.
        is_member (:obj:`bool`): Optional. :obj:`True`, if the user is a
            member of the chat at the moment of the request.
        can_change_info (:obj:`bool`): Optional. :obj:`True`, if the user can change
            the chat title, photo and other settings.
        can_invite_users (:obj:`bool`): Optional. :obj:`True`, if the user can invite
            new users to the chat.
        can_pin_messages (:obj:`bool`): Optional. :obj:`True`, if the user is allowed
            to pin messages; groups and supergroups only.
        can_send_messages (:obj:`bool`): Optional. :obj:`True`, if the user is allowed
            to send text messages, contacts, locations and venues.
        can_send_media_messages (:obj:`bool`): Optional. :obj:`True`, if the user is allowed
            to send audios, documents, photos, videos, video notes and voice notes.
        can_send_polls (:obj:`bool`): Optional. :obj:`True`, if the user is allowed
            to send polls.
        can_send_other_messages (:obj:`bool`): Optional. :obj:`True`, if the user is allowed
            to send animations, games, stickers and use inline bots.
        can_add_web_page_previews (:obj:`bool`): Optional. :obj:`True`, if the user is
           allowed to add web page previews to their messages.
        until_date (:class:`datetime.datetime`): Optional. Date when restrictions
           will be lifted for this user.

    r2   N)r   r   r!   r   r"   r   r   r   r   r   r&   r.   c                    s*   t  jtj|||||||||	|
|d d S )N)r    r   r   r!   r   r"   r   r   r   r   r   r&   )rA   r4   r   r-   )r0   r   r   r!   r   r"   r   r   r   r   r   r&   r.   rC   r2   r3   r4     s    zChatMemberRestricted.__init__)
NNNNNNNNNN)rE   rF   rG   rH   rI   r	   rM   rL   r   r4   rO   r2   r2   rC   r3   r=   ]  s4   8          r=   c                       s,   e Zd ZdZdZeed fddZ  ZS )r>   a  
    Represents a chat member that isn't currently a member of the chat,
    but may join it themselves.

    .. versionadded:: 13.7

    Args:
        user (:class:`telegram.User`): Information about the user.

    Attributes:
        status (:obj:`str`): The member's status in the chat,
            always :attr:`telegram.ChatMember.LEFT`.
        user (:class:`telegram.User`): Information about the user.
    r2   rP   c                    s   t  jtj|d d S rQ   )rA   r4   r   r+   rR   rC   r2   r3   r4     s    zChatMemberLeft.__init__rS   r2   r2   rC   r3   r>     s   r>   c                       s2   e Zd ZdZdZdeejed fddZ  Z	S )r?   a  
    Represents a chat member that was banned in the chat and
    can't return to the chat or view chat messages.

    .. versionadded:: 13.7

    Args:
        user (:class:`telegram.User`): Information about the user.
        until_date (:class:`datetime.datetime`, optional): Date when restrictions
           will be lifted for this user.

    Attributes:
        status (:obj:`str`): The member's status in the chat,
            always :attr:`telegram.ChatMember.KICKED`.
        user (:class:`telegram.User`): Information about the user.
        until_date (:class:`datetime.datetime`): Optional. Date when restrictions
           will be lifted for this user.

    r2   N)r   r&   r.   c                    s   t  jtj||d d S )N)r    r   r&   )rA   r4   r   r*   )r0   r   r&   r.   rC   r2   r3   r4     s
    zChatMemberBanned.__init__)N)
rE   rF   rG   rH   rI   r	   rL   r   r4   rO   r2   r2   rC   r3   r?     s    r?   )rH   rL   typingr   r   r   r   r   r   Ztelegramr   r	   r
   Ztelegram.utils.helpersr   r   Ztelegram.utils.typesr   r   r   r:   r;   r<   r=   r>   r?   r2   r2   r2   r3   <module>   s"      }( Z