a
    9g                     @  s   d dl mZ d dlmZ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mZmZ dd
lmZmZmZ erd dlmZ G dd dZdS )    )annotations)TYPE_CHECKINGAnyCallableDictListOptional)MiddlewareManager   )UnsupportedKeywordArgument)Filter)TelegramObject   )	UNHANDLEDMiddlewareTypeSkipHandler)CallbackTypeFilterObjectHandlerObject)Routerc                   @  s   e Zd ZdZddddddZddd	d
dZddddZddddddddddZdddddddZddddddZ	dddddd Z
dddddd!d"d#d$ZdS )%TelegramEventObserverz
    Event observer for Telegram events

    Here you can register handler with filter.
    This observer will stop event propagation when first handler is pass.
    r   strNone)router
event_namereturnc                 C  s8   || _ || _g | _t | _t | _tdd g d| _d S )Nc                   S  s   dS )NT r   r   r   ~/var/www/vosh/data/www/fastworkle.ru/webshop-tgbot-v.1.0/venv/lib/python3.9/site-packages/aiogram/dispatcher/event/telegram.py<lambda>$       z0TelegramEventObserver.__init__.<locals>.<lambda>)callbackfilters)r   r   handlersr	   
middlewareouter_middlewarer   _handler)selfr   r   r   r   r   __init__   s    zTelegramEventObserver.__init__r   )r!   r   c                 G  s0   | j jdu rg | j _| j jdd |D  dS )zu
        Register filter for all handlers of this event observer

        :param filters: positional filters
        Nc                 S  s   g | ]}t |qS r   r   .0Zfilter_r   r   r   
<listcomp>.   r   z0TelegramEventObserver.filter.<locals>.<listcomp>)r%   r!   extend)r&   r!   r   r   r   filter&   s    zTelegramEventObserver.filterz$List[MiddlewareType[TelegramObject]])r   c                 C  s<   g }t t| jjD ]"}|j| j}|r||j q|S N)	reversedtupler   Z
chain_headZ	observersgetr   r,   r#   )r&   Zmiddlewaresr   Zobserverr   r   r   _resolve_middlewares0   s    z*TelegramEventObserver._resolve_middlewaresNflagszOptional[Dict[str, Any]]r   )r    r!   r4   kwargsr   c                O  sl   |rt dt|  d|du r(i }|D ]}t|tr,|j|d q,| jt|dd |D |d |S )z(
        Register event handler
        a	  Passing any additional keyword arguments to the registrar method is not supported.
This error may be caused when you are trying to register filters like in 2.x version of this framework, if it's true just look at correspoding documentation pages.
Please remove the z arguments from this call.
Nr3   c                 S  s   g | ]}t |qS r   r(   r)   r   r   r   r+   W   r   z2TelegramEventObserver.register.<locals>.<listcomp>)r    r!   r4   )	r   setkeys
isinstancer   Zupdate_handler_flagsr"   appendr   )r&   r    r4   r!   r5   itemr   r   r   register9   s&    

	
zTelegramEventObserver.registerr   zDict[str, Any])r    eventdatar   c                 C  s   | j | j|}|||S r.   )r#   wrap_middlewaresr$   )r&   r    r<   r=   Zwrapped_outerr   r   r   wrap_outer_middleware^   s
    z+TelegramEventObserver.wrap_outer_middleware)r<   r5   r   c                 K  s   | j j|fi |S r.   )r%   check)r&   r<   r5   r   r   r   check_root_filtersg   s    z(TelegramEventObserver.check_root_filtersc              	     s   | j D ]x}||d< |j|fi |I dH \}}|r|| z*| j|  |j}|||I dH W   S  ty|   Y qY q0 qtS )z
        Propagate event to handlers and stops propagation on first match.
        Handler will be called when all its filters are pass.
        handlerN)	r"   r@   updater$   r>   r2   callr   r   )r&   r<   r5   rB   resultr=   Zwrapped_innerr   r   r   triggerj   s    

zTelegramEventObserver.triggerz&Callable[[CallbackType], CallbackType])r!   r4   r5   r   c                  s   ddd fdd}|S )z:
        Decorator for registering event handlers
        r   )r    r   c                   s    j | g R di | S )Nr4   )r;   )r    r!   r4   r5   r&   r   r   wrapper   s    z/TelegramEventObserver.__call__.<locals>.wrapperr   )r&   r4   r!   r5   rH   r   rG   r   __call__   s    
zTelegramEventObserver.__call__)__name__
__module____qualname____doc__r'   r-   r2   r;   r?   rA   rF   rI   r   r   r   r   r      s   
%	r   N)
__future__r   typingr   r   r   r   r   r   Z&aiogram.dispatcher.middlewares.managerr	   
exceptionsr   Zfilters.baser   typesr   basesr   r   r   rB   r   r   r   Zaiogram.dispatcher.routerr   r   r   r   r   r   <module>   s    