
    i31                         d Z ddlZddlZddlmZmZ ddlmZ 	 ddlm	Z	 dZ
n# e$ r dZ
Y nw xY wddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ej        Z eed          Z G d dee                   ZdS )zeThis module contains an implementation of the BaseRateLimiter class based on the aiolimiter
library.
    N)Callable	Coroutine)Any)AsyncLimiterTF)	constants)
get_logger)JSONDict)
RetryAfter)BaseRateLimiterAIORateLimiter)
class_namec                      e Zd ZdZdZej        j        dej        j        ddfde	de	de	d	e	d
e
ddfdZddZddZdee
z  ez  ddfdZdedee
z  ez  dededeeeeez  ee         z  f         f         dedeeef         deez  ee         z  fdZdedeeeeez  ee         z  f         f         dedeeef         dedeeef         de
dz  deez  ee         z  fdZdS ) r   ak  
    Implementation of :class:`~telegram.ext.BaseRateLimiter` using the library
    `aiolimiter <https://aiolimiter.readthedocs.io/en/stable>`_.

    Important:
        If you want to use this class, you must install PTB with the optional requirement
        ``rate-limiter``, i.e.

        .. code-block:: bash

           pip install "python-telegram-bot[rate-limiter]"

    The rate limiting is applied by combining two levels of throttling and :meth:`process_request`
    roughly boils down to::

        async with group_limiter(group_id):
            async with overall_limiter:
                await callback(*args, **kwargs)

    Here, ``group_id`` is determined by checking if there is a ``chat_id`` parameter in the
    :paramref:`~telegram.ext.BaseRateLimiter.process_request.data`.
    The ``overall_limiter`` is applied only if a ``chat_id`` argument is present at all.

    Attention:
        * Some bot methods accept a ``chat_id`` parameter in form of a ``@username`` for
          supergroups and channels. As we can't know which ``@username`` corresponds to which
          integer ``chat_id``, these will be treated as different groups, which may lead to
          exceeding the rate limit.
        * As channels can't be differentiated from supergroups by the ``@username`` or integer
          ``chat_id``, this also applies the group related rate limits to channels.
        * A :exc:`~telegram.error.RetryAfter` exception will halt *all* requests for
          :attr:`~telegram.error.RetryAfter.retry_after` + 0.1 seconds. This may be stricter than
          necessary in some cases, e.g. the bot may hit a rate limit in one group but might still
          be allowed to send messages in another group or with
          :paramref:`~telegram.Bot.send_message.allow_paid_broadcast` set to :obj:`True`.

    Tip:
        With `Bot API 7.1 <https://core.telegram.org/bots/api-changelog#october-31-2024>`_
        (PTB v27.1), Telegram introduced the parameter
        :paramref:`~telegram.Bot.send_message.allow_paid_broadcast`.
        This allows bots to send up to
        :tg-const:`telegram.constants.FloodLimit.PAID_MESSAGES_PER_SECOND` messages per second by
        paying a fee in Telegram Stars.

        .. versionchanged:: 21.11
            This class automatically takes the
            :paramref:`~telegram.Bot.send_message.allow_paid_broadcast` parameter into account and
            throttles the requests accordingly.

    Note:
        This class is to be understood as minimal effort reference implementation.
        If you would like to handle rate limiting in a more sophisticated, fine-tuned way, we
        welcome you to implement your own subclass of :class:`~telegram.ext.BaseRateLimiter`.
        Feel free to check out the source code of this class for inspiration.

    .. seealso:: :wiki:`Avoiding Flood Limits <Avoiding-flood-limits>`

    .. versionadded:: 20.0

    Args:
        overall_max_rate (:obj:`float`): The maximum number of requests allowed for the entire bot
            per :paramref:`overall_time_period`. When set to 0, no rate limiting will be applied.
            Defaults to :tg-const:`telegram.constants.FloodLimit.MESSAGES_PER_SECOND`.
        overall_time_period (:obj:`float`): The time period (in seconds) during which the
            :paramref:`overall_max_rate` is enforced.  When set to 0, no rate limiting will be
            applied. Defaults to ``1``.
        group_max_rate (:obj:`float`): The maximum number of requests allowed for requests related
            to groups and channels per :paramref:`group_time_period`.  When set to 0, no rate
            limiting will be applied. Defaults to
            :tg-const:`telegram.constants.FloodLimit.MESSAGES_PER_MINUTE_PER_GROUP`.
        group_time_period (:obj:`float`): The time period (in seconds) during which the
            :paramref:`group_max_rate` is enforced.  When set to 0, no rate limiting will be
            applied. Defaults to ``60``.
        max_retries (:obj:`int`): The maximum number of retries to be made in case of a
            :exc:`~telegram.error.RetryAfter` exception.
            If set to 0, no retries will be made. Defaults to ``0``.

    )_apb_limiter_base_limiter_group_limiters_group_max_rate_group_time_period_max_retries_retry_after_event   <   r   overall_max_rateoverall_time_periodgroup_max_rategroup_time_periodmax_retriesreturnNc                    t           st          d          |r|rt          ||          | _        nd | _        |r|r|| _        || _        nd| _        d| _        i | _        t          t          j        j	        d          | _
        || _        t          j                    | _        | j                                         d S )NzeTo use `AIORateLimiter`, PTB must be installed via `pip install "python-telegram-bot[rate-limiter]"`.max_ratetime_periodr   r   )AIO_LIMITER_AVAILABLERuntimeErrorr   r   r   r   r   r   
