我有一个等级不一致的机器人,我想制作一个将最高等级排序到最低等级的排行榜。然后发送嵌入命令,代码如下:
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}}
答案 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:)