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} !")