U
    ¯ªh³  ã                   @   s¼   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 d dlmZ d dlmZ d d	lmZ d d
lmZ dZG dd„ deƒZddd„Zddd„Zdd„ Zdd„ Zdd„ ZdS )é   )ÚRaw)ÚAlbum)Ú
ChatAction)ÚMessageDeleted)ÚMessageEdited)ÚMessageRead)Ú
NewMessage)Ú
UserUpdate)ÚCallbackQuery)ÚInlineQueryz__tl.handlersc                   @   s   e Zd ZdZdS )ÚStopPropagationa  
    If this exception is raised in any of the handlers for a given event,
    it will stop the execution of all other registered event handlers.
    It can be seen as the ``StopIteration`` in a for loop but for events.

    Example usage:

        >>> from telethon import TelegramClient, events
        >>> client = TelegramClient(...)
        >>>
        >>> @client.on(events.NewMessage)
        ... async def delete(event):
        ...     await event.delete()
        ...     # No other event handler will have a chance to handle this event
        ...     raise StopPropagation
        ...
        >>> @client.on(events.NewMessage)
        ... async def _(event):
        ...     # Will never be reached, because it is the second handler
        ...     pass
    N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__© r   r   ú</tmp/pip-unpacked-wheel-c81u5j2r/telethon/events/__init__.pyr      s   r   Nc                    s,   t ˆ tƒrˆ ƒ ‰ n
ˆ stƒ ‰ ‡ fdd„}|S )a×  
    Decorator method to *register* event handlers. This is the client-less
    `add_event_handler()
    <telethon.client.updates.UpdateMethods.add_event_handler>` variant.

    Note that this method only registers callbacks as handlers,
    and does not attach them to any client. This is useful for
    external modules that don't have access to the client, but
    still want to define themselves as a handler. Example:

    >>> from telethon import events
    >>> @events.register(events.NewMessage)
    ... async def handler(event):
    ...     ...
    ...
    >>> # (somewhere else)
    ...
    >>> from telethon import TelegramClient
    >>> client = TelegramClient(...)
    >>> client.add_event_handler(handler)

    Remember that you can use this as a non-decorator
    through ``register(event)(callback)``.

    Args:
        event (`_EventBuilder` | `type`):
            The event builder class or instance to be used,
            for instance ``events.NewMessage``.
    c                    s&   t | tg ƒ}| ˆ ¡ t| t|ƒ | S )N)ÚgetattrÚ_HANDLERS_ATTRIBUTEÚappendÚsetattr)ÚcallbackÚhandlers©Úeventr   r   Ú	decoratorN   s    
zregister.<locals>.decorator)Ú
isinstanceÚtyper   )r   r   r   r   r   Úregister+   s    
r   c                 C   sr   d}|rt |tƒst|ƒ}t| tg ƒ}| || f¡ t|ƒ}|rn|d8 }|| }|r^t ||ƒr<||= |d7 }q<|S )a_  
    Inverse operation of `register` (though not a decorator). Client-less
    `remove_event_handler
    <telethon.client.updates.UpdateMethods.remove_event_handler>`
    variant. **Note that this won't remove handlers from the client**,
    because it simply can't, so you would generally use this before
    adding the handlers to the client.

    This method is here for symmetry. You will rarely need to
    unregister events, since you can simply just not add them
    to any client.

    If no event is given, all events for this callback are removed.
    Returns how many callbacks were removed.
    é    r   )r   r   r   r   r   Úlen)r   r   Úfoundr   ÚiZevr   r   r   Ú
unregisterW   s    
r#   c                 C   s
   t | tƒS )zh
    Returns `True` if the given callback is an
    event handler (i.e. you used `register` on it).
    )Úhasattrr   ©r   r   r   r   Ú
is_handlerx   s    r&   c                 C   s   t | tg ƒdd… S )zl
    Returns a list containing the registered event
    builders inside the specified callback handler.
    N©r   r   r%   r   r   r   Úlist€   s    r(   c                 C   s   t | tdƒS )zP
    Like ``list`` but returns `None` if the callback was never registered.
    Nr'   r%   r   r   r   Ú_get_handlersˆ   s    r)   )N)N)Úrawr   Zalbumr   Z
chatactionr   Zmessagedeletedr   Zmessageeditedr   Zmessagereadr   Z
newmessager   Z
userupdater	   Zcallbackqueryr
   Zinlinequeryr   r   Ú	Exceptionr   r   r#   r&   r(   r)   r   r   r   r   Ú<module>   s    
,
!