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
Some checks are pending
Run pre-commit / Run pre-commit (push) Waiting to run
This commit is contained in:
parent
02d67baeef
commit
9b8d4be301
1 changed files with 48 additions and 30 deletions
|
@ -169,15 +169,20 @@ class Leaderboard(commands.Cog):
|
||||||
total_credits = 0
|
total_credits = 0
|
||||||
|
|
||||||
try:
|
try:
|
||||||
# Get credits from the user's current server first
|
# Get credits from the user's current server
|
||||||
total_credits = await bank.get_balance(user)
|
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:
|
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:
|
try:
|
||||||
guild_credits = await bank.get_balance(user, guild)
|
member = guild.get_member(user.id)
|
||||||
total_credits += guild_credits
|
if member: # If user is in this guild
|
||||||
|
guild_credits = await bank.get_balance(member)
|
||||||
|
total_credits += guild_credits
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
log.error(f"Error getting bank balance for {user} in {guild}: {e}")
|
log.error(f"Error getting bank balance for {user} in {guild}: {e}")
|
||||||
continue
|
continue
|
||||||
|
@ -193,31 +198,36 @@ class Leaderboard(commands.Cog):
|
||||||
min_credits = 10000 # Minimum credits to show on leaderboard - matches API's MIN_CREDITS
|
min_credits = 10000 # Minimum credits to show on leaderboard - matches API's MIN_CREDITS
|
||||||
|
|
||||||
# First get all unique members across all guilds
|
# First get all unique members across all guilds
|
||||||
all_members = set()
|
processed_users = set()
|
||||||
|
|
||||||
|
# Process each guild
|
||||||
for guild in self.bot.guilds:
|
for guild in self.bot.guilds:
|
||||||
for member in guild.members:
|
for member in guild.members:
|
||||||
if not member.bot:
|
if member.bot or member.id in processed_users:
|
||||||
all_members.add(member)
|
continue
|
||||||
|
|
||||||
# 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
|
|
||||||
}
|
|
||||||
|
|
||||||
except Exception as e:
|
# Skip opted-out users
|
||||||
log.error(f"Error getting balance for {member}: {e}")
|
try:
|
||||||
continue
|
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
|
# Sort by total credits
|
||||||
sorted_users = sorted(
|
sorted_users = sorted(
|
||||||
|
@ -226,6 +236,11 @@ class Leaderboard(commands.Cog):
|
||||||
reverse=True
|
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
|
return sorted_users
|
||||||
|
|
||||||
async def _try_api_update(self, user_id: str, username: str, credits: int) -> bool:
|
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)
|
credits = await self.get_user_credits(member)
|
||||||
|
|
||||||
|
# Debug logging
|
||||||
|
log.info(f"Credits check for {member}: {credits} credits")
|
||||||
|
|
||||||
# Get user's rank
|
# Get user's rank
|
||||||
leaderboard_data = await self.get_all_balances()
|
leaderboard_data = await self.get_all_balances()
|
||||||
rank = next(
|
rank = next(
|
||||||
|
@ -408,13 +426,13 @@ class Leaderboard(commands.Cog):
|
||||||
|
|
||||||
if credits >= 10000:
|
if credits >= 10000:
|
||||||
embed.description = (
|
embed.description = (
|
||||||
f"**User:** <@{member.id}>\n"
|
f"**User:** {member.mention}\n"
|
||||||
f"**Credits:** {humanize_number(credits)}\n"
|
f"**Credits:** {humanize_number(credits)}\n"
|
||||||
f"**Rank:** #{humanize_number(rank) if rank else 'Unranked'}\n"
|
f"**Rank:** #{humanize_number(rank) if rank else 'Unranked'}\n"
|
||||||
f"**ID:** {member.id}"
|
f"**ID:** {member.id}"
|
||||||
)
|
)
|
||||||
else:
|
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)
|
embed.set_thumbnail(url=member.display_avatar.url)
|
||||||
await ctx.send(embed=embed)
|
await ctx.send(embed=embed)
|
||||||
|
|
Loading…
Add table
Reference in a new issue