所以我正在尝试为我的排行榜添加前 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 个,我想像奖杯或其他东西一样添加,但在我这边不起作用。
答案 0 :(得分:0)
这是我认为可行的方法(我在一个在线网站上测试过)
var ranks = {
'SOMEUSERID': {
userid: 'SOMEUSERID',
rank: 0,
xp: 45
},
'ANOTHERUSERID': {
userid: 'THEUSERID',
rank: 0,
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