mirror of
https://github.com/wlinator/luminara.git
synced 2024-10-02 22:23:13 +00:00
Update XP to have levels per server
This commit is contained in:
parent
4b5a84e590
commit
7ea6761d07
5 changed files with 50 additions and 65 deletions
|
@ -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 = {
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
Loading…
Reference in a new issue