带角色的关卡系统 (discord.js, node.js)

Level System with roles (discord.js, node.js)

我目前正在为我的机器人做一个等级系统,我想为达到特定分数的用户提供特定角色(例如:如果你达到 5 级,你将获得角色 级别5)

这是我目前拥有的关卡系统:

const Discord = require('discord.js');
const bot = new Discord.Client();
const fs = require('fs')
const xpfile = require('./xp.json')
      
bot.on("message", function(message){
       if(message.author.bot) return;  
       var addXP = Math.floor(Math.random() * 8) + 3;
    
       if(!xpfile[message.author.id]){
          xpfile[message.author.id] = {
             xp: 0,
             level: 1,
             reqxp: 1000
          }
    
          fs.writeFile("./xp.json", JSON.stringify(xpfile), function(err){
             if(err) console.log(err)
          })
       }
    
       xpfile[message.author.id].xp += addXP
    
       if(xpfile[message.author.id].xp > xpfile[message.author.id].reqxp){
          xpfile[message.author.id].xp -= xpfile[message.author.id].reqxp //remove xp after level up
          xpfile[message.author.id].reqxp *= 1.5 //add difficulty to get a higher level
          xpfile[message.author.id].reqxp = Math.floor(xpfile[message.author.id].reqxp) //reqxp better number ig (In german: reqxp runden)
          xpfile[message.author.id].level += 1 //add 1 level
    
          message.reply("Is now Level **"+xpfile[message.author.id].level+"**! :tada:")
       }
    
       fs.writeFile("./xp.json", JSON.stringify(xpfile), function(err){
          if(err) console.log(err)
       })
    
       if (message.content.startsWith(".level")){
          message.delete()
    
          let user = message.mentions.users.first() || message.author
    
          if(user.bot) return message.reply("Bots dont have XP or Levels :(")
    
          const embed = new Discord.RichEmbed()
          .setThumbnail(message.author.avatarURL)
          .setTitle('Level for '+message.author.username)
          .setColor ('#12A5F1')
          .addField("Level: ",xpfile[user.id].level)
          .addField("XP: ",xpfile[user.id].xp+"/"+xpfile[user.id].reqxp)
          message.channel.send(embed)
       }

这里是获得没有用的角色的想法(自动会更酷,但我不知道它是如何工作的):

if (message.content.startsWith(".reward")){
      message.delete()
      try{
         if([user.id].level = '2'){
         message.guild.roles.fetch('816587197868015646')
         let member = message.mentions.members.first();
         member.roles.add(role).catch(console.error);
         }
      }

      catch {
         return message.reply("There are currently no rewards to claim!")
      }
   }

这是我的 xp.json:

{"751092600890458203":{"xp":740,"level":2,"reqxp":1500}}

您的语法中缺少 cache。阅读有关从 V11 到 V12 的更新 here

message.guild.roles.fetch('816587197868015646');
//Old V11 Syntax →
message.guild.roles.cache.find(role => role.id === "816587197868015646");
//New V12 Syntax ✓

我强烈建议不要在 JSON 中存储任何用户数据,请尝试 SQL 或 MongoDB。