3
uQh^                 @   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-build-2nz6shyl/telethon/telethon/events/messageread.pyr       s    zMessageRead.__init__c             C   s   t |tjr| j|j|jdS t |tjr<| j|j|jdS t |tjr`| jtj|j	|jdS t |tj
r| jtj|j	|jdS t |tjr| j|jddS t |tjr| jtj|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othersZself_idr   r   r   build%   s"    

zMessageRead.buildc                s   | j |jkrd S t j|S )N)r   outboxr   filter)r   event)r   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|| 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>| j 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 j|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m)r   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 j|rt| j|S | j|S dS )z*`True` if the message(s) are read message.N)r   r+   allr-   )r   r,   r   r   r   __contains__   s    
zMessageRead.Event.__contains__)NNFFN)__name__
__module____qualname____doc__r   propertyr   r   r%   r-   r/   __classcell__r   r   )r   r   r   ?   s    
r   )N)NN)r0   r1   r2   r3   r   classmethodr   r   r   r   r5   r   r   )r   r   r      s   r   N)	commonr   r   r    r   tlr   r   r   r   r   r   <module>   s   