
    F˝i f                       d dl mZ d dlZd dlZd dlZd dlZd dlZd dlmZmZm	Z	m
Z
 d dlmZmZ d dlmZ d dlmZmZ d dlmZ d dlmZ d d	lmZ d d
lmZmZ d dlmZmZ d dlm Z  d dl!m"Z"m#Z# d dl$m%Z%m&Z& d dl'm(Z(m)Z) d dl*m+Z+ d dl,m-Z-m.Z. ddl/m0Z0m1Z1 ddl2m3Z3 ddl4m5Z5 ddl6m7Z7 ddl8m9Z9 erd dl:m;Z; d dl<m=Z=  e.dddd      Z> G d d e9      Z?y)!    )annotationsN)CancelledErrorEventFutureLock)AsyncGenerator	Awaitable)suppress)TYPE_CHECKINGAny)loggers)TelegramAPIError)FSMContextMiddleware)BaseEventIsolationBaseStorage)DisabledEventIsolationMemoryStorage)FSMStrategy)
GetUpdatesTelegramMethod)UpdateUser)UNSET
UNSET_TYPE)UpdateTypeLookupError)BackoffBackoffConfig   )	UNHANDLEDSkipHandler)TelegramEventObserver)ErrorsMiddleware)UserContextMiddleware)Router)Bot)TelegramTypeg      ?g      @g?g?)	min_delay	max_delayfactorjitterc                  <    e Zd ZdZdej
                  dddd	 	 	 	 	 	 	 	 	 	 	 	 	 d fdZd dZd!dZd"dZ	d#d$d	Z
ed%d
       Zed&d       Zej                  d'd       Zd(dZd)dZededf	 	 	 	 	 	 	 	 	 d*d       Zd+dZed,d       Z	 d-	 	 	 	 	 	 	 	 	 d.dZ	 	 	 	 	 	 d/dZddeddf	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d0dZd(dZ	 d1	 	 	 	 	 	 	 	 	 d2dZd3dZd4dZddeedddd	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d5dZddeedddd	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d5dZ xZ S )6
Dispatcherz
    Root router
    NF)storagefsm_strategyevents_isolationdisable_fsmnamec                  t         |   |       |r3t        |t              s#dt	        |      j
                   }t        |      t        | d      x| _        | j                  d<   | j                  j                  | j                         | j                  j                  t        |              | j                  j                  t                      t        |xs
 t!               ||xs
 t#                     | _        |s%| j                  j                  | j$                         | j&                  j                  | j$                  j(                         || _        t-               | _        d| _        d| _        t5               | _        y)a  
        Root router

        :param storage: Storage for FSM
        :param fsm_strategy: FSM strategy
        :param events_isolation: Events isolation
        :param disable_fsm: Disable FSM, note that if you disable FSM
            then you should not use storage and events isolation
        :param kwargs: Other arguments, will be passed as keyword arguments to handlers
        )r1   z4FSM storage should be instance of 'BaseStorage' not update)router
event_name)r-   strategyr/   N)super__init__
isinstancer   type__name__	TypeErrorr!   r3   	observersregister_listen_updateouter_middlewarer"   r#   r   r   r   fsmshutdowncloseworkflow_datar   _running_lock_stop_signal_stopped_signalset_handle_update_tasks)	selfr-   r.   r/   r0   r1   kwargsmsg	__class__s	           V/home/leshdev/mybot/venv/lib/python3.12/site-packages/aiogram/dispatcher/dispatcher.pyr8   zDispatcher.__init__+   s=   ( 	d#:g{;HgI_I_H`aCC. 
 2G2
 	
