From 18d38ac395bb75ebe58e89d60b8bcf9a5641573b Mon Sep 17 00:00:00 2001 From: Valerie Date: Mon, 26 May 2025 05:03:39 -0400 Subject: [PATCH] Enhance user credit retrieval in Leaderboard cog by updating balance fetching logic to support per-server banks. Improve error handling during balance retrieval and ensure accurate total credits are calculated across all guilds. Streamline the process of collecting and sorting user balances for leaderboard display. --- leaderboard/leaderboard.py | 38 ++++++++++++++++++++++++-------------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/leaderboard/leaderboard.py b/leaderboard/leaderboard.py index f0b701d..ad53830 100644 --- a/leaderboard/leaderboard.py +++ b/leaderboard/leaderboard.py @@ -106,33 +106,43 @@ class Leaderboard(commands.Cog): async def get_user_credits(self, user: discord.Member) -> int: """Get a user's total credits from Red's bank system.""" try: - credits = await bank.get_balance(user) - return credits + # For per-server banks, get the balance from the user's current guild + return await bank.get_balance(user, guild=user.guild) except Exception as e: log.error(f"Error getting bank balance for {user}: {e}") return 0 async def get_all_balances(self) -> List[dict]: - """Get all users' credit balances.""" + """Get all users' credit balances across all servers.""" all_users = {} - # Collect all unique members across guilds + # Collect all unique members and sum their balances across all guilds for guild in self.bot.guilds: for member in guild.members: - if member.bot or member.id in all_users: + if member.bot: continue - credits = await self.get_user_credits(member) - if credits > 0: - all_users[member.id] = { - "userId": str(member.id), - "username": str(member), - "points": credits - } + try: + # Get balance for this guild + credits = await bank.get_balance(member, guild=guild) + + if member.id not in all_users: + all_users[member.id] = { + "userId": str(member.id), + "username": str(member), + "points": credits + } + else: + # Add this guild's balance to user's total + all_users[member.id]["points"] += credits + + except Exception as e: + log.error(f"Error getting balance for {member} in {guild}: {e}") + continue - # Sort by credits and convert to list + # Filter out users with no credits and sort by total sorted_users = sorted( - all_users.values(), + [user for user in all_users.values() if user["points"] > 0], key=lambda x: x["points"], reverse=True )