a
    9g)                     @  s   U d dl mZ d dlmZmZmZmZmZmZm	Z	 ddl
mZ ddlmZmZ ddlmZ ddlmZ ed	d
hZded< G dd dZdS )    )annotations)AnyDictFinal	GeneratorListOptionalSet   )TelegramObject   )REJECTED	UNHANDLED)EventObserver)TelegramEventObserverupdateerrorzFinal[frozenset[str]]INTERNAL_UPDATE_TYPESc                   @  s  e Zd ZdZdddddddZd	d
ddZd	d
ddZd1dddddZd	ddddddZdd	ddddddZ	e
dd
ddZe
dd
d d!Ze
d"d
d#d$Zejd dd%d&d$Zd dd'd(d)Zd d d%d*d+Zdddd,d-d.Zdddd,d/d0ZdS )2RouteraZ  
    Router can route update, and it nested update types like messages, callback query,
    polls and all other event types.

    Event handlers can be registered in observer by two ways:

    - By observer method - :obj:`router.<event_type>.register(handler, <filters, ...>)`
    - By decorator - :obj:`@router.<event_type>(<filters, ...>)`
    N)namezOptional[str]None)r   returnc                C  s  |pt t| | _d| _g | _t| dd| _t| dd| _t| dd| _t| dd| _	t| dd| _
t| dd| _t| d	d| _t| d
d| _t| dd| _t| dd| _t| dd| _t| dd| _t| dd| _t| dd| _t| dd| _t| dd| _t| dd| _t| dd| _t| dd| _t| dd| _t| dd| _t| dd| _t| dd| _t| dd | _| _t | _ t | _!| j| j| j| j	| j
| j| j| j| j| j| j| j| j| j| j| j| j| j| j| j| j| j| j| jd| _"dS )zP
        :param name: Optional router name, can be useful for debugging
        Nmessage)routerZ
event_nameedited_messagechannel_postedited_channel_postinline_querychosen_inline_resultcallback_queryshipping_querypre_checkout_querypollpoll_answermy_chat_memberchat_memberchat_join_requestmessage_reactionmessage_reaction_count
chat_boostremoved_chat_boostdeleted_business_messagesbusiness_connectionedited_business_messagebusiness_messagepurchased_paid_mediar   )r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r   )#hexidr   _parent_routersub_routersr   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   errorsr   r   startupshutdown	observers)selfr    r9   v/var/www/vosh/data/www/fastworkle.ru/webshop-tgbot-v.1.0/venv/lib/python3.9/site-packages/aiogram/dispatcher/router.py__init__   s    zRouter.__init__str)r   c                 C  s   t | j d| jS )N )type__name__r   r8   r9   r9   r:   __str__m   s    zRouter.__str__c                 C  s   d|  dS )N<>r9   r@   r9   r9   r:   __repr__p   s    zRouter.__repr__zOptional[Set[str]]z	List[str])skip_eventsr   c                 C  sd   t  }|du rt  }h |t}| jD ]0}|j D ] \}}|jr4||vr4|| q4q&tt|S )z
        Resolve registered event names

        Is useful for getting updates only for registered event types.

        :param skip_events: skip specified event names
        :return: set of registered names
        N)	setr   
chain_tailr7   itemshandlersaddlistsorted)r8   rE   Zhandlers_in_user   Zupdate_nameobserverr9   r9   r:   resolve_used_update_typess   s    	
z Router.resolve_used_update_typesr   r   )update_typeeventkwargsr   c                   sb   |j d j dddd fdd} rL j|||dI d H S ||fi |I d H S )N)Zevent_routerr   r   )telegram_eventdatar   c                   s   j f  | d|I d H S )N)rM   rO   rP   )_propagate_event)rR   rS   rM   r8   rO   r9   r:   _wrapped   s
    z(Router.propagate_event.<locals>._wrapped)rP   rS   )r   r7   getZwrap_outer_middleware)r8   rO   rP   rQ   rV   r9   rU   r:   propagate_event   s    zRouter.propagate_eventzOptional[TelegramEventObserver])rM   rO   rP   rQ   r   c           	        s   t }|rf|j|fi |I d H \}}|s,t S || |j|fi |I d H }|tu rZt S |t urf|S | jD ],}|jf ||d|I d H }|t url qql|S )N)rO   rP   )r   Zcheck_root_filtersr   triggerr   r3   rX   )	r8   rM   rO   rP   rQ   responseresultrS   r   r9   r9   r:   rT      s     

zRouter._propagate_eventzGenerator[Router, None, None]c                 c  s   | }|r|V  |j }qd S N)parent_routerr8   r   r9   r9   r:   
chain_head   s    zRouter.chain_headc                 c  s"   | V  | j D ]}|jE d H  qd S r\   )r3   rG   r^   r9   r9   r:   rG      s    
zRouter.chain_tailzOptional[Router]c                 C  s   | j S r\   )r2   r@   r9   r9   r:   r]      s    zRouter.parent_router)r   r   c                 C  s~   t |tstdt|j| jr4td| j| |krDtd|}|durh|| kr`td|j}qH|| _|j	|  dS )a  
        Internal property setter of parent router fot this router.
        Do not use this method in own code.
        All routers should be included via `include_router` method.

        Self- and circular- referencing are not allowed here

        :param router:
        (router should be instance of Router not zRouter is already attached to z'Self-referencing routers is not allowedNz-Circular referencing of Router is not allowed)

isinstancer   
ValueErrorr>   r?   r2   RuntimeErrorr]   r3   append)r8   r   parentr9   r9   r:   r]      s    
)routersr   c                 G  s$   |st d|D ]}| | qdS )zT
        Attach multiple routers.

        :param routers:
        :return:
        z$At least one router must be providedN)rb   include_router)r8   rf   r   r9   r9   r:   include_routers   s    zRouter.include_routersc                 C  s*   t |ts tdt|jj | |_|S )zQ
        Attach another router.

        :param router:
        :return:
        r`   )ra   r   rb   r>   	__class__r?   r]   r^   r9   r9   r:   rg      s    
zRouter.include_router)argsrQ   r   c                   sJ   |j | d | jj|i |I dH  | jD ]}|j|i |I dH  q*dS )zr
        Recursively call startup callbacks

        :param args:
        :param kwargs:
        :return:
        r   N)r   r5   rY   r3   emit_startupr8   rj   rQ   r   r9   r9   r:   rl      s    
zRouter.emit_startupc                   sJ   |j | d | jj|i |I dH  | jD ]}|j|i |I dH  q*dS )z
        Recursively call shutdown callbacks to graceful shutdown

        :param args:
        :param kwargs:
        :return:
        rk   N)r   r6   rY   r3   emit_shutdownrm   r9   r9   r:   rn     s    
zRouter.emit_shutdown)N)r?   
__module____qualname____doc__r;   rA   rD   rN   rX   rT   propertyr_   rG   r]   setterrh   rg   rl   rn   r9   r9   r9   r:   r      s&   
Ur   N)
__future__r   typingr   r   r   r   r   r   r	   typesr   Zevent.basesr   r   Zevent.eventr   Zevent.telegramr   	frozensetr   __annotations__r   r9   r9   r9   r:   <module>   s   $