dnnX. 	T001 	$$%5d%;< 	$$%:%<= (.}!-I1G1I

  KK((2txx~~.-3!V*.-1<?E!    c                     | j                   |   S NrD   )rJ   items     rN   __getitem__zDispatcher.__getitem__i   s    !!$''rO   c                "    || j                   |<   y rQ   rR   )rJ   keyvalues      rN   __setitem__zDispatcher.__setitem__l   s    "'3rO   c                    | j                   |= y rQ   rR   )rJ   rV   s     rN   __delitem__zDispatcher.__delitem__o   s    s#rO   c               :    | j                   j                  ||      S rQ   )rD   get)rJ   rV   defaults      rN   r\   zDispatcher.getr   s    !!%%c733rO   c                .    | j                   j                  S rQ   )rA   r-   rJ   s    rN   r-   zDispatcher.storageu   s    xxrO   c                     y)z}
        Dispatcher has no parent router and can't be included to any other routers or dispatchers

        :return:
        N r_   s    rN   parent_routerzDispatcher.parent_routery   s     rO   c                    d}t        |      )z
        Dispatcher is root Router then configuring parent router is not allowed

        :param value:
        :return:
        z1Dispatcher can not be attached to another Router.)RuntimeError)rJ   rW   rL   s      rN   rb   zDispatcher.parent_router   s     B3rO   c           	       K   t        j                         }d}|j                         }|j                  |k7  r't	        j
                  |j                         d|i      }	 | j                  j                  | j                  j                  |i | j                  |d|i       d{   }|t        u}||j                         }||z
  dz  }	t        j                  j                  d|j                  |rdnd|	|j                          S 7 a# |j                         }||z
  dz  }	t        j                  j                  d|j                  |rdnd|	|j                          w xY ww)	z
        Main entry point for incoming updates
        Response of this method can be used as Webhook response

        :param bot:
        :param update:
        FbotcontextNi  z/Update id=%s is %s. Duration %d ms by bot id=%dhandledznot handled)asyncioget_running_looptimerf   r   model_validate
model_dumpr3   wrap_outer_middlewaretriggerrD   r   r   eventinfo	update_idid)
rJ   rf   r3   rK   loopri   
start_timeresponsefinish_timedurations
             rN   feed_updatezDispatcher.feed_update   sR     '')YY[
:: **6+<+<+>PSUF	![[>>##(( 3 H i/G))+K#j0D8HMMA  $	- ))+K#j0D8HMMA  $	-s3   AE" AD
 &D'D
 4AE"D
 
AEE"c                z   K   t        j                  |d|i      } | j                  d||d| d{   S 7 w)z
        Main entry point for incoming updates with automatic Dict->Update serializer

        :param bot:
        :param update:
        :param kwargs:
        rf   rg   rf   r3   Nra   )r   rm   _feed_webhook_update)rJ   rf   r3   rK   parsed_updates        rN   feed_raw_updatezDispatcher.feed_raw_update   sB      --fuclK.T..W3}WPVWWWWs   2;9;   c                 K   t        |      }t        ||      }i }|j                  j                  r%t	        |j                  j                  |z         |d<   d}	 	  ||fi | d{   }	|rGt        j                  j!                  d	|j                  |j                         |j#                          d}|	D ]  }| |j$                  d
z   |_         |7 n# t
        $ r}
d}t        j                  j                  dt        |
      j                  |
       t        j                  j                  d|j                  |j                  |j                         |j                          d{  7   Y d}
~
d}
~
ww xY ww)z
        Endless updates reader with correctly handling any server-side or connection errors.

        So you may not worry that the polling will stop working.
        )config)timeoutallowed_updatesrequest_timeoutFTNz Failed to fetch updates - %s: %szASleep for %f seconds and try again... (tryings = %d, bot id = %d)z2Connection established (tryings = %d, bot id = %d)r   )r   r   sessionr   int	Exceptionr   
dispatchererrorr:   r;   warning
next_delaycounterrt   asleeprr   resetrs   offset)clsrf   polling_timeoutbackoff_configr   backoffget_updatesrK   failedupdateser3   s               rN   _listen_updateszDispatcher._listen_updates   sY     0 /Z;; ),CKK,?,?/,Q(RF$% #K :6 ::$ ""''HOOFF
 ! :
 &,%5%5%9":; :  ""(()KTRSWM]M]_`a""**W&&OOFF	 nn&&&sP   AF C )C*C .A*F C 	E=#B	E8,E/-E82F 8E==F c                4  K   	 |j                   }|j                  }|j                  |        | j                  d	||d| d{   S # t        $ r?}t        j                  d|j                  d       t        d       t               |d}~ww xY w7 Ow)
a  
        Main updates listener

        Workflow:
        - Detect content type and propagate to observers in current router
        - If no one filter is pass - propagate update to child routers as Update

        :param update:
        :param kwargs:
        :return:
        zDetected unknown update type.
Seems like Telegram Bot API was updated and you have installed not latest version of aiogram framework
Update: T)exclude_unset   
stacklevelN)event_update)update_typerq   ra   )

event_typerq   r   warningswarnmodel_dump_jsonRuntimeWarningr    r3   propagate_event)rJ   r3   rK   r   rq   r   s         rN   r?   zDispatcher._listen_update   s     	' ++KLLE 	6*)T))YkYRXYYY % 		'MM $33$3GHJ  -Q&		' Zs3   BA *BBB	B:BBBc                   K   	  ||       d{    y7 # t         $ r?}t        j                  j                  d|j                  j
                  |       Y d}~yd}~ww xY ww)zk
        Simulate answer into WebHook

        :param bot:
        :param result:
        :return:
        NzFailed to make answer: %s: %s)r   r   rq   r   rM   r;   )r   rf   resultr   s       rN   silent_call_requestzDispatcher.silent_call_request  sQ     	Zf+ 	Z
 MM ?AUAUWXYY	Zs6   A"  A" 	A5AA"AA"Tc                x  K   	  | j                   ||fi | d{   }|r+t        |t              r| j                  ||       d{    |t        uS 7 97 # t
        $ rU}t        j                  j                  d|j                  |j                  |j                  j                  |       Y d}~yd}~ww xY ww)aL  
        Propagate update to event listeners

        :param bot: instance of Bot
        :param update: instance of Update
        :param call_answer: need to execute response as Telegram method (like answer into webhook)
        :param kwargs: contextual data for middlewares, filters and handlers
        :return: status
        Nrf   r   >Cause exception while process update id=%d by bot id=%d
%s: %sT)rz   r9   r   r   r   r   r   rq   	exceptionrs   rt   rM   r;   )rJ   rf   r3   call_answerrK   rw   r   s          rN   _process_updatezDispatcher._process_update/  s      	--T--c6DVDDHz(NC..3x.HHH 9,, EH 	MM##Q  $$ 	sQ   B:A A,A A	A B:A A 	B7"AB2-B:2B77B:c                n   K   	 | d{   |j                          S 7 # |j                          w xY ww)a  
        Process update with semaphore to limit concurrent tasks

        :param handle_update: Coroutine that processes the update
        :param semaphore: Semaphore to limit concurrent tasks
        :return: bool indicating the result of the update processing
        N)release)rJ   handle_update	semaphores      rN   _process_with_semaphorez"Dispatcher._process_with_semaphoreQ  s/     	 && 's    5    5  25c                  K   |j                          d{   }t        j                  j                  d|j                  |j
                  |j                         d}	||rt        j                  |      }		 | j                  ||||      2 3 d{   }
 | j                  d||
d|}|r|	r>|	j                          d{    t        j                  | j                  ||	            }nt        j                  |      }| j                  j                  |       |j!                  | j                  j"                         | d{    7 77 7 7 6 	 t        j                  j                  d|j                  |j
                  |j                         y# t        j                  j                  d|j                  |j
                  |j                         w xY ww)a  
        Internal polling process

        :param bot:
        :param polling_timeout: Long-polling wait time
        :param handle_as_tasks: Run task for each event and no wait result
        :param backoff_config: backoff-retry config
        :param allowed_updates: List of the update types you want your bot to receive
        :param tasks_concurrency_limit: Maximum number of concurrent updates to process
            (None = no limit), used only if handle_as_tasks is True
        :param kwargs:
        :return:
        Nz"Run polling for bot @%s id=%d - %r)r   r   r   r|   z&Polling stopped for bot @%s id=%d - %rra   )mer   r   rr   usernamert   	full_namerj   	Semaphorer   r   acquirecreate_taskr   rI   addadd_done_callbackdiscard)rJ   rf   r   handle_as_tasksr   r   tasks_concurrency_limitrK   userr   r3   r   handle_update_tasks                rN   _pollingzDispatcher._pollingb  s    . 668^0MMFFNN		
 	".?))*ABI	 $ 4 4 /- /	 !5 ! ( (f !5 4 4 VV Vv V" '//111-4-@-@ 88	R.* .5-@-@-O*--112DE&889R9R9Z9Z['''E $( 2 ()!, ##8	G##8	sy   GEAG7F EEE-F EBF EF GEF F F AGAGGc                  K   	  | j                   ||fi | d{   S 7 # t        $ rQ}t        j                  j	                  d|j
                  |j                  |j                  j                  |        d}~ww xY ww)zg
        The same with `Dispatcher.process_update()` but returns real response instead of bool
        Nr   )	rz   r   r   rq   r   rs   rt   rM   r;   )rJ   rf   r3   rK   r   s        rN   r}   zDispatcher._feed_webhook_update  st     
	)))#v@@@@@ 	MM##Q  $$ 	s1   A?"  " A?" 	A<AA77A<<A?c                   K   t        |t              st        j                  |di      }t        j                         }t        j                         }|j                         dfd}|j                  ||      }t        j                    j                  d|d|      }	|	j                  ||       d fd}
	 	  d {    |	j                         r2|	j!                         }t        |t"              r6||j                          S |	j                  |       |	j                  |
|       |j                          y 7 {# t        $ r# |	j                  |       |	j                           w xY w# |j                          w xY ww)	Nrf   rg   c                 J    j                         sj                  d        y y rQ   )done
set_result)_waiters    rN   release_waiterz6Dispatcher.feed_webhook_update.<locals>.release_waiter  s    ;;=!!$' !rO   r|   c                    t        j                  dt        d       | j                         }t	        |t
              r't        j                  j                  |             y y )NzDetected slow response into webhook.
Telegram is waiting for response only first 60 seconds and then re-send update.
For preventing this situation response into webhook returned immediately and handler is moved to background and still processing update.r   r   r   )	r   r   r   r   r9   r   rj   ensure_futurer   )taskr   rf   rJ   s     rN   process_responsez8Dispatcher.feed_webhook_update.<locals>.process_response  sW    MMR  [[]F&.1%%d&>&>3v&>&VW 2rO   )r   r   returnNonera   )r   zFuture[Any]r   r   )r9   r   rm   contextvarscopy_contextrj   rk   create_future
call_laterr   r}   r   r   remove_done_callbackcancelr   r   r   )rJ   rf   r3   _timeoutrK   ctxru   r   timeout_handleprocess_updatesr   rw   r   s   ``          @rN   feed_webhook_updatezDispatcher.feed_webhook_update  sk     &&)**6E3<HF&&('')##%	( >B'.'<'<%D%%G#fGG(
 	)).#)F	X	$ ##% / 6 6 8h7# !!#	  44^D112BC1P !!#' ! 44^D&&(  !!#sN   B<F
E E	E 1E5 >F
$E5 3F
E ,E22E5 5FF
c                  K   | j                   j                         sd}t        |      | j                  r| j                  sy| j                  j                          | j                  j                          d{    y7 w)zd
        Execute this method if you want to stop polling programmatically

        :return:
        zPolling is not startedN)rE   lockedrd   rF   rG   rH   wait)rJ   rL   s     rN   stop_pollingzDispatcher.stop_polling  sh      !!((**Cs##  (<(<""'')))s   A8B:B ;Bc                    | j                   j                         sy t        j                  j	                  d|j
                         | j                  sy | j                  j                          y )NzReceived %s signal)rE   r   r   r   r   r1   rF   rH   )rJ   sigs     rN   _signal_stop_pollingzDispatcher._signal_stop_polling  sP    !!((*""#7B  rO   
   r   r   r   r   handle_signalsclose_bot_sessionr   c                 K   |sd}
t        |
      d|	v rd}
