§
    ­eî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         ú`/home/div/.hermes/hermes-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Ôàð 	(Ð/ð 	(Ø*8ˆDÔ Ø->ˆDÔ#Ð#à#$ˆDÔ Ø&'ˆDÔ#à>@ˆÔÝ*6ÝÔ)ÔBÐPQð+
ñ +
ô +
ˆÔð "-ˆÔÝ")¤-¡/¤/ˆÔØÔ×#Ò#Ñ%Ô%Ð%Ð%Ð%ó    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Ð2¨6Ð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]  øøøøè è € ð	3�T¥H™_­tµH¬~Ñ=ð 	3ð 	3ð 	3ð 	3ð 	3ð 	3ð 	3ð 	3ð 	3ð
  ð 	%ØÔ(ð %ð %ð %ð %ð %ð %ð %ð %Ø"˜U™WœW�}�}�}�}�}�}ð%ð %ð %ð %ñ %ô %ð %ð %ð %ð %ð %ð %ð %ð %ð %ð %ð %ð %ð %ð %ð %ð %ð %ð %øøøð %ð %ð %ð %ð %ð %ð 37Ðb¸4Ô;MÐb˜4Ô-Ð-ÕT`ÑTbÔTbˆLð ð$Ø!Ô1ð$�×'Ò'¨Ñ.Ô.Ð.å!‘^”^ð ð %ð %ð %ð %ð %ð %ð %ð %ð % lð %ð %ð %ð %ð %ð %ð %ð %Ø"˜U™WœW�}�}�}�}�}�}ð%ð %ð %ð %ñ %ô %ð %ð %ð %ð %ð %ð %ð %ð %ð %ð %ð %ñ %ô %ð %ð %ð %ð %ð %ð %ð %ð %ð %ð %ð %ð %ð %ð %ð %ð %ð %ð %øøøð %ð %ð %ð %ð %ð %ð %ñ %ô %ð %ð %ð %ð %ð %ð %ð %ð %ð %ð %ð %ð %ð %ð %ð %ð %ð %ð %ð %øøøð %ð %ð %ð %ð %ð %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Ñ%Ô%ˆØ#ŸxšxÐ(>ÀÑFÔFÐØÐØˆDõ Ô ¥­YÑ7Ô7ð 	#ð 	#Ý˜'‘l”lˆGð	#ð 	#ð 	#ñ 	#ô 	#ð 	#ð 	#ð 	#ð 	#ð 	#ð 	#øøøð 	#ð 	#ð 	#ð 	#õ �w¥Ñ$Ô$ð 	¨°1ª¨½ÀGÍSÑ9QÔ9Q¨ð ˆEå�{ Q‘Ñ'Ô'ð 	.ñ 	.ˆAð.Ø!×.Ò.ØØØ)=Ø%ØØ!ð /ñ ô ð ð ð ð ð ð ð ð, Ô'×+Ò+Ñ-Ô-Ð-Ð-Ð-Ð-øõ ð +ð +ð +Ø˜Ò#Ð#Ý×%Ò%ØDÀkÐ\_ð &ñ ô ð ð àÔ(×6Ò6Ñ8Ô8¸3Ñ>�Ý—’ÐHÈ%ÑPÔPÐPàÔ'×-Ò-Ñ/Ô/Ð/Ý”m EÑ*Ô*Ð*Ð*Ð*Ð*Ð*Ð*Ð*Ð*Ð*Ð*Ð*Ð*øøøøð+øøøð +ð Ô'×+Ò+Ñ-Ô-Ð-Ñ-ø�Ô'×+Ò+Ñ-Ô-Ð-Ð-øøøØˆ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°©9°tÑ+;ð .Àð .ð .ð .ð .ð(%àð%ð �S‰y˜4Ñð%ð #ð	%ð
 ˜3 	¨#¨s°D¸8±OÀdÈ8ÄnÑ4TÐ*TÔ UÐUÔVð%ð ð%ð �S˜#�X”ð%ð 
�‰˜4 œ>Ñ	)ð%ð %ð %ð %ð:?à˜3 	¨#¨s°D¸8±OÀdÈ8ÄnÑ4TÐ*TÔ UÐUÔVð?ð ð?ð �S˜#�X”ð	?ð
 ð?ð �3˜�8Œnð?ð ˜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   š# £-¬-