我的系统风格不协调,我想成为排行榜

时间:2020-06-29 18:39:23

标签: javascript discord.js

我有一个等级不一致的机器人,我想制作一个将最高等级排序到最低等级的排行榜。然后发送嵌入命令,代码如下:

const config = require("/Users/kieferlin/Desktop/DiscordBot/config.json");
const fs = require("fs");
const { table } = require('console');

let db = JSON.parse(fs.readFileSync("/users/kieferlin/desktop/discordbot/database.json", "utf8"));

client.on("message", message => {
  if (message.author.bot) return; // ignore bots

  // if the user is not on db add the user and change his values to 0
  if (!db[message.author.id]) db[message.author.id] = {
    xp: 0,
    level: 0
  };
  db[message.author.id].xp++;
  let userInfo = db[message.author.id];
  if (userInfo.xp > 100) {
    userInfo.level++
      userInfo.xp = 0
    message.reply("Congrats, you leveled up")
  }
  const args = message.content.slice(config.prefix.length).trim().split(/ +/g);
  const cmd = args.shift().toLowerCase();
  if (message.content === "!fl level") {
    message.channel.bulkDelete(1)
    message.reply('Here');
    let userInfo = db[message.author.id];
    let member = message.mentions.members.first();
    const embed = new Discord.MessageEmbed()
      .setColor(0xFFFF0B)
      .addField("Level", userInfo.level)
      .addField("XP", userInfo.xp + "/100");
    if (!member) return message.channel.send(embed)
    let memberInfo = db[member.id]
    let embed2 = new Discord.RichEmbed()
      .setColor(0xFFFF0B)
      .addField("Level", memberInfo.level)
      .addField("XP", memberInfo.xp + "/100")
      .setTimestamp()
      .setFooter('Level stystem', 'https://lh3.googleusercontent.com/a-/AOh14Gi-nco2WxXdXBNaLRFkH6CMl_2s0MrlsxxnmNYoGQ=s192-c-rg-br100');
    message.channel.sendEmbed(embed2)
  };
})

以下是用于获取级别的代码的用户。 json文件如下所示:

{"538797349821087777":{"xp":1,"level":0}}

1 个答案:

答案 0 :(得分:0)

如果您在JSON文件中的成员是对象{},则将其转换为Array并对其进行排序。 使用这部分代码

const c = Object.entries(db).sort((a, b)=> b[1].level - a[1].level)
for(const [key, hu] of c) {
  console.log(key, hu)
  // will return like this 
  // "538797349821087777" {"xp":1,"level":0}
}

如果要将ID转换为成员,请在for()块内使用await <Client>.users.fetch(key)

这是带有称为leaderboard的命令的最终代码

                  // don't forget to add async like this
client.on("message", async message => {
    // ...
    if(message.content == "!fl leaderboard") {
        embed = new Discord.RichEmbed()
        const c = Object.entries(db).sort((a, b)=> b[1].level - a[1].level)
        for(const [key, value] of c) {
            embed.addField(await client.users.fetch(key).tag, `Level: ${value.level} | XP: ${value.xp}`)
        }
        message.channel.send(embed)
    }
})

顺便说一下,Discord.js v11将来将不再受支持,因为v12已在NPM中发布。所以请将来升级到v12:)