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)