因此,我正在对此进行测试,当我使用此代码时,它实际上并没有删除角色,这是一个错误吗?
在代码上:
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
个角色,但有时返回空白数组。
答案 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不会崩溃。
(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();
}
});