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

discord.js - 排行榜未定义的用户名

如何在 discord.js 中使用 JSON 数据库制作排行榜

Javascript discord.js 排行榜

不和谐机器人 |使用 discord.js 和 MongoDB 进行排名(排行榜?)系统