#javascript #node.js #discord #discord.js
#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
роли.
Комментарии:
1. Какая точная версия Discord.js используете ли вы?
2.
discord.js^12.3.1
Это текущая последняя версия. Вот почему я также использую.cache
. Подождите … разве я не написал это в названии ..? Я не думаю, что есть большая разница междуv12.1.x
,v12.2.x
иv12.3.x
.
Ответ №1:
Похоже, причина этого в том, что в гильдиях Discord есть роли по умолчанию, в основном, @everyone, и одна с именем bots, которую вы не можете удалить.
Я не знаю точно, как отличить эти роли «по умолчанию» от созданных, но похоже, что роль @everyone всегда Role.rawPosition
= 0, а роли ботов предпочитают занимать последнюю позицию в этом же индексе. Также на протяжении всего моего тестирования кажется, что роли ботов имеют Role.editable
= false. Созданные, но также @everyone, имеют это = true. Что немного сбивает с толку.
Имея это в виду, вам решать создать наилучший алгоритм для того, чего вы пытаетесь достичь. Но я могу обещать, что это небезопасно.
Если вы можете, если, указать роли, которые можно удалить, узел не должен аварийно завершать работу.
(CURA GAMER BOT — мой тестовый бот, поэтому первая роль не была создана вручную)
Я бы порекомендовал вам зарегистрировать весь ваш кэш ролей, по крайней мере, для тестирования, и проверить свойства ролей в other, чтобы выяснить, что подойдет вам лучше. Независимо от того, было ли ваше сомнение в том, что role.delete()
было надежным, да, похоже. Но я бы рекомендовал удалять одну роль за раз, в любом случае имея ссылку на ее объекты.
Вот некоторые тесты, которые сработали для меня (сценарий скриншота), которые могут работать, а могут и не работать для вас (используйте на свой страх и риск):
const roles = message.guild.roles.cache;
roles.forEach(role => {
// -1 because I have only on bot role
if(role.rawPosition > 0 amp;amp; role.rawPosition < (roles.size - 1)) {
role.delete();
}
});
const roles = message.guild.roles.cache;
roles.forEach(role => {
if(role.editable amp;amp; 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();
}
});
Комментарии:
1. Я описал в вопросе, что я пробовал это с удалением отдельных ролей, а не с массовым удалением. Кажется, что это не сработало, и хотя я согласен, что это может быть проблемой, это не мое, поскольку я только что протестировал это, и это не сработало.
2. Хм … благодаря моему тестированию все работало нормально. Может быть, у бота недостаточно разрешений?
3. Я имею в виду, что он не должен возвращать ошибку типа, например, роль не определена ни в одном из этих сценариев, но
Invalid Role
возможно, это может быть что-то связанное с этим? (Попробуйте протоколировать события:roleDelete
,error
илиinvalidated
)4. Ничего, это вообще не работает, и у моего бота есть разрешение
2146958847
. @GabrielAndrade
Ответ №2:
Это потому, что Collection.delete()
требуется key
, а не object
. Вместо того, чтобы передавать объект роли в качестве аргумента, вы должны передавать роль snowflake.
message.guild.roles.cache.delete('<Role ID>')
Кроме того, чтобы удалить все роли, вы можете использовать Collection.clear()
метод, который удаляет все элементы из коллекции.
message.guild.roles.cache.clear()
Комментарии:
1. В качестве дополнительного примечания,
Guild.roles.cache.delete('key')
илиGuild.roles.cache.clear()
удалите только роли из кэша, а не фактический объект роли в Гильдии.2. Не сработало, я попытался удалить роль , и она все еще существует .
3. Ах, @Jakye Я полагаю, именно поэтому вместо этого он возвращает пустые массивы.
4. Вы должны попробовать
.fetch()
вместо этого, так как это должно удалить роли, а не только кеш5. @Lioness100 я сделал , это первый кодовый блок, который я дал. Я также пробовал извлекать его отдельно (сам по себе, а не массово), и это тоже не работает.