
    F˝i*                        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rd dlmZ  ed	d
h      Zded<    G d d      Zy)    )annotations)	Generator)TYPE_CHECKINGAnyFinal   )REJECTED	UNHANDLED)EventObserver)TelegramEventObserver)TelegramObjectupdateerrorzFinal[frozenset[str]]INTERNAL_UPDATE_TYPESc                      e Zd ZdZddddZddZddZdddZddZ	 	 	 	 	 	 	 	 	 	 dd	Z	e
dd
       Ze
dd       Ze
dd       Zej                  dd       ZddZddZddZddZy)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)namec          	     l   |xs t        t        |             | _        d| _        g | _        t        | d      | _        t        | d      | _        t        | d      | _        t        | d      | _	        t        | d      | _
        t        | d      | _        t        | d	      | _        t        | d
      | _        t        | d      | _        t        | d      | _        t        | d      | _        t        | d      | _        t        | d      | _        t        | d      | _        t        | d      | _        t        | d      | _        t        | d      | _        t        | d      | _        t        | d      | _        t        | d      | _        t        | d      | _        t        | d      | _        t        | d      | _        t        | d      x| _        | _        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.                  | j0                  | j2                  | j4                  | j6                  | j8                  | j:                  d| _"        y)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   s     R/home/leshdev/mybot/venv/lib/python3.12/site-packages/aiogram/dispatcher/router.py__init__zRouter.__init__   sZ   
 )C4M	-1)+ -DYO34L\]1.Y#8,$
  2.Y$9-%
! 44L\]34L\]"7+#
 *&I	0W34L\]0W!6dOb!c 5TN` a&;/'
# 0tU"7+#
 *?2*
& $9,$
  (=0(
$ !6TN` a$9-%
!
 $9QX#YYdj$%<
t||<
d11<
 D--<
 "4#;#;	<

 D--<
 #D$=$=<
 d11<
 d11<
 !$"9"9<
 DII<
 4++<
 d11<
 4++<
  !7!7<
  5 5<
  %d&A&A!<
" $//#<
$ #'"9"9)-)G)G#'#;#;'+'C'C $ 5 5$($=$=[[1<
    c                J    t        |       j                   d| j                  S )N )type__name__r   r6   s    r7   __str__zRouter.__str__y   s"    t*%%&a		}55r9   c                    d|  dS )N<> r>   s    r7   __repr__zRouter.__repr__|   s    4&{r9   c                   t               }|
t               }h |t        }| j                  D ]G  }|j                  j	                         D ](  \  }}|j
                  s||vs|j                  |       * I 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
        )	setr   
chain_tailr5   itemshandlersaddlistsorted)r6   skip_eventshandlers_in_user   update_nameobservers         r7   resolve_used_update_typesz Router.resolve_used_update_types   s     %(E%K<<&;<oo 	5F)/)9)9)?)?)A 5%X$$K)G#''45	5
 F?+,,r9   c                    K   |j                           j                  j                        d fd}rj                  |||       d {   S  ||fi | d {   S 7 7 w)N)event_routerc                L   K    j                   d| d| d {   S 7 w)N)rP   update_typeeventrC   )_propagate_event)telegram_eventdatarP   r6   rU   s     r7   _wrappedz(Router.propagate_event.<locals>._wrapped   s>     ... !'$ 	   s   $"$)rV   rY   )rX   r   rY   r   returnr   )r   r5   getwrap_outer_middleware)r6   rU   rV   kwargsrZ   rP   s   ``   @r7   propagate_eventzRouter.propagate_event   sl     4(>>%%k2	 !77TZ7[[[e.v... \.s$   AA.A*A.%A,&A.,A.c                p  K   t         }|rj |j                  |fi | d {   \  }}|st         S |j                  |        |j                  |fi | d {   }|t        u rt         S |t         ur|S | j
                  D ]*  } |j                  d||d| d {   }|t         us) |S  |S 7 7 Y7 w)N)rU   rV   rC   )r
   check_root_filtersr   triggerr	   r1   r_   )	r6   rP   rU   rV   r^   responseresultrY   r   s	            r7   rW   zRouter._propagate_event   s       "=!<!<U!Mf!MMLFD  MM$-X--e>v>>H8#  y(&& 	F3V33cSXc\bccHy(	
 # N
 ? ds:   B6B06B6B2AB6B4B6*B62B64B6c              #  <   K   | }|r| |j                   }|ry y wN)parent_routerr6   r   s     r7   
