Как получить всех членов гильдии с определенной ролью в discord.js v13

#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 г.