o
    Fh)                     @  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d3dd	Zd4ddZd4ddZd5d6ddZd7ddZd8ddZ	e
d9d d!Ze
d9d"d#Ze
d:d%d&Zejd;d(d&Zd<d*d+Zd=d,d-Zd>d/d0Zd>d1d2ZdS )?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)namer   Optional[str]returnNonec             	   C  s8  |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 | _!i d| jd| jd| jd| j	d| j
d| jd	| jd
| jd| jd| jd| jd| jd| jd| jd| jd| jd| j| j| j| j| j| j| j| jd| _"dS )zP
        :param name: Optional router name, can be useful for debugging
        Nmessage)router
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/   r0   r1   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/   r0   r1   errorsr   r   startupshutdown	observers)selfr    r;   L/var/www/html/venv/lib/python3.10/site-packages/aiogram/dispatcher/router.py__init__   s   	
zRouter.__init__strc                 C  s   t | j d| jS )N )type__name__r   r:   r;   r;   r<   __str__m   s   zRouter.__str__c                 C  s   d|  dS )N<>r;   rB   r;   r;   r<   __repr__p   s   zRouter.__repr__skip_eventsOptional[Set[str]]	List[str]c                 C  sd   t  }|du r
t  }h |t}| jD ]}|j D ]\}}|jr*||vr*|| qq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_tailr9   itemshandlersaddlistsorted)r:   rG   handlers_in_user   update_nameobserverr;   r;   r<   resolve_used_update_typess   s   	

z Router.resolve_used_update_typesupdate_typeeventr   kwargsr   c                   s\   |j d j d
 fdd} r# j|||d	I d H S ||fi |I d H S )N)event_routertelegram_eventr   datar   r   c                   s    j d | d|I d H S )N)rS   rU   rV   r;   )_propagate_event)rY   rZ   rS   r:   rU   r;   r<   _wrapped   s   z(Router.propagate_event.<locals>._wrapped)rV   rZ   )rY   r   rZ   r   r   r   )r   r9   getwrap_outer_middleware)r:   rU   rV   rW   r]   r;   r\   r<   propagate_event   s   zRouter.propagate_eventrS   Optional[TelegramEventObserver]c           	        s   t }|r4|j|fi |I d H \}}|st S || |j|fi |I d H }|tu r.t S |t ur4|S | jD ]}|jd||d|I d H }|t urN |S q7|S )N)rU   rV   r;   )r   check_root_filtersr   triggerr   r5   r`   )	r:   rS   rU   rV   rW   responseresultrZ   r   r;   r;   r<   r[      s&   

zRouter._propagate_eventGenerator[Router, None, None]c                 c  s"    | }|r|V  |j }|sd S d S N)parent_routerr:   r   r;   r;   r<   
chain_head   s   zRouter.chain_headc                 c  s$    | V  | j D ]}|jE d H  qd S rg   )r5   rK   ri   r;   r;   r<   rK      s
   
zRouter.chain_tailOptional[Router]c                 C  s   | j S rg   )r4   rB   r;   r;   r<   rh      s   zRouter.parent_routerr   c                 C  s   t |tstdt|j| jrtd| j| |kr"td|}|dur7|| kr0td|j}|dus(|| _|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@   rA   r4   RuntimeErrorrh   r5   append)r:   r   parentr;   r;   r<   rh      s   
routersc                 G  s$   |st d|D ]}| | qdS )zT
        Attach multiple routers.

        :param routers:
        :return:
        z$At least one router must be providedN)rn   include_router)r:   rr   r   r;   r;   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:
        rl   )rm   r   rn   r@   	__class__rA   rh   ri   r;   r;   r<   rs      s   
zRouter.include_routerargsc                   L   |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   r7   rc   r5   emit_startupr:   rv   rW   r   r;   r;   r<   ry         
zRouter.emit_startupc                   rw   )z
        Recursively call shutdown callbacks to graceful shutdown

        :param args:
        :param kwargs:
        :return:
        rx   N)r   r8   rc   r5   emit_shutdownrz   r;   r;   r<   r|     r{   zRouter.emit_shutdown)r   r   r   r   )r   r>   rg   )rG   rH   r   rI   )rU   r>   rV   r   rW   r   r   r   )
rS   ra   rU   r>   rV   r   rW   r   r   r   )r   rf   )r   rk   )r   r   r   r   )rr   r   r   r   )r   r   r   r   )rv   r   rW   r   r   r   )rA   
__module____qualname____doc__r=   rC   rF   rT   r`   r[   propertyrj   rK   rh   setterrt   rs   ry   r|   r;   r;   r;   r<   r      s(    

U





r   N)
__future__r   typingr   r   r   r   r   r   r	   typesr   event.basesr   r   event.eventr   event.telegramr   	frozensetr   __annotations__r   r;   r;   r;   r<   <module>   s    $