【问题标题】:Discord.js v12 role.delete() doesn't workDiscord.js v12 role.delete() 不起作用
【发布时间】:2020-12-25 20:31:46
【问题描述】:

所以,我正在测试这个,当我使用这段代码时,它实际上并没有删除角色,这是一个错误吗?
关于代码:

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 角色。

【问题讨论】:

  • 您使用的是哪个版本的 Discord.js?
  • discord.js^12.3.1 是当前最新的。这也是我使用.cache 的原因。等等……我不是在标题里写了这个吗……?我认为v12.1.xv12.2.xv12.3.x 之间没有太大区别。

标签: javascript node.js discord discord.js


【解决方案1】:

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

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

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

message.guild.roles.cache.clear()

【讨论】:

  • 附带说明,Guild.roles.cache.delete('key')Guild.roles.cache.clear() 仅删除缓存中的角色,而不是公会中的实际角色对象。
  • 没用,我tried deleting a role 还是exists
  • 啊,@Jakye 我想这就是它返回空数组的原因。
  • 你应该尝试.fetch(),因为这应该删除角色而不仅仅是缓存
  • @Lioness100 我做了,这是我给出的第一个代码块。我也尝试单独获取它(单独获取,而不是大量获取),它也不起作用。
【解决方案2】:

似乎这是因为 Discord Guilds 有默认角色,主要是 @everyone,还有一个带有机器人名称的角色,您无法删除。

我不知道如何将这些“默认”角色与创建的角色区分开来,但似乎@everyone 角色似乎总是Role.rawPosition= 0 并且机器人角色喜欢占据相同的最后位置指数。同样在我的测试过程中,机器人角色似乎有Role.editable = false。创建的,还有@everyone,有它= true。这让事情有点混乱。

考虑到这一点,您可以自行决定为您想要实现的目标创建最佳算法。但我可以保证这是不安全的。

如果您自己如果可以删除可以删除的角色,Node 应该不会崩溃。

(CURA GAMER BOT是我的测试机器人,所以第一个角色不是手动创建的)

我建议您记录所有角色缓存,至少用于测试,并检查其他角色的属性以找出更适合您的内容。不管您是否怀疑 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();
  }
});

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

const roles = message.guild.roles.cache;

roles.forEach(role => {
  // Created after Tue Sep 08 2020 15:55:00 GMT-0500
  if(role.createdTimestamp > 1599598514000) {
    role.delete();
  }
});

【讨论】:

  • 我已经在问题中描述过,我已经尝试过删除单个角色而不是批量删除。似乎它不起作用,尽管我同意这可能是问题所在,但这不是我的问题,因为我刚刚对其进行了测试并且它不起作用。
  • 嗯...通过我的测试,它运行良好。也许机器人没有足够的权限?
  • 我的意思是,它不应该返回类型错误,比如在任何这些场景中角色未定义,但Invalid Role 可能与它相关? (尝试记录事件:roleDeleteerrorinvalidated
  • 没什么,它根本不起作用,我的机器人确实有权限2146958847。 @GabrielAndrade
猜你喜欢
  • 2022-01-09
  • 2021-03-02
  • 2021-01-18
  • 2020-10-11
  • 1970-01-01
  • 2021-05-19
  • 2021-06-30
  • 2020-10-19
  • 2021-08-04
相关资源
最近更新 更多