U
    g!                     @   s   d Z ddlZddlmZmZmZmZmZ ddlm	Z	 ddl
mZ ddlmZ ddlmZ ddlmZ dd	lmZmZ dd
lmZ erddlmZ G dd deZdS )zLThis module contains an object that represents a Telegram ChatMemberUpdated.    N)TYPE_CHECKINGDictOptionalTupleUnion)Chat)ChatInviteLink)
ChatMember)TelegramObject)User)extract_tzinfo_from_defaultsfrom_timestamp)JSONDict)Botc                       s   e Zd ZdZdZdddeeejeee	e
 e	e e	e e	e d	 fddZede	e e	d e	d  d	 fd
dZeeeef dddZeeeeeeejef eeeejef f f dddZ  ZS )ChatMemberUpdateda^  This object represents changes in the status of a chat member.

    Objects of this class are comparable in terms of equality. Two objects of this class are
    considered equal, if their :attr:`chat`, :attr:`from_user`, :attr:`date`,
    :attr:`old_chat_member` and :attr:`new_chat_member` are equal.

    .. versionadded:: 13.4

    Note:
        In Python :keyword:`from` is a reserved word. Use :paramref:`from_user` instead.

    Examples:
        :any:`Chat Member Bot <examples.chatmemberbot>`

    Args:
        chat (:class:`telegram.Chat`): Chat the user belongs to.
        from_user (:class:`telegram.User`): Performer of the action, which resulted in the change.
        date (:class:`datetime.datetime`): Date the change was done in Unix time. Converted to
            :class:`datetime.datetime`.

            .. versionchanged:: 20.3
                |datetime_localization|
        old_chat_member (:class:`telegram.ChatMember`): Previous information about the chat member.
        new_chat_member (:class:`telegram.ChatMember`): New information about the chat member.
        invite_link (:class:`telegram.ChatInviteLink`, optional): Chat invite link, which was used
            by the user to join the chat. For joining by invite link events only.
        via_chat_folder_invite_link (:obj:`bool`, optional): :obj:`True`, if the user joined the
            chat via a chat folder invite link

            .. versionadded:: 20.3
        via_join_request (:obj:`bool`, optional): :obj:`True`, if the user joined the chat after
            sending a direct join request without using an invite link and being approved by
            an administrator

            .. versionadded:: 21.2

    Attributes:
        chat (:class:`telegram.Chat`): Chat the user belongs to.
        from_user (:class:`telegram.User`): Performer of the action, which resulted in the change.
        date (:class:`datetime.datetime`): Date the change was done in Unix time. Converted to
            :class:`datetime.datetime`.

            .. versionchanged:: 20.3
                |datetime_localization|
        old_chat_member (:class:`telegram.ChatMember`): Previous information about the chat member.
        new_chat_member (:class:`telegram.ChatMember`): New information about the chat member.
        invite_link (:class:`telegram.ChatInviteLink`): Optional. Chat invite link, which was used
            by the user to join the chat. For joining by invite link events only.
        via_chat_folder_invite_link (:obj:`bool`): Optional. :obj:`True`, if the user joined the
            chat via a chat folder invite link

            .. versionadded:: 20.3
        via_join_request (:obj:`bool`): Optional. :obj:`True`, if the user joined the chat after
            sending a direct join request without using an invite link and being approved
            by an administrator

            .. versionadded:: 21.2

    )chatdate	from_userinvite_linknew_chat_memberold_chat_membervia_chat_folder_invite_linkvia_join_requestN
api_kwargs)	r   r   r   r   r   r   r   r   r   c	          
         sd   t  j|	d || _|| _|| _|| _|| _|| _|| _|| _	| j| j| j| j| jf| _
|   d S )Nr   )super__init__r   r   r   r   r   r   r   r   Z	_id_attrsZ_freeze)
selfr   r   r   r   r   r   r   r   r   	__class__ ?/tmp/pip-unpacked-wheel-swnnwir2/telegram/_chatmemberupdated.pyr   k   s     zChatMemberUpdated.__init__r   )databotreturnc                    s   |  |}|sdS t|}t|d||d< t|dd||d< t|d|d|d< t|d||d< t|d||d< t	|d	||d	< t
 j||d
S )z,See :meth:`telegram.TelegramObject.de_json`.Nr   fromr   r   )tzinfor   r   r   )r"   r#   )Z_parse_datar   r   de_jsongetr   popr   r	   r   r   )clsr"   r#   Z
loc_tzinfor   r    r!   r'      s    
zChatMemberUpdated.de_json)	attributer$   c                 C   sX   z| j | }W n tk
r&   d }Y nX z| j| }W n tk
rN   d }Y nX ||fS )N)r   KeyErrorr   )r   r+   oldnewr    r    r!   _get_attribute_difference   s    

z+ChatMemberUpdated._get_attribute_difference)r$   c                    s|    j  }|d} j }|d}dd t| t| A D } fdd|D }||krx j j jjf|d< |S )a|  Computes the difference between :attr:`old_chat_member` and :attr:`new_chat_member`.

        Example:
            .. code:: pycon

                >>> chat_member_updated.difference()
                {'custom_title': ('old title', 'new title')}

        Note:
            To determine, if the :attr:`telegram.ChatMember.user` attribute has changed, *every*
            attribute of the user will be checked.

        .. versionadded:: 13.5

        Returns:
            Dict[:obj:`str`, Tuple[:class:`object`, :class:`object`]]: A dictionary mapping
            attribute names to tuples of the form ``(old_value, new_value)``
        userc                 s   s   | ]}|d  V  qdS )r   Nr    ).0entryr    r    r!   	<genexpr>   s     z/ChatMemberUpdated.difference.<locals>.<genexpr>c                    s   i | ]}|  |qS r    )r/   )r1   r+   r   r    r!   
<dictcomp>   s      z0ChatMemberUpdated.difference.<locals>.<dictcomp>)r   Zto_dictr)   r   setitemsr0   )r   Zold_dictZold_user_dictZnew_dictZnew_user_dict
attributesresultr    r4   r!   
difference   s    



"zChatMemberUpdated.difference)NNN)N)__name__
__module____qualname____doc__	__slots__r   r   datetimer	   r   r   boolr   r   classmethodr'   strr   objectr/   r   r   r:   __classcell__r    r    r   r!   r   #   sD   <   $  "r   )r>   r@   typingr   r   r   r   r   Ztelegram._chatr   Ztelegram._chatinvitelinkr   Ztelegram._chatmemberr	   Ztelegram._telegramobjectr
   Ztelegram._userr   Ztelegram._utils.datetimer   r   Ztelegram._utils.typesr   Ztelegramr   r   r    r    r    r!   <module>   s   