#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
Надеюсь, это сработает, друг!