const { Pool } = require('pg'); require("dotenv/config"); const pool = new Pool({ user: process.env.DB_USER, password: process.env.DB_PASSWORD, host: process.env.DB_HOST, port: process.env.DB_PORT, database: process.env.DB_DATABASE, }); const getLevelSequence = async () => { try { const res = await pool.query('SELECT experience_required FROM xp_levels ORDER BY level ASC'); return res.rows.map(row => row.experience_required); } catch (error) { console.error('Erreur lors de la récupération de la suite logique des niveaux :', error); return null; } }; const getLevel = async (experience) => { const levelSequence = await getLevelSequence(); if (!levelSequence) { return 0; } let level = 0; while (level < levelSequence.length && experience >= levelSequence[level]) { level++; } return level; }; const getNextLevelXp = async (level) => { const levelSequence = await getLevelSequence(); if (!levelSequence) { return 50; // Valeur par défaut } if (level < levelSequence.length) { return levelSequence[level]; } // Si le niveau est supérieur à la dernière valeur de la séquence, retourner NaN return NaN; }; const getProgress = (experience, nextLevelXp) => { if (experience === 0 || isNaN(nextLevelXp)) { return 0; } return experience / nextLevelXp; }; const levelUp = async (userId, experienceToAdd) => { try { // Récupérer l'expérience actuelle du joueur const xpQuery = { text: 'SELECT xp FROM players WHERE id = $1', values: [userId], }; const xpResult = await pool.query(xpQuery); if (xpResult.rows.length === 0) { console.error('Joueur non trouvé.'); return; } const currentXP = xpResult.rows[0].xp; // Ajouter l'expérience const updatedXP = currentXP + experienceToAdd; // Récupérer le niveau actuel const currentLevel = await getLevel(currentXP); // Récupérer le nouveau niveau en fonction de la nouvelle expérience const newLevel = await getLevel(updatedXP); // Mettre à jour l'expérience et le niveau dans la table "players" const updateQuery = { text: 'UPDATE players SET xp = $1, level = $2 WHERE id = $3', values: [updatedXP, newLevel, userId], }; await pool.query(updateQuery); // Réinitialiser l'expérience si le joueur a monté de niveau if (newLevel > currentLevel) { const nextLevelXP = await getNextLevelXp(newLevel); const resetXPQuery = { text: 'UPDATE players SET xp = 0 WHERE id = $1', values: [userId], }; await pool.query(resetXPQuery); console.log(`Expérience réinitialisée pour l'utilisateur ${userId}.`); } console.log(`Expérience ajoutée à l'utilisateur ${userId}. Nouveau niveau : ${newLevel}`); } catch (error) { console.error('Erreur lors de la montée de niveau :', error); } }; module.exports = { getLevel, getNextLevelXp, getProgress, levelUp };