partirdezero/discord_integration/core/level_logic.py

70 lines
No EOL
2.3 KiB
Python

from datetime import datetime, timezone
from asgiref.sync import sync_to_async
import discord
from datetime import datetime
from discord_integration.models import DiscordLevel
from enums import XP, RANK
from discord import app_commands
def get_user(id_discord):
user, created = DiscordLevel.objects.get_or_create(discord_id=id_discord)
return user, created
def update_user_xp(user, xp_to_add):
leveled_up = False
# 1. Mise à jour de l'XP et du temps
user.total_xp += xp_to_add
user.last_message = datetime.now(timezone.utc)
# 2. Calcul du niveau théorique
calculated_level = int(0.5 + (0.25 + user.total_xp / 50)**0.5)
# 3. Vérification du Level Up
if calculated_level > user.level:
user.level = calculated_level
leveled_up = True
new_rank = RANK[1]
for level_threshold, rank_name in RANK.items():
if user.level >= level_threshold:
new_rank = rank_name
else:
break
user.rank = new_rank
user.save()
return user, leveled_up
async def check_add_xp(message, client):
id_discord = message.author.id
username = message.author.name
user_db, created = await sync_to_async(get_user)(id_discord)
if not created and user_db.last_message:
delta = datetime.now(timezone.utc) - user_db.last_message
if delta.seconds < 6:
return
user_db, leveled_up = await sync_to_async(update_user_xp)(user_db, XP["MESSAGE"])
if leveled_up:
# On crée un petit message sympa
await message.channel.send(
f"🎊 **LEVEL UP** 🎊\nBravo {message.author.mention}, tu passes **niveau {user_db.level}** ! "
f"On applaudit tous bien fort ! Clap Clap !!"
)
else:
# Juste un petit log console pour toi
print(f"✨ XP ajouté pour {message.author.name} (Total: {user_db.total_xp})")
# AJOUT DES COMMANDES /xp et /level
@app_commands.command(name="level", description="Permet de connaitre ton xp actuel")
async def get_xp(interaction: discord.Interaction):
user_id = interaction.user.id
user_db, _ = await sync_to_async(get_user)(user_id)
await interaction.response.send_message(f"{interaction.user.mention} : Tu as {user_db.total_xp} XP et tu es niveau {user_db.level} !\nTon rang est **{user_db.rank}** !")