#javascript #node.js #discord #discord.js #node-fetch
#язык JavaScript #node.js #Discord #discord.js #узел-выборка
Вопрос:
В настоящее время я работаю над discord.js бот, чтобы начать немного практиковаться с node.js В настоящее время я столкнулся с проблемой, пытаясь получить всех членов гильдии с определенной ролью. Вот соответствующий код:
const { SlashCommandBuilder } = require('@discordjs/builders'); const fetch = require('node-fetch'); module.exports = { data: new SlashCommandBuilder() .setName("server") .setDescription("Get server information"), async execute(interaction) { const serverInfo = await getServerInfo(interaction); await interaction.reply({ embeds: [serverInfo] }); } } async function getServerInfo(interaction) { console.log("function called") let fetchedMemebers = await interaction.guild.members.fetch() let roles = await interaction.guild.roles.fetch() const totalMembers = fetchedMemebers.memberCount; const adminRole = roles.find(role =gt; role.name === "Admin") //the role to check const totalAdmin = adminRole.members.length; const serverInfo = { // create the embed color: 0x0099ff, title: `${interaction.guild.name}'s Server Information`, description: `Members: ${totalMembers}nAdmins (Members with the "admin" role): ${totalAdmin}nDate created: ${interaction.guild.createdAt.toDateString()}`, author: { name: `${interaction.user.username}`, icon_url: `${interaction.user.avatarURL()}`, }, timestamp: new Date() } return serverInfo; };
У меня есть следующая ошибка:
DiscordAPIError: Invalid Form Body data.embeds[0].description: This field is required at RequestHandler.execute (/workspace/node.js-verve-bot/node_modules/discord.js/src/rest/RequestHandler.js:349:13) at processTicksAndRejections (node:internal/process/task_queues:96:5) at async RequestHandler.push (/workspace/node.js-verve-bot/node_modules/discord.js/src/rest/RequestHandler.js:50:14) at async CommandInteraction.reply (/workspace/node.js-verve-bot/node_modules/discord.js/src/structures/interfaces/InteractionResponses.js:98:5) at async Object.execute (/workspace/node.js-verve-bot/commands/server.js:11:9) at async Client.lt;anonymousgt; (/workspace/node.js-verve-bot/index.js:46:3) { method: 'post', path: '/interactions/918268169842483211/aW50ZXJhY3Rpb246OTE4MjY4MTY5ODQyNDgzMjExOmVLZnZiSnJVVEdSMEdkVnJyTTR6ZFZOU3h1WkF0VnVFUllPQmZPb05RZmdZbmw3WjJpWjhRN3F4enI2SGhjek4xNDdJdjVrbGxRMXVwSzd3c0VjaldLS2phVVZpd25mUlJ0emJ1S3pRbTdDVjlTQzIxR21USUhvczVOelFLV0kx/callback', code: 50035, httpStatus: 400, requestData: { json: { type: 4, data: [Object] }, files: [] } }
Да, я знаю, что это не мой вопрос, и я тоже не верю, что это моя проблема. Я знаю, что мое встраивание правильное. Я знаю, что что-то не так с тем, как я получаю нынешних членов гильдии, я проверил это , пытаясь console.log(totalMembers)
, но вы ничего не получаете. Даже выхода нет. Я не уверен, что я здесь делаю не так. Есть какие-нибудь идеи? Изменить: изменил свой код на основе самого последнего ответа, хотя возникает та же ошибка. Также, если у вас console.log(adminRole.members.length)
снова нет выхода.
Ответ №1:
Соберите участников вместе Role#members
. Имейте в виду, что это зависит от кэша, поэтому используйте Guild.members.fetch()
их для кэширования
await interaction.guild.members.fetch() //cache all members in the server const role = interaction.guild.roles.cache.find(role =gt; role.name === "Admin") //the role to check const totalAdmin = role.members.map(m =gt; m.id) // array of user IDs who have the role const totalMembers = totalAdmin.length // how many users have the role
Комментарии:
1. Я изменил свой код , чтобы включить то, что вы сказали, изменив свой код для использования
await guild.members.fetch()
, иawait interaction.guild.roles.fetch();
я также изменил свой totalAdmin и рольconst adminRole = interaction.guild.roles.cache.find(role =gt; role.name === "Admin") //the role to check const totalAdmin = adminRole.members.length;
, хотя я все еще получаю ту же ошибку. Может быть, я что-то пропустил? и как я узнаю, когда использоватьawait
синтаксис? Я не очень хорошо знаком с асинхронностью, я использовал ее с discord.py но на этом все и заканчивается.2. Попробуйте войти в систему
serverinfo.description
3. Пока я это делал, я понял , что мой код, похоже, останавливается на
let fetchedMembers = await interaction.guild.members.fetch()
, я проверил это, поместивconsole.log
заявление до и после. Только тот, что был до того, как прозвучало заявление. Может быть, код не извлекает информацию или не может этого сделать?4. Есть ли у вас намерения членов Гильдии?
5. У меня есть следующие намерения:
const client = new Client({ intents: [Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MESSAGES, Intents.FLAGS.GUILD_MEMBERS] }); // create the client
члены гильдии включены. Возможно, также стоит отметить, что я немного изменил свой код, поместив членов в переменную, выбранные роли и немного изменил встраивание. Кроме того, если я сохраню выбранные элементы в переменной и зарегистрирую их, я получу результатundefined
. описание встраивания выглядит следующим образом: Участники: неопределенные администраторы: (Участники с ролью «Администратор»): неопределенная Дата создания: Пт 12 ноября 2021 г.