我怎样才能从 Discord.js v13 中拥有它的每个人中删除特定角色

How can I remove a specific role from everyone that has it in Discord.js v13

我希望我的机器人在频道中发送消息时从拥有它的每个人中删除特定角色

client.on('messageCreate', async message => {

        if(message.channel.id === '954375143965216869'){ //counting
            message.guild.roles.get('944674567811645472').members.map(m=>m.member.id).delete();

            
        }
})

我正在使用 discord.js v13 和 node.js v16.4.2

这应该可行,它将获取公会中的所有成员,并为每个成员删除指定的角色。另请注意,您需要适当的网关意图才能 运行 这取决于公会规模,这可能需要几分钟。我不建议 运行 每次发送消息时都使用它,因为它会让你的速率限制非常快。

message.guild.members.fetch().then(m => {
    m.forEach(member => {
        let role = message.guild.roles.cache.get("roleid");
        member.roles.remove(role)
    })
})

此外,如果您的公会太大以至于由于速率限制而变得太慢,请尝试下面的代码,以便每次更改都有延迟。

message.guild.members.fetch().then(m => {
    m.forEach(member => {
        let role = message.guild.roles.cache.get("roleid");
        setTimeout(() => {
            member.roles.remove(role)
        }, 1000);
    })
})

正如 SP73 所说,将它放在您的 messageCreate 事件中将使您的速率限制更快。试着把它放在你准备好的事件上。这将使所提供服务器的每个成员都进入缓存(我确定您没有经过验证的机器人,因此 discord.js 很可能会为您将其保存在缓存中)并且只有 select 那些谁有这个角色,然后对于每个人,延迟 1500 毫秒(1 秒半),从他们那里删除角色。

client.on('ready',() =>{
  let n = 0;
  let { members } = client.guilds.cache.get("GUILD_ID");
  members.filter(m => m.roles.cache.has("ROLE_ID")).forEach(member => {
    setTimeout(() => member.roles.remove("ROLE_ID"), (++n) * 1500);
  })
})