【问题标题】:How to get all of the members of a guild with a certain role in discord.js v13如何在discord.js v13中获得具有特定角色的公会的所有成员
【发布时间】:2022-01-13 20:26:01
【问题描述】:

我目前正在开发一个 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 => 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.<anonymous> (/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) 又没有输出了。

【问题讨论】:

    标签: javascript node.js discord discord.js node-fetch


    【解决方案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 => role.name === "Admin") //the role to check
    const totalAdmin = role.members.map(m => m.id) // array of user IDs who have the role
    const totalMembers = totalAdmin.length // how many users have the role
    

    【讨论】:

    • 我更改了我的代码以包含您所说的更改我的代码以使用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 中使用过它,但仅此而已。
    • 尝试记录serverinfo.description
    • 当我这样做时,我意识到我的代码似乎停在let fetchedMembers = await interaction.guild.members.fetch(),我通过在前后放置console.log 语句来验证这一点。只有语句运行之前的那个。也许代码没有获取信息,或者无法获取信息?
    • 你有公会成员的意图吗?
    • 我有以下意图:const client = new Client({ intents: [Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MESSAGES, Intents.FLAGS.GUILD_MEMBERS] }); // create the client 公会成员包括在内。可能还值得注意的是,我稍微更改了我的代码,将成员保存在一个变量中,获取的角色,并更改了我的嵌入。此外,如果我将获取的成员存储在变量中并记录它,我会得到输出undefined。嵌入描述发送如下:成员:未定义管理员:(具有“管理员”角色的成员):未定义创建日期:2021 年 11 月 12 日星期五
    猜你喜欢
    • 2021-11-17
    • 2021-11-01
    • 2020-10-20
    • 1970-01-01
    • 1970-01-01
    • 2018-07-31
    • 2021-05-10
    • 2020-11-03
    • 2021-05-02
    相关资源
    最近更新 更多