diff --git a/handlers/XPHandler.py b/handlers/XPHandler.py index 206c6bb..dba5a77 100644 --- a/handlers/XPHandler.py +++ b/handlers/XPHandler.py @@ -54,13 +54,9 @@ class XPHandler: async def process_xp(self, message): - if message.channel.id == 746796138195058788 or message.channel.id == 814590778650263604: - logs.debug(f"[XpHandler] {message.author.name} sent a message in a xp-blacklisted channel.") - return - current_time = time.time() user_id = message.author.id - xp = Xp(user_id) + xp = Xp(user_id, message.guild.id) if xp.ctime and current_time < xp.ctime: logs.debug(f"[XpHandler] {message.author.name} sent a message but is on XP cooldown.") @@ -99,11 +95,6 @@ class XPHandler: xp.ctime = current_time + xp.new_cooldown xp.push() - """ - Level calculation - Linear = 9x + 27 - """ - @staticmethod async def assign_level_role(user, level): level_roles = { diff --git a/lib/embeds.py b/lib/embeds.py index 736d386..19ffe11 100644 --- a/lib/embeds.py +++ b/lib/embeds.py @@ -121,12 +121,3 @@ def final_confirmation(channel_id): description=f"<#{channel_id}>") return embed - - -def level_command_message(ctx, level, xp, next_level_xp, rank): - embed = discord.Embed(color=0xadcca6, - title=f"{ctx.author.name} - lv. {level}") - embed.add_field(name="Progress to Next Level", value=Xp.generate_progress_bar(xp, next_level_xp), inline=False) - embed.set_footer(text=f"The Rave Cave | Server Rank: #{rank}") - embed.set_thumbnail(url=ctx.author.avatar.url) - return embed diff --git a/modules/leaderboard.py b/modules/leaderboard.py index 3216be6..31fce19 100644 --- a/modules/leaderboard.py +++ b/modules/leaderboard.py @@ -33,7 +33,7 @@ class LeaderboardV2Cog(commands.Cog): Leaderboard command with a dropdown menu. :param ctx: """ - xp_lb = Xp.load_leaderboard() + xp_lb = Xp.load_leaderboard(ctx.guild.id) options = LeaderboardCommandOptions() view = LeaderboardCommandView(ctx, options) @@ -47,22 +47,22 @@ class LeaderboardV2Cog(commands.Cog): embed.set_author(name="Level Leaderboard", icon_url=icon) embed.set_thumbnail(url="https://i.imgur.com/79XfsbS.png") - value = "" - for i, (user_id, xp, level, rank, xp_needed_for_next_level) in enumerate(xp_lb[:5], start=1): + rank = 1 + for i, (user_id, xp, level, xp_needed_for_next_level) in enumerate(xp_lb[:5], start=1): + try: member = await ctx.guild.fetch_member(user_id) - name = member.name - - except Exception as error: - name = "Unknown User" - logs.debug(f"Currency Leaderboard: Unknown User, {error}") + except discord.HTTPException: + continue # skip user if not in guild embed.add_field( - name=f"#{rank} - {name}", + name=f"#{rank} - {member.name}", value=f"level: **{level}**\nxp: `{xp}/{xp_needed_for_next_level}`", inline=False ) + rank += 1 + return await ctx.respond(embed=embed, view=view) @@ -82,7 +82,7 @@ class LeaderboardCommandOptions(discord.ui.Select): options=[ discord.SelectOption( label="Levels", - description="See the top Rave Cave chatters!", + description="See the top chatters of this server!", emoji="🆙", value="xp" ), @@ -94,7 +94,7 @@ class LeaderboardCommandOptions(discord.ui.Select): ), discord.SelectOption( label="Dailies", - description="See who has the biggest /daily streak!", + description="See who has the biggest streak!", value="dailies", emoji="📅" ) @@ -120,7 +120,7 @@ class LeaderboardCommandView(discord.ui.View): async def on_timeout(self): await self.message.edit(view=None) - #logs.info(f"[CommandHandler] /leaderboard command timed out - this is normal behavior.") + # logs.info(f"[CommandHandler] /leaderboard command timed out - this is normal behavior.") self.stop() async def interaction_check(self, interaction) -> bool: @@ -139,26 +139,25 @@ class LeaderboardCommandView(discord.ui.View): icon = self.ctx.guild.icon if self.ctx.guild.icon else "https://i.imgur.com/79XfsbS.png" if interaction.data["values"][0] == "xp": - xp_lb = Xp.load_leaderboard() + xp_lb = Xp.load_leaderboard(self.ctx.guild.id) embed.set_author(name="Level Leaderboard", icon_url=icon) embed.set_thumbnail(url="https://i.imgur.com/79XfsbS.png") - value = "" - for i, (user_id, xp, level, rank, xp_needed_for_next_level) in enumerate(xp_lb[:5], start=1): + rank = 1 + for i, (user_id, xp, level, xp_needed_for_next_level) in enumerate(xp_lb[:5], start=1): try: member = await self.ctx.guild.fetch_member(user_id) - name = member.name - - except Exception as error: - name = "Unknown User" - logs.debug(f"Currency Leaderboard: Unknown User, {error}") + except discord.HTTPException: + continue # skip user if not in guild embed.add_field( - name=f"#{rank} - {name}", + name=f"#{rank} - {member.name}", value=f"level: **{level}**\nxp: `{xp}/{xp_needed_for_next_level}`", inline=False ) + rank += 1 + await interaction.response.edit_message(embed=embed) elif interaction.data["values"][0] == "currency": @@ -166,15 +165,14 @@ class LeaderboardCommandView(discord.ui.View): embed.set_author(name="Currency Leaderboard", icon_url=icon) embed.set_thumbnail(url="https://i.imgur.com/wFsgSnr.png") - value = "" for i, (user_id, balance, rank) in enumerate(cash_lb[:5], start=1): + try: member = await self.ctx.guild.fetch_member(user_id) - name = member.name + except discord.HTTPException: + member = None - except Exception as error: - name = "Unknown User" - logs.debug(f"Currency Leaderboard: Unknown User, {error}") + name = member.name if member else str(user_id) embed.add_field( name=f"#{rank} - {name}", @@ -190,13 +188,13 @@ class LeaderboardCommandView(discord.ui.View): embed.set_thumbnail(url="https://i.imgur.com/hSauh7K.png") for i, (user_id, streak, claimed_at, rank) in enumerate(daily_lb[:5], start=1): + try: member = await self.ctx.guild.fetch_member(user_id) - name = member.name + except discord.HTTPException: + member = None - except Exception as error: - name = "Unknown User" - logs.debug(f"Currency Leaderboard: Unknown User, {error}") + name = member.name if member else user_id claimed_at = datetime.fromisoformat(claimed_at) claimed_at = claimed_at.date() diff --git a/modules/level.py b/modules/level.py index 842c6ea..a5a0702 100644 --- a/modules/level.py +++ b/modules/level.py @@ -1,3 +1,4 @@ +import discord from discord.ext import commands from services.Xp import Xp @@ -10,17 +11,24 @@ class LevelCog(commands.Cog): @commands.slash_command( name="level", - description="Displays your level and rank.", + description="Displays your level and server rank.", guild_only=True ) @commands.check(checks.channel) async def level(self, ctx): - xp_data = Xp(ctx.author.id) + xp_data = Xp(ctx.author.id, ctx.guild.id) rank = xp_data.calculate_rank() needed_xp_for_next_level = Xp.xp_needed_for_next_level(xp_data.level) - await ctx.respond(embed=embeds.level_command_message(ctx, xp_data.level, xp_data.xp, - needed_xp_for_next_level, rank)) + embed = discord.Embed(color=0xadcca6, + title=f"Level {xp_data.level}") + embed.add_field(name=f"Progress to next level", + value=Xp.generate_progress_bar(xp_data.xp, needed_xp_for_next_level), inline=False) + + embed.set_footer(text=f"Server Rank: #{rank}") + embed.set_thumbnail(url=ctx.author.display_avatar) + + await ctx.respond(embed=embed, content=ctx.author.mention) def setup(client): diff --git a/services/Xp.py b/services/Xp.py index 2ba0fcb..05c84d6 100644 --- a/services/Xp.py +++ b/services/Xp.py @@ -19,8 +19,8 @@ class Xp: def __init__(self, user_id, guild_id): self.user_id = user_id self.guild_id = guild_id - self.user_xp = None - self.user_level = None + self.xp = None + self.level = None self.ctime = None self.xp_gain = xp_gain_per_message self.new_cooldown = xp_gain_cooldown @@ -36,7 +36,7 @@ class Xp: SET user_xp = %s, user_level = %s, cooldown = %s WHERE user_id = %s AND guild_id = %s """ - database.execute_query(query, (self.user_xp, self.user_level, self.ctime, self.user_id, self.guild_id)) + database.execute_query(query, (self.xp, self.level, self.ctime, self.user_id, self.guild_id)) def fetch_or_create_xp(self): """ @@ -45,7 +45,7 @@ class Xp: query = "SELECT user_xp, user_level, cooldown FROM xp WHERE user_id = %s AND guild_id = %s" try: - (user_xp, user_level, cooldown) = database.select_query(query, (self.user_id,))[0] + (user_xp, user_level, cooldown) = database.select_query(query, (self.user_id, self.guild_id))[0] except (IndexError, TypeError): (user_xp, user_level, cooldown) = (None, None, None) @@ -57,8 +57,8 @@ class Xp: database.execute_query(query, (self.user_id, self.guild_id, time.time())) (user_xp, user_level, cooldown) = (0, 0, time.time()) - self.user_xp = user_xp - self.user_level = user_level + self.xp = user_xp + self.level = user_level self.ctime = cooldown def calculate_rank(self): @@ -99,21 +99,18 @@ class Xp: SELECT user_id, user_xp, user_level FROM xp WHERE guild_id = %s - ORDER BY user_xp DESC + ORDER BY user_level DESC, user_xp DESC """ data = database.select_query(query, (guild_id,)) leaderboard = [] - rank = 1 for row in data: row_user_id = row[0] user_xp = row[1] user_level = row[2] - # needed_xp_for_next_level = Xp.xp_needed_for_next_level(user_level) - needed_xp_for_next_level = -1 # NEEDS FIXING + needed_xp_for_next_level = Xp.xp_needed_for_next_level(user_level) - leaderboard.append((row_user_id, user_xp, user_level, rank, needed_xp_for_next_level)) - rank += 1 + leaderboard.append((row_user_id, user_xp, user_level, needed_xp_for_next_level)) return leaderboard