chain_headzRouter.chain_head   s#      $L))F s   c              #  b   K   |  | j                   D ]  }|j                  E d {     y 7 wrf   )r1   rG   rh   s     r7   rG   zRouter.chain_tail   s2     
&& 	)F((((	)(s   #/-/c                    | j                   S rf   )r0   r>   s    r7   rg   zRouter.parent_router   s    """r9   c                h   t        |t              s#dt        |      j                  }t	        |      | j
                  rd| j
                  }t        |      | |k(  rd}t        |      |}|!|| k(  rd}t        |      |j                  }|!|| _        |j                  j                  |        y)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   RuntimeErrorrg   r1   append)r6   r   msgparents       r7   rg   zRouter.parent_router   s     &&)<T&\=R=R<UVCS/!243F3F2IJCs##6>;Cs## & ~E"3''))F   %!!$'r9   c                R    |sd}t        |      |D ]  }| j                  |        y)zT
        Attach multiple routers.

        :param routers:
        :return:
        z$At least one router must be providedN)ro   include_router)r6   routersrr   r   s       r7   include_routerszRouter.include_routers   s3     8CS/! 	(F'	(r9   c                    t        |t              s-dt        |      j                  j                   }t        |      | |_        |S )zQ
        Attach another router.

        :param router:
        :return:
        rm   )rn   r   r<   	__class__r=   ro   rg   )r6   r   rr   s      r7   ru   zRouter.include_router  sB     &&)<T&\=S=S=\=\<]^CS/!#r9   c                   K   |j                  |         | j                  j                  |i | d{    | j                  D ]  } |j                  |i | d{     y7 07 	w)zr
        Recursively call startup callbacks

        :param args:
        :param kwargs:
        :return:
        r   N)r   r3   rb   r1   emit_startupr6   argsr^   r   s       r7   r|   zRouter.emit_startup  sn      	T""dll""D3F333&& 	7F%&%%t6v666	7 	46!   2A)A%(A)A'A)'A)c                   K   |j                  |         | j                  j                  |i | d{    | j                  D ]  } |j                  |i | d{     y7 07 	w)z
        Recursively call shutdown callbacks to graceful shutdown

        :param args:
        :param kwargs:
        :return:
        r{   N)r   r4   rb   r1   emit_shutdownr}   s       r7   r   zRouter.emit_shutdown  sn      	T"#dmm##T4V444&& 	8F&&&&7777	8 	57r   )r   z
str | Noner[   None)r[   strrf   )rM   zset[str] | Noner[   z	list[str])rU   r   rV   r   r^   r   r[   r   )
rP   zTelegramEventObserver | NonerU   r   rV   r   r^   r   r[   r   )r[   zGenerator[Router, None, None])r[   zRouter | None)r   r   r[   r   )rv   r   r[   r   )r   r   r[   r   )r~   r   r^   r   r[   r   )r=   
__module____qualname____doc__r8   r?   rD   rQ   r_   rW   propertyri   rG   rg   setterrw   ru   r|   r   rC   r9   r7   r   r      s     .2 \
|6-*/ .  	
  
> * * ) )
 # # ( (>(78r9   r   N)
__future__r   collections.abcr   typingr   r   r   event.basesr	   r
   event.eventr   event.telegramr   aiogram.typesr   	frozensetr   __annotations__r   rC   r9   r7   <module>r      sB    " % , , , & 1,/8(G9L/M , MV8 V8r9   