Discord.js роль версии 12.delete() не работает

#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 я сделал , это первый кодовый блок, который я дал. Я также пробовал извлекать его отдельно (сам по себе, а не массово), и это тоже не работает.