带有 quick.db 的 discord.js 手动调平系统

Posted

技术标签:

【中文标题】带有 quick.db 的 discord.js 手动调平系统【英文标题】:discord.js manual levelling system with quick.db 【发布时间】: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 **$giveAmountXP** by $message.author.tag`));
          await message.channel.send(new Discord.MessageEmbed().setColor("D9B3FF").setDescription(`$user.tag has been awarded **$giveAmountXP** by $message.author.tag`));
          console.log(`$message.author.tag awarded $user.tag $giveAmountXP.`);

          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`);
;

【问题讨论】:

【参考方案1】:

这是因为如果值为空,就像你检查它。您永远不会重新定义 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 变量已经有价值。

【讨论】:

以上是关于带有 quick.db 的 discord.js 手动调平系统的主要内容,如果未能解决你的问题,请参考以下文章

Quick.db discord.js

Discord.js 错误:它正在删除整个数组。 Quick.db 和 discord.js

有没有办法使用 quick.db 制作 discord.js 日志系统

排行榜命令中未定义的用户名 [ quick.db / discord.js ]

Discord.js Quick.db 过滤器

在 discord.js(Typescript)中使用 quick.db 获取值时遇到问题