diff --git a/modrinthtracker/modrinthtracker.py b/modrinthtracker/modrinthtracker.py index 3e2267b..12f7fbb 100644 --- a/modrinthtracker/modrinthtracker.py +++ b/modrinthtracker/modrinthtracker.py @@ -57,34 +57,37 @@ class ModrinthTracker(commands.Cog): self.request_timestamps.append(current_time) - async def _make_request(self, url, params=None, retries=3): + async def _make_request(self, url, params=None): """Make a rate-limited request to the Modrinth API""" - await self._rate_limit() - - for attempt in range(retries): - try: - # Ensure session is available - if self.session is None or self.session.closed: - self.session = aiohttp.ClientSession() - - async with self.session.get(url, params=params) as response: - if response.status == 429: # Too Many Requests - retry_after = int(response.headers.get('Retry-After', 60)) - await asyncio.sleep(retry_after) - continue - return response - - except (aiohttp.ClientConnectorError, aiohttp.ClientError) as e: - if attempt == retries - 1: # Last attempt - raise - # Close and recreate session - if self.session and not self.session.closed: - await self.session.close() + try: + # Ensure session is available + if self.session is None or self.session.closed: self.session = aiohttp.ClientSession() - await asyncio.sleep(1) # Wait a bit before retrying - except Exception as e: - self.bot.logger.error(f"Error in _make_request: {str(e)}", exc_info=True) - raise + + async with self.session.get(url, params=params) as response: + if response.status == 429: # Too Many Requests + retry_after = int(response.headers.get('Retry-After', 60)) + await asyncio.sleep(retry_after) + return await self._make_request(url, params) + + # Store response data before closing + if response.status == 200: + return await response.json() + return None + + except (aiohttp.ClientConnectorError, aiohttp.ClientError) as e: + # Close and recreate session + if self.session and not self.session.closed: + await self.session.close() + self.session = aiohttp.ClientSession() + # Try one more time + async with self.session.get(url, params=params) as response: + if response.status == 200: + return await response.json() + return None + except Exception as e: + self.bot.logger.error(f"Error in _make_request: {str(e)}", exc_info=True) + raise @commands.group() @checks.admin() @@ -102,18 +105,16 @@ class ModrinthTracker(commands.Cog): """ try: # Verify the project exists and get its info - response = await self._make_request(f"{BASE_URL}/project/{project_id}") - if response.status != 200: + project_data = await self._make_request(f"{BASE_URL}/project/{project_id}") + if not project_data: await ctx.send(f"Error: Project `{project_id}` not found on Modrinth.") return - project_data = await response.json() # Get the latest version - response = await self._make_request(f"{BASE_URL}/project/{project_id}/version") - if response.status != 200: + versions = await self._make_request(f"{BASE_URL}/project/{project_id}/version") + if not versions: await ctx.send("Error: Could not fetch version information.") return - versions = await response.json() latest_version = versions[0] if versions else None tracked_projects = await self.config.guild(ctx.guild).tracked_projects() @@ -175,7 +176,7 @@ class ModrinthTracker(commands.Cog): except aiohttp.ClientConnectorError: await ctx.send("Error: Failed to connect to Modrinth API. Please try again in a few moments.") except aiohttp.ClientError as e: - await ctx.send(f"Error: Network error occurred while contacting Modrinth API. Please try again in a few moments.") + await ctx.send("Error: Network error occurred while contacting Modrinth API. Please try again in a few moments.") except asyncio.TimeoutError: await ctx.send("Error: Request to Modrinth API timed out. Please try again.") except Exception as e: