o
    4˜Žja-  ã                   @  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| 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| 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_messageÚsubscriptionÚstopped_message_generationr   )r(   r)   r*   r+   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+   r,   r-   r.   r/   r0   r1   Úerrorsr   r
   ÚstartupÚshutdownÚ	observers)Úselfr   © r;   úV/var/www/kodo/Anonymous/send/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__„   s   zRouter.__str__c                 C  s   d| › d�S )Nú<ú>r;   rB   r;   r;   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_tailr9   ÚitemsÚhandlersÚaddÚsorted)r:   rG   Úhandlers_in_user   Úupdate_nameÚobserverr;   r;   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)rR   rT   rU   r;   )Ú_propagate_event)rX   rY   ©rR   r:   rT   r;   r<   Ú_wrapped£   s   €ýüz(Router.propagate_event.<locals>._wrapped)rU   rY   )rX   r   rY   r   r   r   )r   r9   ÚgetÚwrap_outer_middleware)r:   rT   rU   rV   r\   r;   r[   r<   Úpropagate_eventŸ   s   €zRouter.propagate_eventrR   ú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)rT   rU   r;   )r	   Úcheck_root_filtersr   Útriggerr   r5   r_   )	r:   rR   rT   rU   rV   ÚresponseÚresultrY   r   r;   r;   r<   rZ   ¯   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 rf   )r5   rK   rh   r;   r;   r<   rK   Õ   s
   €
ÿzRouter.chain_tailúRouter | Nonec                 C  s   | j S rf   )r4   rB   r;   r;   r<   rg   Û   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@   rA   Ú
ValueErrorr4   ÚRuntimeErrorrg   r5   Úappend)r:   r   ÚmsgÚparentr;   r;   r<   rg   ß   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)rm   Úinclude_router)r:   rr   rp   r   r;   r;   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:
        rk   )rl   r   r@   rA   rm   rg   )r:   r   rp   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   rb   r5   Úemit_startup©r:   ru   rV   r   r;   r;   r<   rx     ó   €
ÿzRouter.emit_startupc                 Ï  rv   )zˆ
        Recursively call shutdown callbacks to graceful shutdown

        :param args:
        :param kwargs:
        :return:
        rw   N)r   r8   rb   r5   Úemit_shutdownry   r;   r;   r<   r{   &  rz   zRouter.emit_shutdown)r   r   r   r   )r   r>   rf   )rG   rH   r   rI   )rT   r>   rU   r   rV   r   r   r   )
rR   r`   rT   r>   rU   r   rV   r   r   r   )r   re   )r   rj   )r   r   r   r   )rr   r   r   r   )r   r   r   r   )ru   r   rV   r   r   r   )rA   Ú
__module__Ú__qualname__Ú__doc__r=   rC   rF   rS   r_   rZ   Úpropertyri   rK   rg   Úsetterrt   rs   rx   r{   r;   r;   r;   r<   r      s(    

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