Refactor logging and user credit checks in Leaderboard cog to enhance clarity and user experience. Update log messages for credit retrieval and leaderboard display, ensuring accurate communication of user statuses. Improve embed descriptions for better user feedback on credit standings.
Some checks are pending
Run pre-commit / Run pre-commit (push) Waiting to run

This commit is contained in:
Valerie 2025-05-26 06:13:10 -04:00
parent deaa1aabb8
commit 258ba40f01

View file

@ -211,10 +211,9 @@ class Leaderboard(commands.Cog):
async def get_user_credits(self, user: discord.Member) -> int:
"""Get a user's total credits from all servers."""
try:
# Use Red's bank API to get the user's balance
# This automatically handles the global bank if enabled
# Get the user's balance
balance = await bank.get_balance(user)
log.debug(f"Got balance for {user} ({user.id}): {balance} credits")
log.info(f"Credit check for {user} ({user.id}): {balance} credits")
return balance
except Exception as e:
log.error(f"Error getting credits for {user}: {e}")
@ -226,8 +225,11 @@ class Leaderboard(commands.Cog):
min_credits = 10000 # Minimum credits to show on leaderboard - matches API's MIN_CREDITS
processed_users = set()
log.info("Starting to collect user balances...")
# Process each guild
for guild in self.bot.guilds:
log.debug(f"Processing guild: {guild.name} ({guild.id})")
for member in guild.members:
if member.bot or member.id in processed_users:
continue
@ -235,6 +237,7 @@ class Leaderboard(commands.Cog):
# Skip opted-out users
try:
if await self.config.user(member).opted_out():
log.debug(f"User {member} ({member.id}) is opted out")
continue
except Exception as e:
log.error(f"Error checking opt-out status for {member}: {e}")
@ -244,36 +247,32 @@ class Leaderboard(commands.Cog):
credits = await self.get_user_credits(member)
# Debug logging for credit calculation
log.debug(f"Checking credits for {member} ({member.id}): {credits} credits, minimum: {min_credits}")
log.info(f"User {member} ({member.id}) has {credits} credits (minimum: {min_credits})")
# Store user data regardless of credits amount
all_users[member.id] = {
"userId": str(member.id),
"username": str(member),
"points": credits
}
if credits >= min_credits:
all_users[member.id] = {
"userId": str(member.id),
"username": str(member),
"points": credits
}
log.info(f"Added {member} to leaderboard with {credits} credits")
processed_users.add(member.id)
except Exception as e:
log.error(f"Error getting balance for {member}: {e}")
continue
# Filter and sort users after collecting all data
qualified_users = [
user for user in all_users.values()
if user["points"] >= min_credits
]
# Sort by total credits
sorted_users = sorted(
qualified_users,
all_users.values(),
key=lambda x: x["points"],
reverse=True
)
# Debug logging
log.info(f"Found {len(all_users)} total users, {len(sorted_users)} with {min_credits}+ credits")
log.info(f"Found {len(all_users)} users with {min_credits}+ credits")
if sorted_users:
log.info("Top 10 users:")
log.info("Top users on leaderboard:")
for user in sorted_users[:10]:
log.info(f"User {user['username']} ({user['userId']}) has {user['points']} credits")
else:
@ -359,19 +358,21 @@ class Leaderboard(commands.Cog):
async def show_leaderboard(self, ctx: commands.Context, page: int = 1):
"""Show the global credits leaderboard."""
async with ctx.typing():
log.info(f"Leaderboard requested in guild {ctx.guild.name} ({ctx.guild.id})")
leaderboard_data = await self.get_all_balances()
if not leaderboard_data:
# Debug info in log
log.warning(f"No leaderboard data returned for guild {ctx.guild.id}")
return await ctx.send("No users have 10,000 or more credits!")
log.warning(f"No users with 10,000+ credits found in guild {ctx.guild.id}")
await ctx.send("No users have 10,000 or more credits! Check your balance with `[p]glb credits`")
return
items_per_page = 10
chunks = [leaderboard_data[i:i + items_per_page]
for i in range(0, len(leaderboard_data), items_per_page)]
if not chunks:
return await ctx.send("No users have 10,000 or more credits!")
return await ctx.send("No users have 10,000 or more credits! Check your balance with `[p]glb credits`")
embeds = []
for page_num, entries in enumerate(chunks, 1):
@ -452,7 +453,7 @@ class Leaderboard(commands.Cog):
credits = await self.get_user_credits(member)
# Debug logging
log.info(f"Credits check for {member} ({member.id}): {credits} credits")
log.info(f"Credits command used - User {member} ({member.id}) has {credits} credits")
# Get user's rank
leaderboard_data = await self.get_all_balances()
@ -475,7 +476,10 @@ class Leaderboard(commands.Cog):
f"**ID:** {member.id}"
)
else:
embed.description = f"{member.mention} has less than 10,000 credits ({humanize_number(credits)} total)"
embed.description = (
f"{member.mention} has **{humanize_number(credits)}** credits\n"
f"*Need {humanize_number(10000 - credits)} more credits to appear on the leaderboard*"
)
embed.set_thumbnail(url=member.display_avatar.url)
await ctx.send(embed=embed)