From 3794068ae5c76cd7e22ab91f2c4b2767257095c3 Mon Sep 17 00:00:00 2001 From: Valerie Date: Mon, 26 May 2025 09:59:16 -0400 Subject: [PATCH] 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. --- leaderboard/leaderboard.py | 72 ++++++++++++++++++++------------------ 1 file changed, 37 insertions(+), 35 deletions(-) diff --git a/leaderboard/leaderboard.py b/leaderboard/leaderboard.py index 77cfffb..a216c12 100644 --- a/leaderboard/leaderboard.py +++ b/leaderboard/leaderboard.py @@ -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)}")