Команда таблицы лидеров для базы данных JSON

#javascript #node.js #json #discord.js

#javascript #node.js #json #discord.js

Вопрос:

У меня есть система выравнивания, код ниже, которая использует базу данных JSON, которая сортирует данные следующим {"626916199783071750":{"xp":94,"level":12} образом. Я хочу создать команду, которая показывает таблицу лидеров всех участников в порядке их уровня. Код

 nst Discord = require('discord.js');
const client = new Discord.Client();
const config = require('./config.json');
const fs = require("fs");
let db = JSON.parse(fs.readFileSync("./database.json", "utf8"));

client.on("message", message => {
    if (message.author.bot) return; // ignore bots

    // if the user is not on db add the user and change his values to 0
    if (!db[message.author.id]) db[message.author.id] = {
        xp: 0,
        level: 0
      };
    db[message.author.id].xp  ;
    let userInfo = db[message.author.id];
    if(userInfo.xp > 100) {
        userInfo.level  
        userInfo.xp = 0
        message.reply("Congratulations, you level up")
    }
    const args = message.content.slice(config.prefix.length).trim().split(/  /g);
    const cmd = args.shift().toLowerCase();
    if(cmd === "rank") {
        let userInfo = db[message.author.id];
        let member = message.mentions.members.first();
        let embed = new Discord.RichEmbed()
        .setColor(0x4286f4)
        .addField("Level", userInfo.level)
        .addField("XP", userInfo.xp "/100");
        if(!member) return message.channel.sendEmbed(embed)
        let memberInfo = db[member.id]
        let embed2 = new Discord.RichEmbed()
        .setColor(0x4286f4)
        .addField("Level", memberInfo.level)
        .addField("XP", memberInfo.xp "/100")
        message.channel.sendEmbed(embed2)
    }
    fs.writeFile("./database.json", JSON.stringify(db), (x) => {
        if (x) console.error(x)
      });
})

client.login(config.token)
 

Кстати, я использую discord.js v12

Комментарии:

1. Вы получаете какую-либо ошибку?

Ответ №1:

Если вам нужно отсортировать данные JSON, как вы указали, вот решение

 // Your database
const members = [
  {"626916199783071750":{"xp":94,"level":7}},
  {"626916199783071750":{"xp":94,"level":22}},
  {"626916199783071750":{"xp":94,"level":12}}
];

// Sort function
members.sort(function(a, b) {
  const keyA = a[Object.keys(a)[0]].level,
        keyB = b[Object.keys(a)[0]].level;
  // Compare
  // (swap -1 and 1 to change sort order)
  if(keyA < keyB) return -1;
  if(keyA > keyB) return 1;
  return 0;
});
// Result
console.log(members); 

Комментарии:

1. В моей базе данных все разные пользователи находятся рядом друг с другом, а не один под другим, имеет ли это значение? также я помещаю это в свой файл database.json?

2. Если структура каждой записи такая же, как вы указали в своем вопросе, не имеет значения, сколько пользователей (ну, это зависит от серверного оборудования), но эта функция сортировки будет сортировать их.

3. это код javascript. Я помещаю это в файл json?, я в замешательстве

4. Нет) Вы читаете и анализируете свой JSON здесь: let db = JSON.parse(fs.readFileSync("./database.json", "utf8")); , затем вы работаете с db массивом и отправляете данные пользователю. Я не знаю, в каком формате данные находятся в этом файле. Вы предоставили {"626916199783071750":{"xp":94,"level":12}} , я написал для нее функцию сортировки… Если данные имеют другую структуру, то вам необходимо изменить эту функцию)

5. хорошо, спасибо. я не определил членов в своем index.js файл, хотя так он выдает мне ошибку. как я должен определять участников?