diff --git a/src/prism/minecraft.py b/src/prism/minecraft.py index c4cd69ad..86aca185 100644 --- a/src/prism/minecraft.py +++ b/src/prism/minecraft.py @@ -1,14 +1,17 @@ import threading from json import JSONDecodeError -import requests from requests.exceptions import RequestException from prism.ratelimiting import RateLimiter +from prism.requests import make_prism_requests_session USERPROFILES_ENDPOINT = "https://api.mojang.com/users/profiles/minecraft" REQUEST_LIMIT, REQUEST_WINDOW = 100, 60 # Max requests per time window +# Use a connection pool for the requests +SESSION = make_prism_requests_session() + class MojangAPIError(ValueError): """Exception raised when we receive an error from the Mojang api""" @@ -37,7 +40,7 @@ def get_uuid(username: str) -> str | None: # pragma: nocover try: # Uphold our prescribed rate-limits with limiter: - response = requests.get(f"{USERPROFILES_ENDPOINT}/{username}") + response = SESSION.get(f"{USERPROFILES_ENDPOINT}/{username}") except RequestException as e: raise MojangAPIError( f"Request to Mojang API failed due to a connection error {e}" diff --git a/src/prism/overlay/antisniper_api.py b/src/prism/overlay/antisniper_api.py index b9f7dd07..57aadb03 100644 --- a/src/prism/overlay/antisniper_api.py +++ b/src/prism/overlay/antisniper_api.py @@ -4,12 +4,12 @@ from json import JSONDecodeError from typing import Any -import requests from cachetools import TTLCache from requests.exceptions import RequestException from prism.overlay.player import MISSING_WINSTREAKS, GamemodeName, Winstreaks from prism.ratelimiting import RateLimiter +from prism.requests import make_prism_requests_session logger = logging.getLogger(__name__) @@ -28,6 +28,9 @@ class Flag(Enum): LOWERCASE_DENICK_CACHE = TTLCache[str, str | None](maxsize=1024, ttl=60 * 60) DENICK_MUTEX = threading.Lock() +# Use a connection pool for the requests +SESSION = make_prism_requests_session() + def set_denick_cache(nick: str, uuid: str | None) -> str | None: """Set the cache entry for nick, and return the uuid""" @@ -66,7 +69,7 @@ def denick( try: # Uphold our prescribed rate-limits with key_holder.limiter: - response = requests.get( + response = SESSION.get( f"{DENICK_ENDPOINT}?key={key_holder.key}&nick={nick}" ) except RequestException as e: @@ -126,7 +129,7 @@ def get_estimated_winstreaks( try: # Uphold our prescribed rate-limits with key_holder.limiter: - response = requests.get( + response = SESSION.get( f"{WINSTREAK_ENDPOINT}?key={key_holder.key}&uuid={uuid}" ) except RequestException as e: @@ -228,7 +231,7 @@ def queue_data( try: # Uphold our prescribed rate-limits with key_holder.limiter: - response = requests.get( + response = SESSION.get( f"{ANTISNIPER_ENDPOINT}?key={key_holder.key}&name={name}" ) except RequestException as e: diff --git a/src/prism/playerdata.py b/src/prism/playerdata.py index de518b05..f27b7bb5 100644 --- a/src/prism/playerdata.py +++ b/src/prism/playerdata.py @@ -1,14 +1,17 @@ from json import JSONDecodeError from typing import Any -import requests from requests.exceptions import RequestException from prism.ratelimiting import RateLimiter +from prism.requests import make_prism_requests_session PLAYER_ENDPOINT = "https://api.hypixel.net/player" REQUEST_LIMIT, REQUEST_WINDOW = 100, 60 # Max requests per time window +# Use a connection pool for the requests +SESSION = make_prism_requests_session() + class HypixelAPIKeyHolder: """Class associating an api key with a RateLimiter instance""" @@ -46,7 +49,7 @@ def get_player_data( try: # Uphold our prescribed rate-limits with key_holder.limiter: - response = requests.get( + response = SESSION.get( f"{PLAYER_ENDPOINT}?key={key_holder.key}&uuid={uuid}" ) except RequestException as e: