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 变量已经有价值了。