70 lines
No EOL
2.3 KiB
Python
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}** !") |