将前 10 名添加到调平系统排行榜

问题描述

所以我正在尝试为我的排行榜添加前 10 名,这是我用于等级系统和排行榜代码,但我不知道如何添加前 10 名,我需要它,因为当您键入命令时它只是垃圾邮件,因为很多人都在讨论,所以请帮忙。

client.on("message",async (message) => {
  if (message.author.bot) return;
  if (message.channel.type === "dm") {
    return;
  }
  const dm = client.users.cache.get(message.author.id);

  if (!db[message.author.id])
    db[message.author.id] = {
      userid: message.author.id,xp: 0,level: 0,};
  db[message.author.id].xp++;
  let userInfo = db[message.author.id];
  if (userInfo.xp > 99) {
    userInfo.leveL++;
    userInfo.xp = 0;
    dm.send(
      new discord.MessageEmbed()
        .setTitle(
          `${levelup}Level up${levelup}\n${levelup}Level: ${userInfo.level} ${levelup}`
        )
        .setColor("#E2DF09")
        .setTimestamp()
    );
  }
  if (
    message.content.toLowerCase().startsWith(prefix + "rank") ||
    message.content.toLowerCase().startsWith(prefix + "level")
  ) {
    let userInfo = db[message.author.id];
    let member = message.mentions.members.first();
    let embed = new discord.MessageEmbed()
      .setColor("#E2DF09")
      .addField("Level",`${info}` + userInfo.level + `${info}`)
      .addField("XP",`${info}` + userInfo.xp + "/100" + `${info}`)
      .setFooter(
        `${message.author.tag}`,`${message.author.avatarURL({ dynamic: true })}`
      );
    if (!member) return message.channel.send(embed);
    let memberInfo = db[member.id];
    let embed2 = new discord.MessageEmbed()
      .setColor("#E2DF09")
      .addField("Level",`${info}` + memberInfo.level + `${info}`)
      .addField("XP",`${info}` + memberInfo.xp + "/100" + `${info}`);
    message.channel.send(embed2);
  } else if (
    message.content.toLowerCase().startsWith(prefix + "leaderboard") ||
    message.content.toLowerCase().startsWith(prefix + "lb")
  ) {
    const embed = new discord.MessageEmbed()
      .setTitle("leaderboard")
      .setColor("#E2DF09");
    const c = Object.entries(db).sort((a,b,d) => b[1].level - a[1].level);
    for (const [key,value] of c) {
      embed.addField(
        `\u200B`,`<@${value.userid}>\nLevel: ${value.level} | XP: ${value.xp}`
      );
    }
    message.channel.send(embed);
  }
  fs.writeFile("./db/database.json",JSON.stringify(db),(error) => {
    console.error();
  });
});

这也是 json 文件的样子 我使用用户 ID 作为排行榜标签

{"630812692659044352":{"userid":"630812692659044352","xp":31,"level":32}

这是排行榜的样子,但我想在用户名旁边添加数字,对于第 1、第 2、第 3 个,我想像奖杯或其他东西一样添加,但在我这边不起作用。

This is how the leaderboard looks like

解决方法

这是我认为可行的方法(我在一个在线网站上测试过)

var ranks = {
'SOMEUSERID': {
userid: 'SOMEUSERID',rank: 0,xp: 45
},'ANOTHERUSERID': {
userid: 'THEUSERID',xp: 70
}
}
//^^EXAMPLE RANKS,DONT ADD THESE^^
var leaderboard = []
for(const i in ranks) {
var person = ranks[i];
leaderboard.push(person)
}
//^^LOOP THROUGH ALL USERS^^
leaderboard.sort((b,a) => ((a.rank+1)*(a.xp)) - ((b.rank+1)*(b.xp)))

//^^SORT BY (RANK+1)*XP,in descending order^^

var ranksSorted = leaderboard.map(u => u.rank);
var xpSorted = leaderboard.map(u => u.xp)
var usersSorted = leaderboard.map(u => u.userid)
//ranksSorted,xpSorted,and usersSorted are synced
//...
//top 10 leaderboard within one string

var str = '';
for(let i = 0; i<=10 && i<leaderboard.length;i++) {
str += usersSorted[i] + '\n' + ranksSorted[i] + ' | ' + xpSorted[i] + '\n'
//YOU CAN ALSO ACCESS WHICH PLACE THEY ARE WITH i+1
}

因此您不必将其保存在字符串中,您可以将其添加到字符串中,而不是将其添加到字符串中,如下所示:

for(let i = 0; i<=10 && i<leaderboard.length;i++) {
someEmbed.addField(client.users.cache.get(usersSorted[i]).tag,ranksSorted[i] + ' | ' + xpSorted[i])
}

编辑:rank*xp 效果不佳。例如 1*28 大于 2*13。做Math.pow()

leaderboard.sort((b,a) => ((a.rank+1)*(a.xp)) - (Math.pow((b.rank+1),10)*(b.xp)))
//instead of the previous leaderboard.sort

这样,rank 1 xp 99 小于rank 2 xp 1