From 258ba40f011b9c1e87cf0b6a14145aed6362513b Mon Sep 17 00:00:00 2001 From: Valerie Date: Mon, 26 May 2025 06:13:10 -0400 Subject: [PATCH] Refactor logging and user credit checks in Leaderboard cog to enhance clarity and user experience. Update log messages for credit retrieval and leaderboard display, ensuring accurate communication of user statuses. Improve embed descriptions for better user feedback on credit standings. --- leaderboard/leaderboard.py | 52 ++++++++++++++++++++------------------ 1 file changed, 28 insertions(+), 24 deletions(-) diff --git a/leaderboard/leaderboard.py b/leaderboard/leaderboard.py index b0f8818..3238e79 100644 --- a/leaderboard/leaderboard.py +++ b/leaderboard/leaderboard.py @@ -211,10 +211,9 @@ class Leaderboard(commands.Cog): async def get_user_credits(self, user: discord.Member) -> int: """Get a user's total credits from all servers.""" try: - # Use Red's bank API to get the user's balance - # This automatically handles the global bank if enabled + # Get the user's balance balance = await bank.get_balance(user) - log.debug(f"Got balance for {user} ({user.id}): {balance} credits") + log.info(f"Credit check for {user} ({user.id}): {balance} credits") return balance except Exception as e: log.error(f"Error getting credits for {user}: {e}") @@ -226,8 +225,11 @@ class Leaderboard(commands.Cog): min_credits = 10000 # Minimum credits to show on leaderboard - matches API's MIN_CREDITS processed_users = set() + log.info("Starting to collect user balances...") + # Process each guild for guild in self.bot.guilds: + log.debug(f"Processing guild: {guild.name} ({guild.id})") for member in guild.members: if member.bot or member.id in processed_users: continue @@ -235,6 +237,7 @@ class Leaderboard(commands.Cog): # Skip opted-out users try: if await self.config.user(member).opted_out(): + log.debug(f"User {member} ({member.id}) is opted out") continue except Exception as e: log.error(f"Error checking opt-out status for {member}: {e}") @@ -244,36 +247,32 @@ class Leaderboard(commands.Cog): credits = await self.get_user_credits(member) # Debug logging for credit calculation - log.debug(f"Checking credits for {member} ({member.id}): {credits} credits, minimum: {min_credits}") + log.info(f"User {member} ({member.id}) has {credits} credits (minimum: {min_credits})") - # Store user data regardless of credits amount - all_users[member.id] = { - "userId": str(member.id), - "username": str(member), - "points": credits - } + if credits >= min_credits: + all_users[member.id] = { + "userId": str(member.id), + "username": str(member), + "points": credits + } + log.info(f"Added {member} to leaderboard with {credits} credits") processed_users.add(member.id) except Exception as e: log.error(f"Error getting balance for {member}: {e}") continue - # Filter and sort users after collecting all data - qualified_users = [ - user for user in all_users.values() - if user["points"] >= min_credits - ] - + # Sort by total credits sorted_users = sorted( - qualified_users, + all_users.values(), key=lambda x: x["points"], reverse=True ) # Debug logging - log.info(f"Found {len(all_users)} total users, {len(sorted_users)} with {min_credits}+ credits") + log.info(f"Found {len(all_users)} users with {min_credits}+ credits") if sorted_users: - log.info("Top 10 users:") + log.info("Top users on leaderboard:") for user in sorted_users[:10]: log.info(f"User {user['username']} ({user['userId']}) has {user['points']} credits") else: @@ -359,19 +358,21 @@ class Leaderboard(commands.Cog): async def show_leaderboard(self, ctx: commands.Context, page: int = 1): """Show the global credits leaderboard.""" async with ctx.typing(): + log.info(f"Leaderboard requested in guild {ctx.guild.name} ({ctx.guild.id})") leaderboard_data = await self.get_all_balances() if not leaderboard_data: # Debug info in log - log.warning(f"No leaderboard data returned for guild {ctx.guild.id}") - return await ctx.send("No users have 10,000 or more credits!") + log.warning(f"No users with 10,000+ credits found in guild {ctx.guild.id}") + await ctx.send("No users have 10,000 or more credits! Check your balance with `[p]glb credits`") + return items_per_page = 10 chunks = [leaderboard_data[i:i + items_per_page] for i in range(0, len(leaderboard_data), items_per_page)] if not chunks: - return await ctx.send("No users have 10,000 or more credits!") + return await ctx.send("No users have 10,000 or more credits! Check your balance with `[p]glb credits`") embeds = [] for page_num, entries in enumerate(chunks, 1): @@ -452,7 +453,7 @@ class Leaderboard(commands.Cog): credits = await self.get_user_credits(member) # Debug logging - log.info(f"Credits check for {member} ({member.id}): {credits} credits") + log.info(f"Credits command used - User {member} ({member.id}) has {credits} credits") # Get user's rank leaderboard_data = await self.get_all_balances() @@ -475,7 +476,10 @@ class Leaderboard(commands.Cog): f"**ID:** {member.id}" ) else: - embed.description = f"{member.mention} has less than 10,000 credits ({humanize_number(credits)} total)" + embed.description = ( + f"{member.mention} has **{humanize_number(credits)}** credits\n" + f"*Need {humanize_number(10000 - credits)} more credits to appear on the leaderboard*" + ) embed.set_thumbnail(url=member.display_avatar.url) await ctx.send(embed=embed)