Refactor _make_request method in ModrinthTracker to streamline API request handling. Simplify retry logic, enhance session management, and improve error handling for network issues. Update response handling to return JSON data directly.
Some checks are pending
Run pre-commit / Run pre-commit (push) Waiting to run
Some checks are pending
Run pre-commit / Run pre-commit (push) Waiting to run
This commit is contained in:
parent
fd2ace3025
commit
07f32c7b05
1 changed files with 34 additions and 33 deletions
|
@ -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:
|
||||
|
|
Loading…
Add table
Reference in a new issue