
    YPi6                         d Z ddlZddlZddlmZ ddlmZmZ ddlm	Z	 ddl
mZmZmZmZ  e	e      Zdddddd	ed
ef   deeegdf      dededeej&                     deeg ef      dededdfdZy)a  This module contains a network retry loop implementation.
Its specifically tailored to handling the Telegram API and its errors.

.. versionadded:: 21.11

Hint:
    It was originally part of the `Updater` class, but as part of #4657 it was extracted into its
    own module to be used by other parts of the library.

Warning:
    Contents of this module are intended to be used internally by the library and *not* by the
    user. Changes to this module are not considered breaking changes and may not be documented in
    the changelog.
    N)	Coroutine)CallableOptional)
get_logger)InvalidToken
RetryAfterTelegramErrorTimedOutF)	on_err_cb
stop_event
is_runningrepeat_on_success	action_cb.r   descriptionintervalr   r   max_retriesr   returnc                    K   |r|dk\  rt        d      d| d|xs d }d fd}	t        j                  d       |}
d} |       r_	  |	        d{    |st        j                  d	       	 |d
z  }y	 |}
|d
z  }|
rt        j                  |
       d{     |       r^yy7 T# t        $ rA}d}t        j	                  d||       ||j
                  j                         z   }
Y d}~ud}~wt        $ r#}t        j                  d|       d}
Y d}~d}~wt        $ r t        j                  d        t        $ rg}|r ||       |dk  s||k  rt        j                  d||       nt        j                  d||        |
dk(  rd
nt        dd|
z        }
Y d}~,d}~ww xY w# |d
z  }w xY w7 w)a  Perform a loop calling `action_cb`, retrying after network errors.

    Stop condition for loop in case of ``max_retries < 0``:
        * `is_running()` evaluates :obj:`False`
        * `stop_event` is set.
        * calling `action_cb` succeeds and `repeat_on_success` is :obj:`False`.

    Additional stop condition for loop in case of `max_retries >= 0``:
        * a call to `action_cb` succeeds
        * or `max_retries` is reached.

    Args:
        action_cb (:term:`coroutine function`): Network oriented callback function to call.
        on_err_cb (:obj:`callable`): Optional. Callback to call when TelegramError is caught.
            Receives the exception object as a parameter.

            Hint:
                Only required if you want to handle the error in a special way. Logging about
                the error is already handled by the loop.

            Important:
                Must not raise exceptions! If it does, the loop will be aborted.
        description (:obj:`str`): Description text to use for logs and exception raised.
        interval (:obj:`float` | :obj:`int`): Interval to sleep between each call to
            `action_cb`.
        stop_event (:class:`asyncio.Event` | :obj:`None`): Event to wait on for stopping the
            loop. Setting the event will make the loop exit even if `action_cb` is currently
            running. Defaults to :obj:`None`.
        is_running (:obj:`callable`): Function to check if the loop should continue running.
            Must return a boolean value. Defaults to `lambda: True`.
        max_retries (:obj:`int`): Maximum number of retries before stopping the loop.

            * < 0: Retry indefinitely.
            * 0: No retries.
            * > 0: Number of retries.

        repeat_on_success (:obj:`bool`): Whether to repeat the action after a successful call.
            Defaults to :obj:`False`.

    Raises:
        ValueError: When passing `repeat_on_success=True` and `max_retries >= 0`. This case is
            currently not supported.

    r   z7Cannot use repeat_on_success=True with max_retries >= 0zNetwork Retry Loop (z):c                       y)NT r       U/root/twitch_bot/venv/lib/python3.12/site-packages/telegram/ext/_utils/networkloop.py<lambda>z$network_retry_loop.<locals>.<lambda>i   s    r   Nc                    K   s         d {    y t        j                                } t        j                  j                               }t        j                  | |ft         j                         d {   \  }}t	        j
                  t         j                        5  |D ]  }|j                           	 d d d        ||v rt        j                  d       y | j                          y 7 7 y# 1 sw Y   9xY ww)N)return_whenz%s Cancelled)asynciocreate_taskwaitFIRST_COMPLETED
contextlibsuppressCancelledErrorcancel_LOGGERdebugresult)action_cb_task	stop_taskdonependingtaskr   
log_prefixr   s        r   	do_actionz%network_retry_loop.<locals>.do_actionk   s     + ,,Y[9''
(9:	%llY'W5L5L
 
g   !7!78 	 	 MM.*5 	% 

	 	s:   DC5A,D=C7>*D(C95D7D9D>Dz%s Startingz#%s Action succeeded. Stopping loop.   g      ?z/%s %s. Adding %s seconds to the specified time.z'%s Timed out: %s. Retrying immediately.z&%s Invalid token. Aborting retry loop.z(%s Failed run number %s of %s. Retrying.z(%s Failed run number %s of %s. Aborting.   g      ?)r   N)
ValueErrorr$   r%   r   info_retry_aftertotal_secondsr
   r   	exceptionr	   minr   sleep)r   r   r   r   r   r   r   r   effective_is_runningr-   cur_intervalretriesexc
slack_timetoetelegram_excr,   s   `   `           @r   network_retry_loopr>   -   s    n [A-RSS'}B7J%7, , MM-,LG

 &	+$CZPD qLGI %D $LqLG-----U 
   	IJLLA:sT^ &(8(8(F(F(HHL 	MMCZQTUL 	F
S 	S,'Q'K"7>
GU` !!>
GU`  !- 11s2s\?Q7RL	S& qLG .s   A	G
B0 B.B0 7G>F4  GF> G,G.B0 0	F197C50F4 5F1DF4 +F1
AF,&F4 ,F11F4 4F;;G)__doc__r   r    collections.abcr   typingr   r   telegram._utils.loggingr   telegram.errorr   r   r	   r
   __name__r$   strfloatEventboolintr>   r   r   r   <module>rJ      s   &   % % . L L
X
 <@ +//3#A.Y'A. -$!678A. 	A.
 A. 'A. "d(+,A. A. A. 
A.r   