U
    h^                     @   sD   d dl mZmZmZ ddlmZ ddlmZ eG dd deZdS )   )EventBuilderEventCommonname_inner_event   )utils)typesc                       sV   e Zd ZdZddddd fddZedddZ fd	d
ZG dd deZ	  Z
S )MessageReadae  
    Occurs whenever one or more messages are read in a chat.

    Args:
        inbox (`bool`, optional):
            If this argument is `True`, then when you read someone else's
            messages the event will be fired. By default (`False`) only
            when messages you sent are read by someone else will fire it.

    Example
        .. code-block:: python

            from telethon import events

            @client.on(events.MessageRead)
            async def handler(event):
                # Log when someone reads your messages
                print('Someone has read all your messages until', event.max_id)

            @client.on(events.MessageRead(inbox=True))
            async def handler(event):
                # Log when you read message in a chat (from your "inbox")
                print('You have read messages until', event.max_id)
    NF)blacklist_chatsfuncinboxc                   s   t  j|||d || _d S )N)r	   r
   )super__init__r   )selfZchatsr	   r
   r   	__class__ ?/tmp/pip-unpacked-wheel-c81u5j2r/telethon/events/messageread.pyr       s    zMessageRead.__init__c                 C   s   t |tjr| |j|jdS t |tjr<| |j|jdS t |tjr`| t|j	|jdS t |tj
r| t|j	|jdS t |tjr| j|jddS t |tjr| jt|j	|jddS d S )NFT)message_idscontents)
isinstancer   ZUpdateReadHistoryInboxEventpeermax_idZUpdateReadHistoryOutboxZUpdateReadChannelInboxZPeerChannelZ
channel_idZUpdateReadChannelOutboxZUpdateReadMessagesContentsmessagesZ!UpdateChannelReadMessagesContents)clsupdateZothersself_idr   r   r   build%   s.      zMessageRead.buildc                    s   | j |jkrd S t |S )N)r   outboxr   filter)r   eventr   r   r   r   9   s    zMessageRead.filterc                       sR   e Zd ZdZd fdd	Zedd Zedd	 Zd
d Zdd Z	dd Z
  ZS )zMessageRead.Eventa@  
        Represents the event of one or more messages being read.

        Members:
            max_id (`int`):
                Up to which message ID has been read. Every message
                with an ID equal or lower to it have been read.

            outbox (`bool`):
                `True` if someone else has read your messages.

            contents (`bool`):
                `True` if what was read were the contents of a message.
                This will be the case when e.g. you play a voice note.
                It may only be set on ``inbox`` events.
        NFc                    sF   || _ || _|pg | _d | _|p.t|p(g d d| _t || j d S )N)default)r   r   _message_ids	_messagesmaxr   r   r   )r   r   r   outr   r   r   r   r   r   P   s    
zMessageRead.Event.__init__c                 C   s   | j  S )zJ
            `True` if you have read someone else's messages.
            )r   r   r   r   r   r   Y   s    zMessageRead.Event.inboxc                 C   s   | j S )z
            The IDs of the messages **which contents'** were read.

            Use :meth:`is_read` if you need to check whether a message
            was read instead checking if it's in here.
            )r"   r&   r   r   r   r   `   s    zMessageRead.Event.message_idsc                    sD   | j dkr>|  I dH }|s$g | _ n| jj|| jdI dH | _ | j S )a  
            Returns the list of `Message <telethon.tl.custom.message.Message>`
            **which contents'** were read.

            Use :meth:`is_read` if you need to check whether a message
            was read instead checking if it's in here.
            N)ids)r#   Zget_input_chatZ_clientget_messagesr"   )r   Zchatr   r   r   r(   j   s    
 zMessageRead.Event.get_messagesc                    s:   t |r fdd|D S t|tr*|n|j jkS dS )z
            Returns `True` if the given message (or its ID) has been read.

            If a list-like argument is provided, this method will return a
            list of booleans indicating which messages have been read.
            c                    s&   g | ]}t |tr|n|j jkqS r   )r   intidr   ).0mr&   r   r   
<listcomp>   s   z-MessageRead.Event.is_read.<locals>.<listcomp>N)r   is_list_liker   r)   r*   r   r   messager   r&   r   is_read|   s    

 zMessageRead.Event.is_readc                 C   s&   t |rt| |S | |S dS )z*`True` if the message(s) are read message.N)r   r.   allr1   r/   r   r   r   __contains__   s    
zMessageRead.Event.__contains__)NNFFN)__name__
__module____qualname____doc__r   propertyr   r   r(   r1   r3   __classcell__r   r   r   r   r   ?   s     	

	r   )N)NN)r4   r5   r6   r7   r   classmethodr   r   r   r   r9   r   r   r   r   r      s      r   N)	commonr   r   r    r   tlr   r   r   r   r   r   <module>   s   