Discord.js v12 role.delete()不起作用

时间:2020-09-07 12:01:33

标签: javascript node.js discord discord.js

因此,我正在对此进行测试,当我使用此代码时,它实际上并没有删除角色,这是一个错误吗?
在代码上:

client.on('message', async message => {
  message.guild.roles.fetch()
    .then(r => r.forEach(s => 
      s.delete()
    ));
})

我也尝试了其他变体,例如:

client.on('message', async message => {
  message.guild.roles.cache.forEach(r => r.delete());
});
client.on('message', async message => {
  message.guild.roles.cache
    .map(r => r.id)
    .forEach(s => 
      message.guild.roles.cache.find(l => l.id === s)
        .delete()
    );
});
client.on('message', async message => {
  const roles = message.guild.roles.cache
    .map(r => r.id);
  for (m=0;m<roles.length;m++) {
    message.guild.roles.cache.find(s => s.id === roles[m])
      .delete();
  }
});

我什至试图不批量删除而只删除一个:

message.guild.roles.cache.find(s => s.id === 'ROLE_ID')
  .delete();

似乎没有一个起作用,并且它们都返回相同的错误:

TypeError: Cannot read property 'delete' of undefined

DiscordAPIError: Invalid Role

尽管我100%确定该角色确实存在并且有效。仅当我尝试删除角色时,才会发生此错误。当我尝试使用

检查服务器中的角色时
message.guild.roles.cache.map(r => r.id);

尽管服务器中有are个角色,但有时返回空白数组。

2 个答案:

答案 0 :(得分:0)

这是因为Collection.delete()需要key,而不是object。您应该传递角色雪花,而不是传递角色 object 作为参数。

message.guild.roles.cache.delete('<Role ID>')

此外,要删除所有角色,可以使用Collection.clear()方法,该方法将从集合中删除所有元素。

message.guild.roles.cache.clear()

答案 1 :(得分:0)

这似乎是因为Discord Guilds具有默认角色,主要是@everyone,以及具有bots名称的角色,您无法删除。

我不知道如何将这些“默认”角色与创建的角色区分开,但是@everyone角色似乎总是mode = 0,而bot角色喜欢占据最后位置相同的索引。在整个测试过程中,似乎机器人角色的Role.rawPosition = false。创建的人,还有@everyone,都具有= true。这使事情有些混乱。

请牢记这一点,您将根据自己的目标来创建最佳算法。但我可以保证这是不安全的。

如果您可以 if 自己担任可以删除的角色,则Node不会崩溃。

enter image description here (CURA GAMER BOT是我的测试机器人,因此第一个角色不是手动创建的)

我建议您记录所有角色缓存,至少用于测试,并检查其他角色的属性,以找出更适合您的角色。无论您是否怀疑Role.editable是否可靠,都是如此。但是我建议您一次删除一个角色,无论如何都要引用其对象。

以下一些对我有用的测试(屏幕截图)可能对您不起作用(使用风险自负):

 role.delete()
const roles = message.guild.roles.cache;

roles.forEach(role => {
  // -1 because I have only on bot role
  if(role.rawPosition > 0 && role.rawPosition < (roles.size - 1)) {
    role.delete();
  }
});

对我来说最安全,请根据时间戳删除:

const roles = message.guild.roles.cache;

roles.forEach(role => {
  if(role.editable && role.name !== '@everyone') {
    role.delete();
  }
});
相关问题