t        |
      | j                  4 d{    | j                  t               | _        | j                  t               | _        |t
        u r| j                         }| j                  j                          | j                  j                          |rt        j                         }t        t              5  |j                  t        j                  | j                  t        j                         |j                  t        j                   | j                  t        j                          ddd       | |d| j"                  |	}d|v r|j%                  d        | j&                  dd|d   i| d{    t(        j*                  j-                  d       	 |D cg c].  }t        j.                   | j0                  d||||||d|      0 }}|j3                  t        j.                  | j                  j5                                      t        j4                  |t        j6                  	       d{   \  }}|D ]4  }|j9                          t        t:              5  | d{    ddd       6 t        j<                  |  d{    t(        j*                  j-                  d
       	  | j>                  dd|d   i| d{    |r"t        j<                  d |D          d{    	 | j                  jA                          ddd      d{    y7 # 1 sw Y   xY w7 c c}w 7 7 # 1 sw Y   xY w7 7 7 ^# |r#t        j<                  d |D          d{  7   w w xY w# t(        j*                  j-                  d
       	  | j>                  dd|d   i| d{  7   |rMt        j<                  d |D          d{  7   n*# |r#t        j<                  d |D          d{  7   w w xY w| j                  jA                          w xY w7 # 1 d{  7  sw Y   yxY ww)a  
        Polling runner

        :param bots: Bot instances (one or more)
        :param polling_timeout: Long-polling wait time
        :param handle_as_tasks: Run task for each event and no wait result
        :param backoff_config: backoff-retry config
        :param allowed_updates: List of the update types you want your bot to receive
               By default, all used update types are enabled (resolved from handlers)
        :param handle_signals: handle signals (SIGINT/SIGTERM)
        :param close_bot_session: close bot sessions on shutdown
        :param tasks_concurrency_limit: Maximum number of concurrent updates to process
            (None = no limit), used only if handle_as_tasks is True
        :param kwargs: contextual data
        :return:
        z6At least one bot instance is required to start pollingrf   zbKeyword argument 'bot' is not acceptable, the bot instance should be passed as positional argumentN)r   botszStart polling)rf   r   r   r   r   r   )return_whenzPolling stoppedc              3  P   K   | ]  }|j                   j                            y wrQ   )r   rC   ).0rf   s     rN   	<genexpr>z+Dispatcher.start_polling.<locals>.<genexpr>u  s     .Sss{{/@/@/B.Ss   $&ra   )!
ValueErrorrE   rF   r   rG   r   resolve_used_update_typesclearrj   rk   r
   NotImplementedErroradd_signal_handlersignalSIGTERMr   SIGINTrD   popemit_startupr   r   rr   r   r   appendr   FIRST_COMPLETEDr   r   gatheremit_shutdownrH   )rJ   r   r   r   r   r   r   r   r   rK   rL   ru   rD   rf   tasksr   pendingr   s                     rN   start_pollingzDispatcher.start_polling  s    8 JCS/!F?K  S/!%% H	+ H	+  ($)G!##+',w$%'"&"@"@"B##%  &&(//112  ++11
 ++11 # $$ 	M %!!%(#$##BRBMBBB##O4!+  $2  ''%  #,;,;+9,;4K ,
2 2 W001B1B1G1G1IJK&-ll5gF]F]&^ ^g# #DKKM!.1 #"

# ## nnd+++ ""''(9:U,$,,KbK]KKK(%nn.Sd.STTT$$((*QH	+ H	+ H	+ . C2 !_ ## # ,
 L U )%nn.Sd.STTT )	 ""''(9:U,$,,KbK]KKK(%nn.Sd.STTT )%nn.Sd.STTT )$$((*QH	+ H	+ H	+ H	+s\  1Q'MQ'B(QA3M
A
QM#QN!3M8A&N!M+N!
M$M"
M$N!4M15N!9QM73M34M78QM5Q6Q'QQ'
M		QN!"M$$M.)	N!3M75Q7NN
NQ! QPO
P"Q P
QP.	&P)'P.	.QQQ'Q$QQ$ Q'c                  t        t              5   | j                  |i |	|||||||d}
	 ddl}t        j
                  dk\  rDt        j                  |j                        5 }|j                  |
      cddd       cddd       S |j                          t        j                  |
      cddd       S # 1 sw Y   n0xY w# t        $ r! t        j                  |
      cY cddd       S w xY w	 ddd       y# 1 sw Y   yxY w)a  
        Run many bots with polling

        :param bots: Bot instances (one or more)
        :param polling_timeout: Long-polling wait time
        :param handle_as_tasks: Run task for each event and no wait result
        :param backoff_config: backoff-retry config
        :param allowed_updates: List of the update types you want your bot to receive
        :param handle_signals: handle signals (SIGINT/SIGTERM)
        :param close_bot_session: close bot sessions on shutdown
        :param tasks_concurrency_limit: Maximum number of concurrent updates to process
            (None = no limit), used only if handle_as_tasks is True
        :param kwargs: contextual data
        :return:
        r   r   N)      )loop_factory)r
   KeyboardInterruptr   uvloopsysversion_inforj   Runnernew_event_loopruninstallImportError)rJ   r   r   r   r   r   r   r   r   rK   coror  runners                rN   run_pollingzDispatcher.run_pollingx  s   6 '( 	-%4%%

 !0 /- /-"3(?
