Source code for interactions.api.http.limiter

from asyncio import Lock
from typing import Optional

from ...utils.missing import MISSING

__all__ = ("Limiter",)


[docs]class Limiter: """ A class representing a limitation for an HTTP request. :ivar Lock lock: The "lock" or controller of the request. :ivar float reset_after: The remaining time before the request can be ran. """ __slots__ = ("lock", "reset_after") lock: Lock reset_after: float def __init__(self, *, lock: Lock, reset_after: Optional[float] = MISSING) -> None: """ :param lock: The asynchronous lock to control limits for. :type lock: Lock :param reset_after: The remaining time to run the limited lock on. Defaults to ``0``. :type reset_after: Optional[float] """ self.lock = lock self.reset_after = 0 if reset_after is MISSING else reset_after async def __aenter__(self) -> "Limiter": await self.lock.acquire() return self async def __aexit__(self, exc_type, exc_val, exc_tb) -> None: return self.lock.release() def release_lock(self) -> None: # Releases the lock if its locked, overriding the traditional release() method. # Useful for per-route, not needed? for globals. # See #428. if self.lock.locked(): self.lock.release()