o
    *fj},                     @  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  sn  |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" | _#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 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subscriptionr   )
r(   r)   r*   r+   r,   r-   r.   r/   r0   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   errorsr   r
   startupshutdown	observers)selfr    r:   }/var/www/botplatforma_usr/data/www/botplatforma.ilyaolesya.ru/.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   r9   r:   r:   r;   __str__   s   zRouter.__str__c                 C  s   d|  dS )N<>r:   rA   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_tailr8   itemshandlersaddsorted)r9   rF   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)rQ   rS   rT   r:   )_propagate_event)rW   rX   rQ   r9   rS   r:   r;   _wrapped   s   z(Router.propagate_event.<locals>._wrapped)rT   rX   )rW   r   rX   r   r   r   )r   r8   getwrap_outer_middleware)r9   rS   rT   rU   r[   r:   rZ   r;   propagate_event   s   zRouter.propagate_eventrQ   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)rS   rT   r:   )r	   check_root_filtersr   triggerr   r4   r^   )	r9   rQ   rS   rT   rU   responseresultrX   r   r:   r:   r;   rY      s&   

zRouter._propagate_eventGenerator[Router, None, None]c                 c  s"    | }|r|V  |j }|sd S d S N)parent_routerr9   r   r:   r:   r;   
chain_head   s   zRouter.chain_headc                 c  s$    | V  | j D ]}|jE d H  qd S re   )r4   rJ   rg   r:   r:   r;   rJ      s
   
zRouter.chain_tailRouter | Nonec                 C  s   | j S re   )r3   rA   r:   r:   r;   rf      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@   
ValueErrorr3   RuntimeErrorrf   r4   append)r9   r   msgparentr:   r:   r;   rf      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)rl   include_router)r9   rq   ro   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:
        rj   )rk   r   r?   r@   rl   rf   )r9   r   ro   r:   r:   r;   rr     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   r6   ra   r4   emit_startupr9   rt   rU   r   r:   r:   r;   rw        
zRouter.emit_startupc                   ru   )z
        Recursively call shutdown callbacks to graceful shutdown

        :param args:
        :param kwargs:
        :return:
        rv   N)r   r7   ra   r4   emit_shutdownrx   r:   r:   r;   rz   !  ry   zRouter.emit_shutdown)r   r   r   r   )r   r=   re   )rF   rG   r   rH   )rS   r=   rT   r   rU   r   r   r   )
rQ   r_   rS   r=   rT   r   rU   r   r   r   )r   rd   )r   ri   )r   r   r   r   )rq   r   r   r   )r   r   r   r   )rt   r   rU   r   r   r   )r@   
__module____qualname____doc__r<   rB   rE   rR   r^   rY   propertyrh   rJ   rf   setterrs   rr   rw   rz   r:   r:   r:   r;   r      s(    

d





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    