Refactor user credit retrieval logic in Leaderboard cog to improve error handling and processing efficiency. Implement additional logging for debugging, ensuring accurate balance aggregation across multiple servers while skipping opted-out users. Update embed descriptions for clarity in credit 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:58:09 -04:00
parent 02d67baeef
commit 9b8d4be301

View file

@ -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)