o
    Uj+                     @  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  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| 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| 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_mediamanaged_botguest_messager   )	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-   r.   r/   errorsr   r
   startupshutdown	observers)selfr    r9   R/opt/telega-widget/.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   r8   r9   r9   r:   __str__}   s   zRouter.__str__c                 C  s   d|  dS )N<>r9   r@   r9   r9   r:   __repr__   s   zRouter.__repr__skip_eventsset[str] | None	list[str]c                 C  s`   t  }|du r
t  }h |t}| jD ]}|j D ]\}}|jr*||vr*|| qq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: sorted list of registered names
        N)setr   
chain_tailr7   itemshandlersaddsorted)r8   rE   handlers_in_user   update_nameobserverr9   r9   r:   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)rP   rR   rS   r9   )_propagate_event)rV   rW   rP   r8   rR   r9   r:   _wrapped   s   z(Router.propagate_event.<locals>._wrapped)rS   rW   )rV   r   rW   r   r   r   )r   r7   getwrap_outer_middleware)r8   rR   rS   rT   rZ   r9   rY   r:   propagate_event   s   zRouter.propagate_eventrP   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)rR   rS   r9   )r	   check_root_filtersr   triggerr   r3   r]   )	r8   rP   rR   rS   rT   responseresultrW   r   r9   r9   r:   rX      s&   

zRouter._propagate_eventGenerator[Router, None, None]c                 c  s"    | }|r|V  |j }|sd S 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 rd   )r3   rI   rf   r9   r9   r:   rI      s
   
zRouter.chain_tailRouter | Nonec                 C  s   | j S rd   )r2   r@   r9   r9   r:   re      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?   
ValueErrorr2   RuntimeErrorre   r3   append)r8   r   msgparentr9   r9   r:   re      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)rk   include_router)r8   rp   rn   r   r9   r9   r:   include_routers   s   zRouter.include_routersc                 C  s,   t |tsdt|j}t|| |_|S )zQ
        Attach another router.

        :param router:
        :return:
        ri   )rj   r   r>   r?   rk   re   )r8   r   rn   r9   r9   r:   rq     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   r5   r`   r3   emit_startupr8   rs   rT   r   r9   r9   r:   rv        
zRouter.emit_startupc                   rt   )z
        Recursively call shutdown callbacks to graceful shutdown

        :param args:
        :param kwargs:
        :return:
        ru   N)r   r6   r`   r3   emit_shutdownrw   r9   r9   r:   ry     rx   zRouter.emit_shutdown)r   r   r   r   )r   r<   rd   )rE   rF   r   rG   )rR   r<   rS   r   rT   r   r   r   )
rP   r^   rR   r<   rS   r   rT   r   r   r   )r   rc   )r   rh   )r   r   r   r   )rp   r   r   r   )r   r   r   r   )rs   r   rT   r   r   r   )r?   
__module____qualname____doc__r;   rA   rD   rQ   r]   rX   propertyrg   rI   re   setterrr   rq   rv   ry   r9   r9   r9   r:   r      s(    

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