o
    LDi*                     @  s   U 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
 ddlmZ ddlmZ er3d dlmZ ed	d
hZded< G dd dZdS )    )annotations)	Generator)TYPE_CHECKINGAnyFinal   )REJECTED	UNHANDLED)EventObserver)TelegramEventObserver)TelegramObject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   
str | None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+   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    r7   e/var/www/www-root/data/www/77.83.87.30/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   r6   r7   r7   r8   __str__y   s   zRouter.__str__c                 C  s   d|  dS )N<>r7   r>   r7   r7   r8   __repr__|   s   zRouter.__repr__skip_eventsset[str] | None	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_tailr5   itemshandlersaddlistsorted)r6   rC   handlers_in_user   update_nameobserverr7   r7   r8   resolve_used_update_types   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)rO   rQ   rR   r7   )_propagate_event)rU   rV   rO   r6   rQ   r7   r8   _wrapped   s   z(Router.propagate_event.<locals>._wrapped)rR   rV   )rU   r   rV   r   r   r   )r   r5   getwrap_outer_middleware)r6   rQ   rR   rS   rY   r7   rX   r8   propagate_event   s   zRouter.propagate_eventrO   TelegramEventObserver | Nonec           	        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)rQ   rR   r7   )r	   check_root_filtersr   triggerr   r1   r\   )	r6   rO   rQ   rR   rS   responseresultrV   r   r7   r7   r8   rW      s&   

zRouter._propagate_eventGenerator[Router, None, None]c                 c  s"    | }|r|V  |j }|sd S d S N)parent_routerr6   r   r7   r7   r8   
chain_head   s   zRouter.chain_headc                 c  s$    | V  | j D ]}|jE d H  qd S rc   )r1   rG   re   r7   r7   r8   rG      s
   
zRouter.chain_tailRouter | Nonec                 C  s   | j S rc   )r0   r>   r7   r7   r8   rd      s   zRouter.parent_routerr   c                 C  s   t |tsdt|j}t|| jrd| j}t|| |kr(d}t||}|dur?|| kr8d}t||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   r<   r=   
ValueErrorr0   RuntimeErrorrd   r1   append)r6   r   msgparentr7   r7   r8   rd      s$   
routersc                 G  s(   |sd}t ||D ]}| | q
dS )zT
        Attach multiple routers.

        :param routers:
        :return:
        z$At least one router must be providedN)rj   include_router)r6   ro   rm   r   r7   r7   r8   include_routers   s   zRouter.include_routersc                 C  s.   t |tsdt|jj }t|| |_|S )zQ
        Attach another router.

        :param router:
        :return:
        rh   )ri   r   r<   	__class__r=   rj   rd   )r6   r   rm   r7   r7   r8   rp     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   r3   r_   r1   emit_startupr6   rs   rS   r   r7   r7   r8   rv        
zRouter.emit_startupc                   rt   )z
        Recursively call shutdown callbacks to graceful shutdown

        :param args:
        :param kwargs:
        :return:
        ru   N)r   r4   r_   r1   emit_shutdownrw   r7   r7   r8   ry     rx   zRouter.emit_shutdown)r   r   r   r   )r   r:   rc   )rC   rD   r   rE   )rQ   r:   rR   r   rS   r   r   r   )
rO   r]   rQ   r:   rR   r   rS   r   r   r   )r   rb   )r   rg   )r   r   r   r   )ro   r   r   r   )r   r   r   r   )rs   r   rS   r   r   r   )r=   
__module____qualname____doc__r9   r?   rB   rP   r\   rW   propertyrf   rG   rd   setterrq   rp   rv   ry   r7   r7   r7   r8   r      s(    

^





r   N)
__future__r   collections.abcr   typingr   r   r   event.basesr   r	   event.eventr
   event.telegramr   aiogram.typesr   	frozensetr   __annotations__r   r7   r7   r7   r8   <module>   s    