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.
Some checks are pending
Run pre-commit / Run pre-commit (push) Waiting to run

This commit is contained in:
Valerie 2025-05-26 05:03:39 -04:00
parent 51320a8ed8
commit 18d38ac395

View file

@ -106,33 +106,43 @@ class Leaderboard(commands.Cog):
async def get_user_credits(self, user: discord.Member) -> int: async def get_user_credits(self, user: discord.Member) -> int:
"""Get a user's total credits from Red's bank system.""" """Get a user's total credits from Red's bank system."""
try: try:
credits = await bank.get_balance(user) # For per-server banks, get the balance from the user's current guild
return credits return await bank.get_balance(user, guild=user.guild)
except Exception as e: except Exception as e:
log.error(f"Error getting bank balance for {user}: {e}") log.error(f"Error getting bank balance for {user}: {e}")
return 0 return 0
async def get_all_balances(self) -> List[dict]: async def get_all_balances(self) -> List[dict]:
"""Get all users' credit balances.""" """Get all users' credit balances across all servers."""
all_users = {} 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 guild in self.bot.guilds:
for member in guild.members: for member in guild.members:
if member.bot or member.id in all_users: if member.bot:
continue continue
credits = await self.get_user_credits(member) try:
if credits > 0: # Get balance for this guild
all_users[member.id] = { credits = await bank.get_balance(member, guild=guild)
"userId": str(member.id),
"username": str(member), if member.id not in all_users:
"points": credits 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( sorted_users = sorted(
all_users.values(), [user for user in all_users.values() if user["points"] > 0],
key=lambda x: x["points"], key=lambda x: x["points"],
reverse=True reverse=True
) )