Actualmente estoy haciendo un bot de Discord. Se supone que el código que he proporcionado a continuación obtiene datos de Hypixel para mostrar información del gremio. Está obteniendo la información correcta, pero quiero enviar todos los nombres como un mensaje en lugar de una persona por mensaje.

Este es mi código:

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]&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);
       });
     }
    });
  });
 },
};

Actualmente muestra todos los nombres, pero envía un nombre por mensaje. Quiero agrupar todos estos nombres juntos.

1
UA Client 26 ago. 2020 a las 00:41

2 respuestas

La mejor respuesta

En lugar de ejecutar estas dos líneas:

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

Y luego cerrando el ciclo for, intente enviar los resultados a una matriz inicializada antes del ciclo, luego envíe eso. Ejemplo:

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

Asegúrese de cambiar la línea execute(message, args) en la parte superior de su código a async execute(message, args) para que await sea posible.


Como descargo de responsabilidad, no tengo conocimientos en el área de la API de Minecraft y no sé cómo está estructurado el objeto devuelto por su solicitud. Esta es mi mejor suposición.

0
Lioness100 25 ago. 2020 a las 22:09

@ Lioness100 También no está familiarizada con la API de Minecraft.

Tengo curiosidad por el bucle, parece que su búsqueda inicial de la API con información del gremio devuelve lo que está buscando.

¿Está deconstruyendo nombres para probar la funcionalidad y eventualmente empujar perfiles completos a la discordia? ¿O estás contento con solo nombres?

(Para este último, en lugar del bucle lo has probado)

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

De lo contrario, otra cosa a considerar sería utilizar el ciclo para generar una matriz de URL que podría resolver junto con un Promise.all. Preguntándose si la salida no deseada es el resultado de un comportamiento asincrónico. Aquí están los documentos de la API como referencia:

https://javascript.info/promise-api

¡Espero que funcione, amigo!

0
JBonAA 25 ago. 2020 a las 22:49