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