1
Fork 0
mirror of https://github.com/wlinator/luminara.git synced 2024-10-02 20:23:12 +00:00

Update XP to have levels per server

This commit is contained in:
wlinator 2024-03-15 23:44:27 +01:00
parent 4b5a84e590
commit 7ea6761d07
5 changed files with 50 additions and 65 deletions

View file

@ -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 = {

View file

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

View file

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

View file

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

View file

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