FloodLimitPAID_MESSAGES_PER_SECONDr   r   asyncioEventr   set)selfr   r   r   r   r   s         \/Users/shanyulin/my-agent/.venv/lib/python3.11/site-packages/telegram/ext/_aioratelimiter.py__init__zAIORateLimiter.__init__   s     % 	8    	& 3 	&6B)7J7 7 7D "&D 	(/ 	(*8D ->D###$D &'D#>@*6)BPQ+
 +
 +
 "-")-//##%%%%%    c                 
   K   dS zDoes nothing.N r)   s    r*   
initializezAIORateLimiter.initialize   
        r,   c                 
   K   dS r.   r/   r0   s    r*   shutdownzAIORateLimiter.shutdown   r2   r,   group_idr   c                 X   t          | j                  dk    rZ| j                                                                        D ].\  }}||k    r|                    |j                  r| j        |= /|| j        vr#t          | j        | j                  | j        |<   | j        |         S )Ni   r   )	lenr   copyitemshas_capacityr    r   r   r   )r)   r5   keylimiters       r*   _get_group_limiterz!AIORateLimiter._get_group_limiter   s    
 t#$$s** $ 4 9 9 ; ; A A C C 2 2W(??''(899 2,S14///-9- 3. . .D * #H--r,   chatgroupallow_paid_broadcastcallback.argskwargsc                 |   K   dt           t          z  t          t                   z  f fd}|rC j        4 d {V   |             d {V cd d d           d {V  S # 1 d {V swxY w Y   d S |r j        r j        nt                      }|r j        r                     |          nt                      }	|	4 d {V  |4 d {V   |             d {V cd d d           d {V  cd d d           d {V  S # 1 d {V swxY w Y   d d d           d {V  d S # 1 d {V swxY w Y   d S )Nr   c                  b   K   j                                          d {V    i  d {V S )N)r   wait)rB   rA   rC   r)   s   r*   innerz*AIORateLimiter._run_request.<locals>.inner   sU      )..000000000!426222222222r,   )boolr	   listr   r   null_contextr   r=   )
r)   r>   r?   r@   rA   rB   rC   rG   base_contextgroup_contexts
   `   ```   r*   _run_requestzAIORateLimiter._run_request   s]     	3TH_tH~= 	3 	3 	3 	3 	3 	3 	3 	3 	3
   	%( % % % % % % % %"UWW}}}}}}% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % 37b4;Mb4--T`TbTbL $!1$''...!^^  % % % % % % % % %l % % % % % % % %"UWW}}}}}}% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %sH   A$$
A.1A.		D+D"D+
D	D+D	D++
D58D5endpointdatarate_limit_argsc           	        K   |p| j         }d}d}	|                    d          }
|                    dd          }|
d}	t          j        t          t
                    5  t          |
          }
ddd           n# 1 swxY w Y   t          |
t                    r|
dk     st          |
t                    r|
}t          |dz             D ]}	 | 
                    |	|||||           d{V 	 | j                                         c S # t          $ r}||k    rt                              d	||
            |j                                        dz   }t                              d|           | j                                         t)          j        |           d{V  Y d}~nd}~ww xY w	 | j                                         # | j                                         w xY wdS )a  
        Processes a request by applying rate limiting.

        See :meth:`telegram.ext.BaseRateLimiter.process_request` for detailed information on the
        arguments.

        Args:
            rate_limit_args (:obj:`None` | :obj:`int`): If set, specifies the maximum number of
                retries to be made in case of a :exc:`~telegram.error.RetryAfter` exception.
                Defaults to :paramref:`AIORateLimiter.max_retries`.
        Fchat_idr@   NTr   r   )r>   r?   r@   rA   rB   rC   z*Rate limit hit after maximum of %d retries)exc_infog?z)Rate limit hit. Retrying after %f seconds)r   get
contextlibsuppress
ValueError	TypeErrorint
isinstancestrrangerM   r   r(   r
   _LOGGER	exception_retry_aftertotal_secondsinfoclearr&   sleep)r)   rA   rB   rC   rN   rO   rP   r   r?   r>   rR   r@   iexcrc   s                  r*   process_requestzAIORateLimiter.process_request   s     ( &:):"'((9%%#xx(>FFD  Y77 	# 	#'llG	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# w$$ 	1GS9Q9Q E{Q'' 	. 	.A.!..)=%! /         , '++------  + + +##%%Dk\_ &    (66883>H%PPP'--///mE**************+ + '++----'++----ts=   A::A>A> D


F,BF'"G'F,,GG&)r   N)__name__
__module____qualname____doc__	__slots__r   r$   MESSAGES_PER_SECONDMESSAGES_PER_MINUTE_PER_GROUPfloatrY   r+   r1   r4   r[   rH   r=   r   r   r   r	   rI   dictrM   rf   r/   r,   r*   r   r   2   s!       M M^I #,"6"J%& ) 4 R#%!& !&!& #!& 	!&
 !!& !& 
!& !& !& !&F      .39t+; . . . . .(%% Sy4% #	%
 3	#sD8Od8n4T*T UUV% % S#X% 
4>	)% % % %:?3	#sD8Od8n4T*T UUV? ? S#X	?
 ? 38n? t? 
4>	)? ? ? ? ? ?r,   )rj   r&   rU   collections.abcr   r   typingr   
aiolimiterr   r"   ImportErrortelegramr   telegram._utils.loggingr   telegram._utils.typesr	   telegram.errorr
   telegram.ext._baseratelimiterr   nullcontextrJ   rg   r]   rY   r   r/   r,   r*   <module>rz      sW  &       / / / / / / / /      "''''''  " " "!"       . . . . . . * * * * * * % % % % % % 9 9 9 9 9 9
 % *X*:
;
;
;s s s s s_S) s s s s ss   # --