discord.js 手动调平系统 quick.db
discord.js manual levelling system with quick.db
我正在尝试为我的服务器配置一个升级系统,当管理员使用 >givexp 时为用户提供 XP,当用户达到新级别时发送消息,当管理员使用 > 时重置用户的 XP 和级别resetxp, 并在使用>level.
时显示用户的等级&XP(当前等级的当前XP超过XP到下一个等级)
但是,用户不会从第一次获得 XP 时就获得 XP(如果我使用 >givexp @user#1234 50,然后使用 >givexp @user#1234 20,他们的总 XP 将为 20)。
级别 0 的用户在上次奖励后达到 100 XP 或更多,在获得更多 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}`);
};
因为如果值为null,就像你检查它一样。您永远不会重新定义 level
变量的值。您只是在 quick.db 上将级别设置为 0,而不是实际变量。
if (level === null) db.set(`level_${message.guild.id}_${user.id}`, 0);
// this is the issue, "if level is null, set db level_${message.guild.id} to 0"
您还需要将值设置为 level
变量,以便稍后在您的代码中检查调平要求后
if (totalxp >= xpreqs[level])
// You are basically checking if (totalxp >= xpreqs[null])
这就是为什么您的用户在第二次添加 XP 后获得了他们需要的级别,因为那时您的 level
变量已经有价值了。
我正在尝试为我的服务器配置一个升级系统,当管理员使用 >givexp 时为用户提供 XP,当用户达到新级别时发送消息,当管理员使用 > 时重置用户的 XP 和级别resetxp, 并在使用>level.
时显示用户的等级&XP(当前等级的当前XP超过XP到下一个等级)但是,用户不会从第一次获得 XP 时就获得 XP(如果我使用 >givexp @user#1234 50,然后使用 >givexp @user#1234 20,他们的总 XP 将为 20)。
级别 0 的用户在上次奖励后达到 100 XP 或更多,在获得更多 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}`);
};
因为如果值为null,就像你检查它一样。您永远不会重新定义 level
变量的值。您只是在 quick.db 上将级别设置为 0,而不是实际变量。
if (level === null) db.set(`level_${message.guild.id}_${user.id}`, 0);
// this is the issue, "if level is null, set db level_${message.guild.id} to 0"
您还需要将值设置为 level
变量,以便稍后在您的代码中检查调平要求后
if (totalxp >= xpreqs[level])
// You are basically checking if (totalxp >= xpreqs[null])
这就是为什么您的用户在第二次添加 XP 后获得了他们需要的级别,因为那时您的 level
变量已经有价值了。