D- ##w. V5J5JK 0v%zz$/0 0+	- 	-0 NN$";;t,3	- 	-*0 0  ){{4((#	- 	- )
0+	- 	- 	-sK   C:C3C:%B76	C:	$C:7C 	<C:C-!C:,C--C::D)r-   zBaseStorage | Noner.   r   r/   zBaseEventIsolation | Noner0   boolr1   z
str | NonerK   r   r   r   )rS   strr   r   )rV   r  rW   r   r   r   )rV   r  r   r   rQ   )r]   
Any | NonerV   r  r   r  )r   r   )r   zRouter | None)rW   r$   r   r   )rf   r%   r3   r   rK   r   r   r   )rf   r%   r3   zdict[str, Any]rK   r   r   r   )
rf   r%   r   r   r   r   r   list[str] | Noner   zAsyncGenerator[Update, None])r3   r   rK   r   r   r   )rf   r%   r   zTelegramMethod[Any]r   r   )T)
rf   r%   r3   r   r   r  rK   r   r   r  )r   zAwaitable[bool]r   zasyncio.Semaphorer   r  )rf   r%   r   r   r   r  r   r   r   r  r   
int | NonerK   r   r   r   )7   )
rf   r%   r3   zUpdate | dict[str, Any]r   floatrK   r   r   z#TelegramMethod[TelegramType] | None)r   r   )r   zsignal.Signalsr   r   )r   r%   r   r   r   r  r   r   r   zlist[str] | UNSET_TYPE | Noner   r  r   r  r   r  rK   r   r   r   )!r;   
__module____qualname____doc__r   USER_IN_CHATr8   rT   rX   rZ   r\   propertyr-   rb   setterrz   r   classmethodDEFAULT_BACKOFF_CONFIGr   r?   r   r   r   r   r}   r   r   r   r   r   r  __classcell__)rM   s   @rN   r,   r,   &   s]    '+$/$<$<6:!<B $<B "	<B
 4<B <B <B <B 
<B|(($4          +Z	X   "(>,07:7: 7: &	7:
 *7: 
&7: 7:rZ< Z Z* !	 - -  - 	 -
  - 
 -D &  %  
	 (  " $(>,0.2@@ @ 	@
 &@ *@ ",@ @ 
@D( 	;; (; 	;
 ; 
-;z*   " $(>9>#"&.2n+n+ n+ 	n+
 &n+ 7n+ n+  n+ ",n+ n+ 
n+f  " $(>9>#"&.24-4- 4- 	4-
 &4- 74- 4-  4- ",4- 4- 
4-rO   r,   )@
__future__r   rj   r   r   r  r   r   r   r   r   collections.abcr   r	   
contextlibr
   typingr   r   aiogramr   aiogram.exceptionsr   aiogram.fsm.middlewarer   aiogram.fsm.storage.baser   r   aiogram.fsm.storage.memoryr   r   aiogram.fsm.strategyr   aiogram.methodsr   r   aiogram.typesr   r   aiogram.types.baser   r   aiogram.types.updater   aiogram.utils.backoffr   r   event.basesr   r    event.telegramr!   middlewares.errorr"   middlewares.user_contextr#   r4   r$   aiogram.client.botr%   aiogram.methods.baser&   r  r,   ra   rO   rN   <module>r5     s    "    
  7 7 5  %  / 7 D L , 6 & 0 6 8 / 1 / ; &1&CX[\ F
- F
-rO   