Refactor API error handling in Leaderboard cog to improve JSON response validation and logging. Update authorization header format, streamline error message retrieval, and enhance exception handling for various API response statuses, ensuring better reliability and debugging capabilities.
Some checks are pending
Run pre-commit / Run pre-commit (push) Waiting to run

This commit is contained in:
Valerie 2025-05-26 09:59:16 -04:00
parent 963d9e3e73
commit 3794068ae5

View file

@ -107,14 +107,8 @@ class Leaderboard(commands.Cog):
try: try:
async with self.session.get( async with self.session.get(
f"{self.api_base_url}/leaderboard", f"{self.api_base_url}/leaderboard",
headers={"Authorization": f"Token {self.admin_secret['admin_secret']}"} headers={"Authorization": self.admin_secret["admin_secret"]}
) as resp: ) as resp:
try:
data = await resp.json()
except aiohttp.ContentTypeError:
log.error("API returned invalid JSON response during initialization")
return
if resp.status == 200: if resp.status == 200:
# Start auto-sync task if API connection successful # Start auto-sync task if API connection successful
self.auto_sync_task = self.bot.loop.create_task(self._auto_sync_task()) self.auto_sync_task = self.bot.loop.create_task(self._auto_sync_task())
@ -123,8 +117,12 @@ class Leaderboard(commands.Cog):
log.error("Failed to initialize API: Invalid admin secret") log.error("Failed to initialize API: Invalid admin secret")
else: else:
log.error(f"Failed to initialize API: Status {resp.status}") log.error(f"Failed to initialize API: Status {resp.status}")
if data.get("error"): try:
log.error(f"Error message: {data['error']}") data = await resp.json()
if data.get("error"):
log.error(f"Error message: {data['error']}")
except aiohttp.ContentTypeError:
log.error("API returned invalid JSON response during initialization")
except aiohttp.ClientError as e: except aiohttp.ClientError as e:
log.error(f"Failed to connect to API: {str(e)}") log.error(f"Failed to connect to API: {str(e)}")
except Exception as e: except Exception as e:
@ -264,7 +262,7 @@ class Leaderboard(commands.Cog):
async with self.session.post( async with self.session.post(
f"{self.api_base_url}/leaderboard", f"{self.api_base_url}/leaderboard",
headers={ headers={
"Authorization": f"Token {self.admin_secret['admin_secret']}", "Authorization": self.admin_secret["admin_secret"],
"Content-Type": "application/json" "Content-Type": "application/json"
}, },
json={ json={
@ -274,24 +272,26 @@ class Leaderboard(commands.Cog):
"optedOut": opted_out "optedOut": opted_out
} }
) as resp: ) as resp:
try:
data = await resp.json()
except aiohttp.ContentTypeError:
log.error(f"API returned invalid JSON response with status {resp.status}")
return False
if resp.status == 200: if resp.status == 200:
if data.get("success"): try:
log.info(f"Updated leaderboard for {username}: {credits} credits (opted_out: {opted_out})") data = await resp.json()
return True if data.get("success"):
else: log.info(f"Updated leaderboard for {username}: {credits} credits (opted_out: {opted_out})")
log.error(f"API update failed: {data.get('error', 'Unknown error')}") return True
else:
log.error(f"API update failed: {data.get('error', 'Unknown error')}")
except aiohttp.ContentTypeError:
log.error("API returned invalid JSON response")
elif resp.status == 401: elif resp.status == 401:
log.error("Unauthorized: Invalid admin secret") log.error("Unauthorized: Invalid admin secret")
else: else:
log.error(f"API update failed: Status {resp.status}") log.error(f"API update failed: Status {resp.status}")
if data.get("error"): try:
log.error(f"Error message: {data['error']}") data = await resp.json()
if data.get("error"):
log.error(f"Error message: {data['error']}")
except aiohttp.ContentTypeError:
pass
return False return False
except aiohttp.ClientError as e: except aiohttp.ClientError as e:
log.error(f"API request failed: {str(e)}") log.error(f"API request failed: {str(e)}")
@ -308,24 +308,26 @@ class Leaderboard(commands.Cog):
try: try:
async with self.session.get( async with self.session.get(
f"{self.api_base_url}/leaderboard", f"{self.api_base_url}/leaderboard",
headers={"Authorization": f"Token {self.admin_secret['admin_secret']}"} headers={"Authorization": self.admin_secret["admin_secret"]}
) as resp: ) as resp:
try:
data = await resp.json()
except aiohttp.ContentTypeError:
log.error(f"API returned invalid JSON response with status {resp.status}")
return None
if resp.status == 200: if resp.status == 200:
if "leaderboard" in data: try:
return data["leaderboard"] data = await resp.json()
log.error("Invalid API response format") if "leaderboard" in data:
return data["leaderboard"]
log.error("Invalid API response format")
except aiohttp.ContentTypeError:
log.error("API returned invalid JSON response")
elif resp.status == 401: elif resp.status == 401:
log.error("Unauthorized: Invalid admin secret") log.error("Unauthorized: Invalid admin secret")
else: else:
log.error(f"Failed to fetch leaderboard: Status {resp.status}") log.error(f"Failed to fetch leaderboard: Status {resp.status}")
if data.get("error"): try:
log.error(f"Error message: {data['error']}") data = await resp.json()
if data.get("error"):
log.error(f"Error message: {data['error']}")
except aiohttp.ContentTypeError:
pass
return None return None
except aiohttp.ClientError as e: except aiohttp.ClientError as e:
log.error(f"Error fetching leaderboard: {str(e)}") log.error(f"Error fetching leaderboard: {str(e)}")