o
    ZzjC  ã                   @   sf   d 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 G dd„ dee	e ƒZd	S )
zOThis module contains a class that allows to rate limit requests to the Bot API.é    )ÚABCÚabstractmethod)ÚCallableÚ	Coroutine)ÚAnyÚGeneric)ÚJSONDict)ÚRLARGSc                   @   s˜   e Zd ZdZdZeddd„ƒZeddd„ƒZed	ed
e	e
e
eeB ee B f f de
deee
f dedeee
f dedB deeB ee B fdd„ƒZdS )ÚBaseRateLimiteraÌ  
    Abstract interface class that allows to rate limit the requests that python-telegram-bot
    sends to the Telegram Bot API. An implementation of this class
    must implement all abstract methods and properties.

    This class is a :class:`~typing.Generic` class and accepts one type variable that specifies
    the type of the argument :paramref:`~process_request.rate_limit_args` of
    :meth:`process_request` and the methods of :class:`~telegram.ext.ExtBot`.

    Hint:
        Requests to :meth:`~telegram.Bot.get_updates` are never rate limited.

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

    .. versionadded:: 20.0
    © ÚreturnNc                 Ã   ó   �dS )zKInitialize resources used by this class. Must be implemented by a subclass.Nr   ©Úselfr   r   úX/var/www/kodo/tsheker/venv/lib/python3.10/site-packages/telegram/ext/_baseratelimiter.pyÚ
initialize2   ó    zBaseRateLimiter.initializec                 Ã   r   )zMStop & clear resources used by this class. Must be implemented by a subclass.Nr   r   r   r   r   Úshutdown6   r   zBaseRateLimiter.shutdownÚcallback.ÚargsÚkwargsÚendpointÚdataÚrate_limit_argsc                 Ã   r   )a;  
        Process a request. Must be implemented by a subclass.

        This method must call :paramref:`callback` and return the result of the call.
        `When` the callback is called is up to the implementation.

        Important:
            This method must only return once the result of :paramref:`callback` is known!

        If a :exc:`~telegram.error.RetryAfter` error is raised, this method may try to make
        a new request by calling the callback again.

        Warning:
            This method *should not* handle any other exception raised by :paramref:`callback`!

        There are basically two different approaches how a rate limiter can be implemented:

        1. React only if necessary. In this case, the :paramref:`callback` is called without any
           precautions. If a :exc:`~telegram.error.RetryAfter` error is raised, processing requests
           is halted for the :attr:`~telegram.error.RetryAfter.retry_after` and finally the
           :paramref:`callback` is called again. This approach is often amendable for bots that
           don't have a large user base and/or don't send more messages than they get updates.
        2. Throttle all outgoing requests. In this case the implementation makes sure that the
           requests are spread out over a longer time interval in order to stay below the rate
           limits. This approach is often amendable for bots that have a large user base and/or
           send more messages than they get updates.

        An implementation can use the information provided by :paramref:`data`,
        :paramref:`endpoint` and :paramref:`rate_limit_args` to handle each request differently.

        Examples:
            * It is usually desirable to call :meth:`telegram.Bot.answer_inline_query`
              as quickly as possible, while delaying :meth:`telegram.Bot.send_message`
              is acceptable.
            * There are `different <https://core.telegram.org/bots/faq              #my-bot-is-hitting-limits-how-do-i-avoid-this>`_ rate limits for group chats and
              private chats.
            * When sending broadcast messages to a large number of users, these requests can
              typically be delayed for a longer time than messages that are direct replies to a
              user input.

        Args:
            callback (Callable[..., :term:`coroutine`]): The coroutine function that must be called
                to make the request.
            args (tuple[:obj:`object`]): The positional arguments for the :paramref:`callback`
                function.
            kwargs (dict[:obj:`str`, :obj:`object`]): The keyword arguments for the
                :paramref:`callback` function.
            endpoint (:obj:`str`): The endpoint that the request is made for, e.g.
                ``"sendMessage"``.
            data (dict[:obj:`str`, :obj:`object`]): The parameters that were passed to the method
                of :class:`~telegram.ext.ExtBot`. Any ``api_kwargs`` are included in this and
                any :paramref:`~telegram.ext.ExtBot.defaults` are already applied.

                Example:

                    When calling::

                        await ext_bot.send_message(
                            chat_id=1,
                            text="Hello world!",
                            api_kwargs={"custom": "arg"}
                        )

                    then :paramref:`data` will be::

                        {"chat_id": 1, "text": "Hello world!", "custom": "arg"}

            rate_limit_args (:obj:`None` | :class:`object`): Custom arguments passed to the methods
                of :class:`~telegram.ext.ExtBot`. Can e.g. be used to specify the priority of
                the request.

        Returns:
            :obj:`bool` | dict[:obj:`str`, :obj:`object`] | :obj:`None`: The result of the
            callback function.
        Nr   )r   r   r   r   r   r   r   r   r   r   Úprocess_request:   r   zBaseRateLimiter.process_request)r   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú	__slots__r   r   r   r   r   r   Úboolr   ÚlistÚdictÚstrr	   r   r   r   r   r   r
      s.     þý
üû
úùør
   N)r   Úabcr   r   Úcollections.abcr   r   Útypingr   r   Útelegram._utils.typesr   Útelegram.ext._utils.typesr	   r
   r   r   r   r   Ú<module>   s   