Отправка строки JSON в нескольких сообщениях. discord.js

#javascript #node.js #discord.js

#javascript #node.js #discord.js

Вопрос:

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

Это мой код:

 const fetch = require('node-fetch');

module.exports = {
 name: 'hguild',
 aliases: ['hg'],
 description: 'Shows info about a hypixel guild!',
 guildOnly: true,
 args: true,
 usage: '<player>',
 execute(message, args) {
  var ruuid = [];

  const guildName = args[0];
  message.channel.send('Please wait, checking API').then((msg) => {
   fetch(`https://api.hypixel.net/guild?key=[REMOVED]amp;name=${guildName}`)
    .catch((err) => message.channel.send(err))
    .then((res) => res.json())
    .catch((err) => message.channel.send(err))
    .then((json) => {
     console.log(json);

     msg.edit('Here is about your guild!');

     for (const guild of json.guild.members) {
      const rawUsername = guild.uuid;

      fetch(`https://api.mojang.com/user/profiles/${rawUsername}/names`)
       .catch((err) => message.channel.send(err))
       .then((res) => res.json())
       .catch((err) => message.channel.send(err))
       .then((json) => {
        console.log(json[0].name);
        if (json.name == null || json.status == 'ERR') {
        }
        var testList = [json[0].name];
        message.channel.send(testList);
       });
     }
    });
  });
 },
};
  

В настоящее время он отображает все имена, но отправляет одно имя на сообщение. Я хочу сгруппировать все эти имена вместе.

Ответ №1:

Вместо выполнения этих двух строк:

 var testList = [json[0].name];
message.channel.send(testList);
  

И затем, закрыв for цикл, попробуйте перенести результаты в массив, инициализированный перед циклом, затем отправьте это. Пример:

 var testList = [];
const getUsernames = async () => {
 for await (const guild of json.guild.members) {
  const rawUsername = guild.uuid;

  fetch(`https://api.mojang.com/user/profiles/${rawUsername}/names`)
   .catch((err) => message.channel.send(err))
   .then((res) => res.json())
   .catch((err) => message.channel.send(err))
   .then((json) => {
    console.log(json[0].name);
    if (json.name == null || json.status == 'ERR') {
    }
    testList.push(json[0].name);
   });
 }
};
await getUsernames();
message.channel.send(testList.join('n'));
  

Убедитесь, что вы изменили execute(message, args) строку в верхней части вашего кода на async execute(message, args) , чтобы await это было возможно.


В качестве отказа от ответственности я не разбираюсь в области API Minecraft и не знаю, как структурирован объект, возвращаемый из вашего запроса. Это всего лишь мое лучшее предположение.

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

1. Это может быть связано с тем, что for цикл выполняется недостаточно быстро, поэтому message.channel.send функция выполняется до того, как что-либо передается в массив. Я на мгновение отредактирую свой ответ, чтобы учесть это.

2. ^ Для контекста, это было в ответ на комментарий, который теперь удален

Ответ №2:

@Lioness100 также не знаком с Minecraft API.

Мне любопытно узнать о цикле, похоже, что ваша первоначальная выборка в api с информацией о гильдии возвращает то, что вы ищете.

Вы разбираете имена, чтобы протестировать функциональность, чтобы в конечном итоге отправить целые профили в discord? или вы довольствуетесь только именами?

(Для последнего вместо цикла вы пробовали)

 message.channel.send(json.guild.members)
  

В противном случае еще одна вещь, которую следует рассмотреть, — это использование цикла для генерации массива URL-адресов, которые вы могли бы разрешить вместе с Promise.all. вопросом, является ли нежелательный вывод результатом асинхронного поведения. Вот документы api для справки:

 https://javascript.info/promise-api
  

Надеюсь, это сработает, друг!