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:
"""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
)