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
Some checks are pending
Run pre-commit / Run pre-commit (push) Waiting to run
This commit is contained in:
parent
963d9e3e73
commit
3794068ae5
1 changed files with 37 additions and 35 deletions
|
@ -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)}")
|
||||||
|
|
Loading…
Add table
Reference in a new issue