1
Fork 0
mirror of https://github.com/wlinator/luminara.git synced 2024-10-03 02:43:12 +00:00
Lumi/handlers/xp_handler.py

138 lines
4.5 KiB
Python
Raw Normal View History

2023-07-02 12:20:16 +00:00
import logging
2023-07-14 15:51:26 +00:00
import random
2023-06-29 11:21:17 +00:00
import time
2024-03-20 17:15:10 +00:00
import discord
2023-06-29 11:21:17 +00:00
from config.parser import JsonCache
2024-03-20 17:15:10 +00:00
from lib import formatter
from services.GuildConfig import GuildConfig
2024-04-03 16:06:03 +00:00
from services.level_reward import LevelReward
from services.Xp import Xp
2023-06-29 11:21:17 +00:00
strings = JsonCache.read_json("strings")
level_messages = JsonCache.read_json("levels")
2024-02-28 13:01:20 +00:00
logs = logging.getLogger('Racu.Core')
2023-07-12 19:37:21 +00:00
2024-03-20 17:15:10 +00:00
class XPHandler:
def __init__(self):
pass
2023-07-02 12:20:16 +00:00
2024-03-20 17:15:10 +00:00
async def process_xp(self, message):
2023-06-29 11:21:17 +00:00
2024-03-20 17:15:10 +00:00
level_config = Xp(message.author.id, message.guild.id)
guild_config = GuildConfig(message.guild.id)
current_time = time.time()
2023-07-15 15:33:58 +00:00
2024-03-20 17:15:10 +00:00
if level_config.ctime and current_time < level_config.ctime:
return # cooldown
2023-07-14 15:51:26 +00:00
2024-03-20 17:15:10 +00:00
# award ENV XP_GAIN_PER_MESSAGE
level_config.xp += level_config.xp_gain
2023-07-14 15:51:26 +00:00
2024-03-20 17:15:10 +00:00
# check if total XP now exceeds level req
xp_needed_for_new_level = Xp.xp_needed_for_next_level(level_config.level)
2023-07-14 15:51:26 +00:00
2024-03-20 17:15:10 +00:00
if level_config.xp >= xp_needed_for_new_level:
level_config.level += 1
level_config.xp = 0
2023-07-14 15:51:26 +00:00
2024-03-20 17:15:10 +00:00
level_message = await self.get_level_message(guild_config, level_config, message.author)
2023-07-14 15:51:26 +00:00
2024-03-20 17:15:10 +00:00
if level_message:
2023-06-29 11:21:17 +00:00
2024-03-20 17:15:10 +00:00
level_channel = await self.get_level_channel(message, guild_config)
2023-07-12 14:49:18 +00:00
2024-03-20 17:15:10 +00:00
if level_channel:
await level_channel.send(content=level_message)
else:
await message.reply(content=level_message)
2023-06-29 11:21:17 +00:00
2024-04-03 16:06:03 +00:00
await self.assign_level_role(message.guild, message.author, level_config.level)
2024-03-24 17:28:57 +00:00
logs.info(f"[XpHandler] {message.author.name} leveled up to lv {level_config.level} "
f"in guild {message.guild.name} ({message.guild.id}).")
2024-03-20 17:15:10 +00:00
else:
logs.info(f"[XpHandler] {message.author.name} gained {level_config.xp_gain} XP | "
2024-03-24 17:28:57 +00:00
f"lv {level_config.level} with {level_config.xp} XP. | "
f"guild: {message.guild.name} ({message.guild.id})")
2023-06-29 11:21:17 +00:00
2024-03-20 17:15:10 +00:00
level_config.ctime = current_time + level_config.new_cooldown
level_config.push()
2023-06-29 11:21:17 +00:00
2024-03-20 17:15:10 +00:00
@staticmethod
async def get_level_channel(message, guild_config):
if guild_config.level_channel_id:
2023-07-15 15:33:58 +00:00
try:
2024-03-20 17:15:10 +00:00
return message.guild.get_channel(guild_config.level_channel_id)
except discord.HTTPException:
pass # channel not found
2023-06-29 11:21:17 +00:00
2024-03-20 17:15:10 +00:00
return None
@staticmethod
async def get_level_message(guild_config, level_config, author):
match guild_config.level_message_type:
case 0:
level_message = None
case 1:
level_message = XPHandler.level_messages_whimsical(level_config.level, author)
case 2:
if not guild_config.level_message:
level_message = XPHandler.level_message_generic(level_config.level, author)
else:
2024-03-29 17:17:51 +00:00
level_message = formatter.template(guild_config.level_message, author.name, level_config.level)
2024-03-20 17:15:10 +00:00
case _:
raise Exception
return level_message
2023-06-29 11:21:17 +00:00
2024-03-20 17:15:10 +00:00
@staticmethod
def level_message_generic(level, author):
return strings["level_up"].format(author.name, level)
2023-06-29 11:21:17 +00:00
@staticmethod
2024-03-20 17:15:10 +00:00
def level_messages_whimsical(level, author):
"""
v2 of the level messages, randomized output from levels.en-US.JSON.
:param level:
:param author:
:return:
"""
level_range = None
for key in level_messages.keys():
start, end = map(int, key.split('-'))
if start <= level <= end:
level_range = key
break
if level_range is None:
# generic fallback
return XPHandler.level_message_generic(level, author)
message_list = level_messages[level_range]
random_message = random.choice(message_list)
start_string = strings["level_up_prefix"].format(author.name)
return start_string + random_message.format(level)
@staticmethod
2024-04-03 16:06:03 +00:00
async def assign_level_role(guild, user, level: int) -> None:
_rew = LevelReward(guild.id)
role_id = _rew.role(level)
reason = "Racu Role Rewards"
if role_id:
role = guild.get_role(role_id)
if role:
await user.add_roles(role, reason=reason)
previous = _rew.replace_previous_reward(level)
if previous[1]:
role = guild.get_role(previous[0])
if role:
await user.remove_roles(role, reason=reason)