Discord. js Команда таблицы лидеров - PullRequest
1 голос
/ 02 августа 2020

как создать команду таблицы лидеров с этой базой данных 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 } }
]

Ответы [ 3 ]

0 голосов
/ 02 августа 2020

Один из возможных способов - использовать Встраивание сообщений , где поля являются записями таблицы лидеров.

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);
0 голосов
/ 02 августа 2020

Я быстро сделал фрагмент кода из своего собственного файла. 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;
      }
    }
  }
0 голосов
/ 02 августа 2020

Ну, вы можете sh всех пользователей в массиве, а затем использовать sort в этом массиве, и это даст вам всех пользователей от основного до второстепенного уровня.

Это функция, которую я использую на своем боте:

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);

Это для , который берет все члены xp из вашего . json файла, а затем pu sh их в локальный массив, затем я использую сортировку для организации от Major к Minor.

...