Discord JS 消息分级系统

Posted

技术标签:

【中文标题】Discord JS 消息分级系统【英文标题】:Discord JS Message Leveling System 【发布时间】:2019-11-11 08:32:57 【问题描述】:

我正在为我的 Discord 机器人制作关卡系统,我想要它,所以如果我达到 5 级,它会给我一个角色。我希望这样当你达到一定的水平时,你就会被赋予一个角色。

我粘贴了我正在使用的消息分级系统的代码。

bot.on("message", async message => 
    let xpAdd = Math.floor(Math.random() * 7) + 8;

    if(!xp[message.author.id]) 
        xp[message.author.id] = 
            xp: 0,
            level: 1
        
    
    if(xp[message.author.id].level[5]) //idk if im doing this right, I want it so if level reaches a certain number, it will give out a role
    
        console.log("skrt");
    
    let curxp = xp[message.author.id].xp;
    let curlvl = xp[message.author.id].level;
    let nxtlvl = xp[message.author.id].level * 300;
    let rankuplvl = xp[message.author.id].xp * 7;
    xp[message.author.id].xp = curxp + xpAdd;

    if(nxtlvl <= xp[message.author.id].xp) 
        xp[message.author.id].level = curlvl + 1;

        const lvlUp = new Discord.RichEmbed()
            .setTitle("You leveled up!")
            .setColor("#FFC0CB")
            .addField("NEW LEVEL", curlvl + 1);

        message.channel.send(lvlUp);
    
    fs.writeFile("./xp.json", JSON.stringify(xp), (err) => 
        if(err) console.log(error)
    );

    if(message.content.startsWith(prefix + "level")) 
        message.channel.bulkDelete(1)
        if(!xp[message.author.id])
            xp[message.author.id] = 
                xp: 0,
                level: 1
            ;
        
    let curxp = xp[message.author.id].xp;
    let curlvl = xp[message.author.id].level;
    let nxtlvl = curlvl * 300;
    let difference = nxtlvl - curxp;

    const lvlEmbed = new Discord.RichEmbed()
        .setAuthor(message.author.username)
        .setColor("#FFC0CB")
        .addField("XP", curxp, true)
        .addField("Level", curlvl, true)
        .setFooter(`$difference XP  until next rank!`, message.author.displayAvatarURL);
    message.channel.send(lvlEmbed)
    
);

【问题讨论】:

【参考方案1】:

让我们分解一下我们需要做什么才能达到您想要的行为。假设您使用的是 stable 分支(很可能)...

    检查用户的等级是否为5。Equality operator

    检索所需的角色。Guild.roles

    通过 ID:Map.get() 或使用 ID 作为 #3 中的 RoleResolvable。 按属性:Collection.find()

    为用户添加角色。GuildMember.addRole()

现在,让我们将所有内容放在一起并将其实现到您的代码中。

if(nxtlvl <= xp[message.author.id].xp) 
  xp[message.author.id].level = curlvl + 1;

  // Check if the user's level is 5.
  if (xp[message.author.id].level === 5) 
    // Retrieve the desired role. Uncomment whichever line you need, as described.
    // const role = message.guild.roles.get('idHere');
    // const role = message.guild.roles.find(role => role.name === 'Level 5');

    message.member.addRole(role) // Or simply use the role ID directly.
      .catch(console.error);     // Make sure to catch any rejected promises.
  

  // Continue with your level-up embed.

【讨论】:

一切正常,感谢您的帮助! 很高兴我能帮上忙。如果它有效地解决了您的问题,请随时使用左侧的复选标记accept this answer。

以上是关于Discord JS 消息分级系统的主要内容,如果未能解决你的问题,请参考以下文章

discord.js - 如何在提到的用户之间随机拆分消息?

消息嵌入中的 Discord.js v12 图像

(Discord 机器人)当用户加入 Discord 服务器(discord.js)时,如何发送欢迎消息?

Discord.js票务系统错误发送未定义错误

统计来自 Discord 服务器的消息 - Discord.js

使用 Discord.js 的批准/拒绝系统