diff --git a/leaderboard/leaderboard.py b/leaderboard/leaderboard.py index 86d3a0d..aaeb978 100644 --- a/leaderboard/leaderboard.py +++ b/leaderboard/leaderboard.py @@ -169,15 +169,20 @@ class Leaderboard(commands.Cog): total_credits = 0 try: - # Get credits from the user's current server first - total_credits = await bank.get_balance(user) + # Get credits from the user's current server + try: + total_credits = await bank.get_balance(user) + except Exception as e: + log.error(f"Error getting balance for {user} in current guild: {e}") - # Then add credits from all other servers where they are a member + # Then add credits from all other servers for guild in self.bot.guilds: - if guild != user.guild and user in guild.members: # Skip current guild since we already got those credits + if guild.id != user.guild.id: # Skip current guild try: - guild_credits = await bank.get_balance(user, guild) - total_credits += guild_credits + member = guild.get_member(user.id) + if member: # If user is in this guild + guild_credits = await bank.get_balance(member) + total_credits += guild_credits except Exception as e: log.error(f"Error getting bank balance for {user} in {guild}: {e}") continue @@ -193,31 +198,36 @@ class Leaderboard(commands.Cog): min_credits = 10000 # Minimum credits to show on leaderboard - matches API's MIN_CREDITS # First get all unique members across all guilds - all_members = set() + processed_users = set() + + # Process each guild for guild in self.bot.guilds: for member in guild.members: - if not member.bot: - all_members.add(member) - - # Now get total credits for each unique member - for member in all_members: - # Skip opted-out users - if await self.config.user(member).opted_out(): - continue - - try: - total_credits = await self.get_user_credits(member) - - if total_credits >= min_credits: - all_users[member.id] = { - "userId": str(member.id), - "username": str(member), - "points": total_credits - } + if member.bot or member.id in processed_users: + continue - except Exception as e: - log.error(f"Error getting balance for {member}: {e}") - continue + # Skip opted-out users + try: + if await self.config.user(member).opted_out(): + continue + except Exception as e: + log.error(f"Error checking opt-out status for {member}: {e}") + continue + + try: + total_credits = await self.get_user_credits(member) + + if total_credits >= min_credits: + all_users[member.id] = { + "userId": str(member.id), + "username": str(member), + "points": total_credits + } + + processed_users.add(member.id) + except Exception as e: + log.error(f"Error getting balance for {member}: {e}") + continue # Sort by total credits sorted_users = sorted( @@ -226,6 +236,11 @@ class Leaderboard(commands.Cog): reverse=True ) + # Debug logging + log.info(f"Found {len(sorted_users)} users with {min_credits}+ credits") + for user in sorted_users[:10]: # Log top 10 for debugging + log.info(f"User {user['username']} has {user['points']} credits") + return sorted_users async def _try_api_update(self, user_id: str, username: str, credits: int) -> bool: @@ -393,6 +408,9 @@ class Leaderboard(commands.Cog): credits = await self.get_user_credits(member) + # Debug logging + log.info(f"Credits check for {member}: {credits} credits") + # Get user's rank leaderboard_data = await self.get_all_balances() rank = next( @@ -408,13 +426,13 @@ class Leaderboard(commands.Cog): if credits >= 10000: embed.description = ( - f"**User:** <@{member.id}>\n" + f"**User:** {member.mention}\n" f"**Credits:** {humanize_number(credits)}\n" f"**Rank:** #{humanize_number(rank) if rank else 'Unranked'}\n" f"**ID:** {member.id}" ) else: - embed.description = f"<@{member.id}> has less than 10,000 credits." + embed.description = f"{member.mention} has less than 10,000 credits ({humanize_number(credits)} total)" embed.set_thumbnail(url=member.display_avatar.url) await ctx.send(embed=embed)