Отображение списка лидеров в Embed - PullRequest
0 голосов
/ 09 марта 2020

Я пытаюсь создать команду списка лидеров для своего бота Discord, и у меня возникают проблемы с отображением данных, мой текущий код отображает только верхнего пользователя, вы можете видеть на изображении 4 строки, это потому, что есть 4 записи в базе данных, поэтому она получает информацию, но не отображает все данные. Может ли кто-нибудь указать, что я делаю неправильно / что мне нужно изменить, чтобы это исправить. (Блокированные биты на фотографиях - это мое имя пользователя) Код:

    const top10 = db
      .prepare(
        'SELECT * FROM scores WHERE guild = ? ORDER BY points DESC LIMIT 10;',
      )
      .all(message.guild.id);
    if (!top10) {
      return;
    }

    for (const data of top10) {
      let userNames = '';
      for (let i = 0; i < top10.length; i++) {
        const user = bot.users.cache.get(data.user).tag;
        userNames += `\`${i + 1}\` ${user}\n`;
      }

      const level = `\`${data.level}\`\n`;
      const xp = `\`${data.points.toLocaleString('en')}\`\n`;

      const embed = new MessageEmbed()
        .setAuthor(`Leaderboard for ${message.guild.name}`, message.guild.iconURL({ dynamic: true }))
        .setColor(0x51267)
        .addFields({ name: 'Top 10', value: userNames, inline: true },
          { name: 'Level', value: level, inline: true },
          { name: 'XP', value: xp, inline: true });

      message.channel.send(embed);
      return;
    }

Текущий вывод: Curent Output: Желаемый вывод: Desired Output

Ответы [ 2 ]

1 голос
/ 09 марта 2020

Читая ваш код, я полагаю, что вы допустили ошибку в структурировании вашего кода. Судя по всему, ваш код получает первый элемент в top10, а затем добавляет его в строку столько раз, сколько длина массива top10. Затем он получает уровень и XP для первого пользователя, добавляет его в строку, а затем создает его в виде встраивания. Вот исправленный код, поэтому он должен работать так, как вы рассчитывали:

    let userNames = '';
    let levels = '';
    let xp = '';
    for (let i = 0; i < top10.length; i++) {
      const data = top10[i];
      const user = (await bot.users.fetch(data.user)).tag;

      userNames += `\`${i + 1}\` ${user}\n`;
      levels += `\`${data.level}\`\n`;
      xp += `\`${data.points.toLocaleString('en')}\`\n`;
    }

    const embed = new MessageEmbed()
      .setAuthor(`Leaderboard for ${message.guild.name}`, message.guild.iconURL({ dynamic: true }))
      .setColor(0x51267)
      .addFields({ name: 'Top 10', value: userNames, inline: true },
        { name: 'Level', value: levels, inline: true },
        { name: 'XP', value: xp, inline: true });

    message.channel.send(embed);
    return;
0 голосов
/ 09 марта 2020

Ваша проблема в том, что вы просто добавляете \n к js объекту, так что это не работает. В качестве varian вы можете создать 3 arrs с данными, затем отобразить результат dB pu sh в данные.

И лучше использовать message.guild.members.chache.get для проверки, если пользователь на сервере, потому что, bot.users.cache.get(data.user).tag вернет неопределяемое после перезапуска бота, если пользователь не отправляет никаких сообщений в обработанные каналы бота.

    const top10 = db.prepare('SELECT * FROM scores WHERE guild = ? ORDER BY points DESC LIMIT 10;').all(message.guild.id);
    if (!top10) {
        return;
    }

    let usersArr = [];
    let levelArr = [];
    let xpArr = [];

    top10.forEach(dataUser, index => {
        let findUser = message.guild.members.cache.get(dataUser.user);
        if (findUser) {
            usersArr.push(`\`${index + 1}\` ${user.tag}`);
            levelArr.push(dataUser.level);
            xpArr.push(dataUser.points.toLocaleString('en'));
        }
    });

    const embed = new MessageEmbed()
        .setAuthor(`Leaderboard for ${message.guild.name}`, message.guild.iconURL({ dynamic: true }))
        .setColor(0x51267)
        .addFields({ name: 'Top 10', value: usersArr.join('\n'), inline: true }, { name: 'Level', value: levelArr.join('\n'), inline: true }, { name: 'XP', value: xpArr.join('\n'), inline: true });
    message.channel.send(embed);
...