【问题标题】:Trying to make a leader board command for my discord.js bot but all values stay 0 except for the first place value尝试为我的 discord.js 机器人创建排行榜命令,但除第一名之外的所有值都保持为 0
【发布时间】:2020-11-07 11:13:17
【问题描述】:

所以我正在尝试在我的 discord.js 机器人中使用 quick.db 为我的 xp 系统创建排行榜命令。 命令代码:

const db = require("quick.db");
        const Discord = require("discord.js");

        let firstplace = 0;
        let firstplaceperson = "";
        let secondplace = 0;
        let secondplaceperson = "";
        let thirdplace = 0;
        let thirdplaceperson = "";


        message.guild.members.forEach(member => {
            console.log(member.displayName)
            let xp = db.get(`xp_${message.guild.id}_${member.id}`);
            if (xp === null) db.set(`xp_${message.guild.id}_${member.id}`, 0);
            xp = db.get(`xp_${message.guild.id}_${member.id}`);

            if (xp >= firstplace) {
                firstplace = xp;
                firstplaceperson = member.displayName;
            }

            if (xp <= firstplace && xp > secondplace && firstplaceperson != member.displayName) {
                secondplace = xp;
                secondplaceperson = member.displayName;
            }

            if (xp <= secondplace && xp > thirdplace && firstplaceperson != member.displayName && secondplaceperson != member.displayName) {
                thirdplace = xp;
                thirdplaceperson = member.displayName;
            }
        });




        console.log(firstplace);
        console.log(firstplaceperson);

        console.log(secondplace);
        console.log(secondplaceperson);

        console.log(thirdplace);
        console.log(thirdplaceperson);

        let embed = {
            color: 000000,
            timestamp: new Date(),
            fields: [
                {
                    name: message.guild.language.first_place,
                    value: firstplaceperson + " " + firstplace
                },
                {
                    name: message.guild.language.second_place,
                    value: secondplaceperson + " " + secondplace
                },
                {
                    name: message.guild.language.third_place,
                    value: thirdplaceperson + " " + thirdplace
                }
            ]
        }

        if (thirdplace === 0) {
            embed.fields = [
                {
                    name: message.guild.language.first_place,
                    value: firstplaceperson + " " + firstplace
                },
                {
                    name: message.guild.language.second_place,
                    value: secondplaceperson + " " + secondplace
                },
                {
                    name: message.guild.language.third_place,
                    value: message.guild.language.invalid_xp
                }
            ]
        }


        if (secondplace === 0) {
            embed.fields = [
                {
                    name: message.guild.language.first_place,
                    value: firstplaceperson + " " + firstplace
                },
                {
                    name: message.guild.language.second_place,
                    value: message.guild.language.invalid_xp
                },
                {
                    name: message.guild.language.third_place,
                    value: message.guild.language.invalid_xp
                }
            ]
        }

        message.channel.send({ embed: embed })

    }

我添加了 console.log 部分以查看问题是否出在我试图获得前三名成员的代码的第一部分。问题是secondplacethirdplace 都保持为0,即使discord 服务器中有其他人的xp 大于0。而且forEach 函数会遍历公会中的每个成员,所以这不是问题。

正如预期的那样,因为 secondplacethirdplace 值保持为 0,嵌入将在最后两个字段中以 message.guild.language.invalid_xp 值结束。而第一个字段正确显示第一名。

【问题讨论】:

    标签: javascript discord bots discord.js quick.db


    【解决方案1】:

    我认为您用于对成员进行分类的“系统”有点糟糕。 尝试对排行榜使用更简单的东西,例如数组。

    let leaderboard = new Array()
    
    function update(user,xp) {
      if (!leaderboard[0]) return leaderboard.push([user,xp])
      if (xp >= leaderboard[0][1]) return leaderboard.splice(0,0,[user,xp]);
      if (!leaderboard[1]) return leaderboard.push([user,xp])
      if (xp >= leaderboard[1][1]) return leaderboard.splice(1,0,[user,xp]);
      if (!leaderboard[2]) return leaderboard.push([user,xp])
      if (xp >= leaderboard[2][1]) return leaderboard.splice(2,0,[user,xp]);
    }
    

    您现在可以在 forEach 循环的每次迭代中调用该函数。 它看起来像这样:

    message.guild.members.forEach(member => {
      console.log(member.displayName)
      let xp = db.get(`xp_${message.guild.id}_${member.id}`);
      if (xp === null) db.set(`xp_${message.guild.id}_${member.id}`, 0);
      xp = db.get(`xp_${message.guild.id}_${member.id}`);
      
      ((user,xp) => {
        if (!leaderboard[0]) return leaderboard.push([user,xp])
        if (xp >= leaderboard[0][1]) return leaderboard.splice(0,0,[user,xp]);
        if (!leaderboard[1]) return leaderboard.push([user,xp])
        if (xp >= leaderboard[1][1]) return leaderboard.splice(1,0,[user,xp]);
        if (!leaderboard[2]) return leaderboard.push([user,xp])
        if (xp >= leaderboard[2][1]) return leaderboard.splice(2,0,[user,xp]);
      })()
    

    (使用匿名函数,看起来更酷(:而且你不必这样声明函数)

    【讨论】:

      【解决方案2】:

      注意:如果你使用V12或更高版本,应该是

      message.guild.members.cache.forEach()

      【讨论】:

        猜你喜欢
        • 2018-01-08
        • 2020-11-22
        • 2021-11-19
        • 1970-01-01
        • 1970-01-01
        • 2021-08-09
        • 2021-02-02
        • 2020-04-14
        • 2021-03-12
        相关资源
        最近更新 更多