试图为我的discord.js机器人发出排行榜命令,但除第一个位置值外,所有值均保持为0

时间:2020-07-17 15:49:46

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

因此,我正在尝试使用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部分,以查看问题是否出在我试图获取前三名成员的代码的第一部分。问题是,即使在不和谐服务器中还有其他人的xp大于0,secondplacethirdplace都保持为0。forEach函数也会通​​过公会中的每个成员,因此问题。

按预期,因为secondplacethirdplace的值保持为0,所以嵌入将以最后两个字段中的message.guild.language.invalid_xp值结束。当第一个字段正确显示第一个位置时。

2 个答案:

答案 0 :(得分:0)

我认为您用来对成员进行分类的“系统”有点不好。 尝试对排行榜使用更简单的内容,例如数组。

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]);
  })()

(使用匿名函数,它看起来更酷(:并且您不必以这种方式声明函数)

答案 1 :(得分:0)

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

message.guild.members.cache.forEach()