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