【发布时间】:2021-11-13 20:25:24
【问题描述】:
我正在尝试为我的服务器配置一个练级系统,当管理员使用 >givexp 时为用户提供 XP,当用户达到新级别时发送消息,当管理员使用 >resetxp 时重置用户的 XP 和级别,并在使用 >level 时显示用户的等级和 XP(当前等级的当前 XP 超过 XP 到下一级)。
但是,用户在第一次获得 XP 时并没有获得 XP(如果我使用 >givexp @user#1234 50,然后使用 >givexp @user#1234 20,他们的总 XP 将为 20)。
在最后一次奖励后达到 100 XP 或以上的 0 级用户在获得更多 XP 之前不会获得 1 级。
givexp.js:
const Discord = require("discord.js");
const db = require("quick.db")
const adm = " "; //ids here
module.exports = {
name: "givexp"
}
module.exports.ex = async(message, args) => {
let { guild } = message;
const user = message.mentions.users.first();
if (message.author.id === adm) {
if (!user) {
message.channel.send(new Discord.MessageEmbed().setColor("D9B3FF").setTitle("Invalid Syntax").setDescription(`The format for [givexp] is \`>givexp @user#1234 [amount]\``));
} else {
// xp requirements for each level
const levels = {
0: 100,
1: 125,
2: 150,
3: 175,
4: 200,
5: 225
};
// total xp requirements
const xpreqs = {
0: 100,
1: 225,
2: 350,
3: 475,
4: 600,
5: 725
}
const giveAmount = args.slice(1).join(" ");
let xp = db.get(`xp_${message.guild.id}_${user.id}`);
let level = db.get(`level_${message.guild.id}_${user.id}`);
let totalxp = db.get(`totalxp_${message.guild.id}_${user.id}`);
if (xp === null) db.set(`xp_${message.guild.id}_${user.id}`, 0);
if (totalxp === null) db.set(`totalxp_${message.guild.id}_${user.id}`, 0);
if (level === null) db.set(`level_${message.guild.id}_${user.id}`, 0);
if (giveAmount) {
await db.add(`totalxp_${message.guild.id}_${user.id}`, parseInt(giveAmount));
user.send(new Discord.MessageEmbed().setColor("D9B3FF").setDescription(`You were awarded **${giveAmount}XP** by ${message.author.tag}`));
await message.channel.send(new Discord.MessageEmbed().setColor("D9B3FF").setDescription(`${user.tag} has been awarded **${giveAmount}XP** by ${message.author.tag}`));
console.log(`${message.author.tag} awarded ${user.tag} ${giveAmount}XP.`);
if (totalxp >= xpreqs[level]) {
await db.set(`xp_${message.guild.id}_${user.id}`, totalxp - xpreqs[level]);
await db.add(`level_${message.guild.id}_${user.id}`, 1);
level = db.get(`level_${message.guild.id}_${user.id}`);
await message.channel.send(new Discord.MessageEmbed().setColor("D9B3FF").setTitle("Level Up!").setDescription(`<@${user.id}> has reached Level ${level}!`))
} else if (totalxp < xpreqs[level]) {
await db.add(`xp_${message.guild.id}_${user.id}`, parseInt(giveAmount));
}
} else {
message.channel.send(new Discord.MessageEmbed().setColor("D9B3FF").setTitle("Invalid Syntax").setDescription(`The format for [givexp] is \`>givexp @user#1234 [amount]\``));
}
}
} else {
message.channel.send(new Discord.MessageEmbed().setColor("D9B3FF").setDescription(`<@${message.author.id}>, you do not have permission to give users XP.`));
}
};
level.js
const Discord = require("discord.js");
const db = require("quick.db")
module.exports = {
name: "level"
}
module.exports.ex = async(message, args) => {
let { guild } = message;
const user = message.mentions.members.first() || message.author;
const levels = {
0: 100,
1: 125,
2: 150,
3: 175,
4: 200,
5: 225
};
let xp = db.get(`xp_${message.guild.id}_${user.id}`);
let level = db.get(`level_${message.guild.id}_${user.id}`);
let xpreq = levels[level];
if (xp === null) {
xp = 0;
}
if (level === null) {
level = 0;
}
message.channel.send(new Discord.MessageEmbed().setColor("D9B3FF").setAuthor(user.username, message.guild.iconURL()).setThumbnail(user.avatarURL()).setDescription(`**LEVEL: **${level}\n**XP: **${xp}/${xpreq}`));
console.log(`${message.author.tag} used [level] in ${guild.name}`);
};
【问题讨论】:
标签: javascript discord.js quick.db