Discord.js 排行榜命令
Posted
技术标签:
【中文标题】Discord.js 排行榜命令【英文标题】:Discord.js Leaderboard Command 【发布时间】:2020-11-22 12:18:10 【问题描述】:如何使用这个 JSON 数据库制作排行榜命令?
guildId:
userId:
coin: 1,
money: 0
userId:
coin: 3,
money: 0
我已经尝试过使用此代码及其工作,但我不知道如何在消息中显示排行榜。
const coins = require("./Config/coins.json");
const sorted = [];
for (let guild in lvl)
for (let user in lvl[guild])
if(guild === message.guild.id)
const levl = lvl[guild][user].allxp;
const entry = [user] : lvl[guild][user]
if (sorted.length === 0)
sorted.push(entry);
continue;
let i = 0;
while (sorted[i] !== undefined && sorted[i][Object.keys(sorted[i])].allxp > levl)
i++;
sorted.splice(i, 0, entry)
代码给出了这个输出,如何把它做成排行榜?
[
'658761055627116604': xp: 1753, allxp: 6753, level: 5 ,
'730453900842500148': xp: 41, allxp: 3041, level: 4 ,
'736140177130520616': xp: 126, allxp: 626, level: 2 ,
'722764152967266354': xp: 447, allxp: 447, level: 1 ,
'501982335076532224': xp: 135, allxp: 135, level: 1 ,
'235088799074484224': xp: 61, allxp: 61, level: 1 ,
'705771638695657483': xp: 29, allxp: 29, level: 1 ,
'736482631268565033': xp: 17, allxp: 17, level: 1 ,
'505316479064080384': xp: 28, allxp: 0, level: 2
]
【问题讨论】:
【参考方案1】:好吧,您可以将所有用户推送到一个数组上,然后对该数组使用 sort,这将为您提供从 Major 到 Minor 级别的所有用户。
这是我在我的机器人上使用的功能:
sortServerRanks: function (usersRank, guilds, message, StateManager)
const arrayMembers = guilds.get(message.guild.id).Member;
for (let index = 0; index < arrayMembers.length; index++)
usersRank.push(arrayMembers[index].memberXP);
usersRank.sort((a, b) => b - a);
for (let i = 0; i < usersRank.length; i++)
for (let index = 0; index < arrayMembers.length; index++)
if (parseInt(arrayMembers[index].memberXP) === parseInt(usersRank[i]))
arrayMembers[index].serverRank = i + 1;
updateGuildServerRank(
arrayMembers[index].guildID,
arrayMembers[index].memberID,
i + 1
);
StateManager.emit(
"updateServerRank",
arrayMembers[index].guildID,
arrayMembers[index].memberID,
arrayMembers[index].serverRank,
i + 1
);
您需要的唯一代码是:
for (let index = 0; index < arrayMembers.length; index++)
usersRank.push(arrayMembers[index].memberXP);
usersRank.sort((a, b) => b - a);
是一个 for,它从您的 .json 文件中获取所有成员 xp,然后将它们推送到一个本地数组,然后我使用排序从主要到次要组织。
【讨论】:
【参考方案2】:一种可能的方法是使用Message Embeds,其中的字段是排行榜条目。
const exampleEmbed = new Discord.MessageEmbed()
.setColor('#0099ff')
.setTitle('Some title')
.setDescription('Some description here')
.addFields(
name: user, value: xp/level ,
name: user, value: xp/level ,
name: user, value: xp/level ,
name: user, value: xp/level ,
)
channel.send(exampleEmbed);
【讨论】:
【参考方案3】:我用自己的 .json 文件快速编写了一段代码,也许这可以帮助你。
let usersLength = Object.keys(allUsers).length;
let numberID = 0;
var usersArray = [];
var serverUsersArray = [];
for (let index = 0; index < usersLength; index++)
//XP and levels
if (!xp[allUsers[index].id])
xp[allUsers[index].id] =
xp: 0,
level: 1,
bost: 1,
xprol: 0,
levelrol: 1,
biography: "none",
age: 1,
rank: 0,
rankserver: 0,
respect: 0,
work: "none",
relation: "Soltero/a",
;
serverUsersArray.push(xp[allUsers[index].id].xp);
usersArray.push(xp[allUsers[index].id].xprol);
serverUsersArray.sort((a, b) => b - a);
usersArray.sort((a, b) => b - a);
numberID = 0;
for (var i = 0; i < Object.keys(usersArray).length; i++)
for (let index = 0; index < usersLength; index++)
if (xp[allUsers[index].id].xprol === usersArray[i])
xp[allUsers[index].id].rank = i + 1;
for (var i = 0; i < Object.keys(serverUsersArray).length; i++)
for (let index = 0; index < usersLength; index++)
if (xp[allUsers[index].id].xp === serverUsersArray[i])
xp[allUsers[index].id].rankserver = i + 1;
【讨论】:
"allUsers" 是.json文件的导入.. ´const allUsers = require("../../database/users/users.json");´ 这个文件里有userId吗?如果有,是否只有userId?除了userid还有别的吗? 好吧,我使用这样的 .json 文件:' "0": "id": "677725104712712202", "admin": "no", "mod": "no", "不朽”:“不” ' 我把这个文件当成一个巨大的Array Map来使用,其中保存了每个成员的ID和权限。 好的,谢谢,什么是“levelrol”和“xprol”?是指allxp吗?以上是关于Discord.js 排行榜命令的主要内容,如果未能解决你的问题,请参考以下文章
排行榜命令中未定义的用户名 [ quick.db / discord.js ]
尝试为我的 discord.js 机器人创建排行榜命令,但除第一名之外的所有值都保持为 0