#confused xp systeme ?
13 messages · Page 1 of 1 (latest)
this is my updateXp.js
const Level = require('./level');
const getRandomXPGain = () => {
const minXP = 1;
const maxXP = 20;
const xpGain = Math.floor(Math.random() * (maxXP - minXP + 1)) + minXP;
return xpGain;
};
const updateRank = async (user) => {
if (user.level >= 1 && user.level <= 9) {
user.rank = '1145704810138566708'; // Common role ID
} else if (user.level >= 10 && user.level <= 29) {
user.rank = '1145704879520751687'; // Uncommon role ID
} else if (user.level >= 30 && user.level <= 49) {
user.rank = '1145704961699741748'; // Rare role ID
} else if (user.level >= 50 && user.level <= 69) {
user.rank = '1145705017886654534'; // Epic role ID
} else if (user.level >= 70 && user.level <= 89) {
user.rank = '1145705048882552982'; // Legendary role ID
} else if (user.level >= 90 && user.level <= 99) {
user.rank = '1145705091697999925'; // Mythical role ID
} else if (user.level === 100) {
user.rank = '1145704879520751687'; // Divine role ID
}
await user.save();
};```
const updateUserXPInDatabase = async (userId, message, client) => {
try {
const xpGain = getRandomXPGain();
const user = await Level.findOne({ where: { userId } });
if (user) {
console.log(`Updating user: ${user.userId}`);
console.log(`XP gain: ${xpGain}`);
console.log(`Previous XP: ${user.xp}`);
user.xp += xpGain;
console.log(`New XP after gain: ${user.xp}`);
const prevLevel = user.level;
if (user.level >= 1 && user.level <= 9) {
user.level = Math.floor(user.xp / 111) + 1;
console.log(`New level after level 1-9: ${user.level}`);
} else if (user.level >= 10 && user.level <= 29) { // Uncommon
user.level = Math.floor(user.xp + xpGain/ 1111) + 10;
console.log(`New level after level 10 - 29: ${user.level}`);
} else if (user.level >= 30 && user.level <= 49) { // Rare
user.level = Math.floor(user.xp / 11111) + 30;
console.log(`New level after level 30 - 49: ${user.level}`);
} else if (user.level >= 50 && user.level <= 69) { // Epic
user.level = Math.floor(user.xp / 27777) + 50;
console.log(`New level after level 50 - 69: ${user.level}`);
} else if (user.level >= 70 && user.level <= 89) { // Legendary
user.level = Math.floor(user.xp / 55555) + 70;
console.log(`New level after level 70 - 89: ${user.level}`);
} else if (user.level >= 90 && user.level <= 99) { // Mythical
user.level = Math.floor(user.xp / 111111) + 90;
console.log(`New level after level 90 - 99: ${user.level}`);
} else if (user.level === 100) { // Divine
user.level = 100;
}
if (user.level > prevLevel) {
const xpRequiredForPrevLevel = getXPRequiredForLevel(prevLevel);
user.xp -= xpRequiredForPrevLevel; // Deduct XP after leveling up
console.log(`XP deducted after leveling up: ${user.xp}`);
await updateRank(user);
console.log(`Updated rank: ${user.rank}`);
const roleId = user.rank;
const role = await message.guild.roles.fetch(roleId);
if (role) {
const roleName = role.name;
await user.save();
console.log(`User saved after rank update`);
const congratsMessage = `Congratulations! You are now ${roleName} tier !`;
const member = await client.guilds.cache.get(user.guildId)?.members.fetch(user.userId);
if (member) {
member.send(congratsMessage).catch(console.error);
console.log(`Congratulation message sent`);
}
} else {
console.error(`Role with ID ${roleId} not found.`);
}
} else {
await user.save();
}
}
} catch (error) {
console.error('Error updating user XP:', error);
}
};
const getXPRequiredForLevel = (level) => {
if (level >= 1 && level <= 9) {
return 111;
} else if (level >= 10 && level <= 29) {
return 1111;
} else if (level >= 30 && level <= 49) {
return 11111;
} else if (level >= 50 && level <= 69) {
return 27777;
} else if (level >= 70 && level <= 89) {
return 55555;
} else if (level >= 90 && level <= 99) {
return 111111;
} else if (level === 100) {
return 0;
}
};
module.exports = {
updateUserXPInDatabase
};```
Let me be blunt: that code looks cursed and has way too many places that could be improved. Instead of hardcoding the same numbers several times in several places make one function that gets passed XP and returns the level for that amount of XP and use that everywhere.
Your issue you have atm is because in one of your various similar else if you do user.xp + xpGain/1111 which only divides the xpGain but not the user.xp (and thus results in a way wrong result).
okay i organised thi cursed code
const Level = require('./level');
const rankInfo = [
{ range: [1, 9], rank: '1145704810138566708', xpRequired: 111 }, // Common
{ range: [10, 29], rank: '1145704879520751687', xpRequired: 1111 }, // Uncommon
{ range: [30, 49], rank: '1145704961699741748', xpRequired: 11111 }, // Rare
{ range: [50, 69], rank: '1145705017886654534', xpRequired: 27777 }, // Epic
{ range: [70, 89], rank: '1145705048882552982', xpRequired: 55555 }, // Legendary
{ range: [90, 99], rank: '1145705091697999925', xpRequired: 111111 }, // Mythical
{ range: [100, 100], rank: '1145704879520751687', xpRequired: 0 } // Divine
];
const getRandomXPGain = () => {
return Math.floor(Math.random() * 20) + 1;
};
const getRankForLevel = (level) => {
return rankInfo.find(rank => level >= rank.range[0] && level <= rank.range[1]);
};
const updateRank = async (user) => {
const rank = getRankForLevel(user.level);
if (rank) {
user.rank = rank.rank;
await user.save();
}
};
const updateUserXPInDatabase = async (userId, message, client) => {
try {
const xpGain = getRandomXPGain();
const user = await Level.findOne({ where: { userId } });
if (user) {
const prevXP = user.xp;
const prevLevel = user.level;
const prevRank = getRankForLevel(prevLevel);
user.xp += xpGain;
const newLevel = prevRank.range[0] + Math.floor(user.xp / prevRank.xpRequired);
const newRank = getRankForLevel(newLevel);
const newXpRequired = newRank.xpRequired;
if (user.xp >= newXpRequired) {
user.xp -= newXpRequired;
user.level = newLevel;
await updateRank(user);
const roleId = newRank.rank;
const role = await message.guild.roles.fetch(roleId);
if (role) {
const member = await client.guilds.cache.get(user.guildId)?.members.fetch(user.userId);
if (member) {
member.roles.add(roleId).catch(console.error);
const congratsMessage = `Congratulations! You are now ${role.name} tier!`;
const lastChannel = await member.lastMessageChannel;
if (lastChannel) {
lastChannel.send(congratsMessage).catch(console.error);
}
}
} else {
console.error(`Role with ID ${roleId} not found.`);
}
}
await user.save();
console.log(`User: ${user.userId}`);
console.log(`Previous XP: ${prevXP}`);
console.log(`Previous Level: ${prevLevel}`);
console.log(`Previous Rank: ${prevRank.rank}`);
console.log(`XP Gain: ${xpGain}`);
console.log(`New XP: ${user.xp}`);
console.log(`New Level: ${user.level}`);
console.log(`New Rank: ${newRank.rank}`);
}
} catch (error) {
console.error('Error updating user XP:', error);
}
};
module.exports = {
updateUserXPInDatabase
};
but unfortunately i still have the probleme
where did i messed up ?