Как удалить определенную роль у всех, у кого она есть Discord.js v12

#javascript #node.js #discord #discord.js

Вопрос:

Использование Discord.js (V12)

В настоящее время я пытаюсь создать сценарий, который делает так, чтобы, когда кто-то говорит «что», бот отвечал «Вы застряли с этим!», а затем давал пользователю роль. Но я хочу, чтобы, когда следующий человек скажет, что именно, он снимет эту роль с предыдущего владельца. В настоящее время он работает там, где он может добавлять роль, но не удалять ее у предыдущего человека.

Вот мой текущий рабочий код:

 module.exports = {
  name: 'what',
  description: 'Responds with You are stuck with it and adds role!',
  execute(message, args) {
    message.channel.send('You are stuck with it!');
    message.member.roles.add('886996311117795429')
  }
}
 

Комментарии:

1. Просто сохраните message.member в переменной за пределами вашего module.exports , например var previousMember , в конце вашего execute() метода после добавления к ним роли. Затем добавьте if (previousMember) previousMember.roles.remove("role id") в начало свое execute() . Это очень просто. Если этого недостаточно для вас, вы можете выполнить поиск в кэше членов гильдии и отфильтровать всех участников, у которых есть роль с заданным идентификатором роли, а затем использовать .remove() каждого из них.

Ответ №1:

Проблема объявления переменной внутри вашего кода, как предложил @Cannicide, заключается в том, что если бот выйдет из строя и вам нужно будет загрузить его снова, эта переменная будет потеряна.

Самый простой способ сохранить данные даже после перезапуска-это использовать quick.db

 //your other stuff if you have any
const db = require('quick.db')

module.exports = {
  name: 'what',
  description: 'Responds with You are stuck with it and adds role!',
  execute(message, args) {
    message.channel.send('You are stuck with it!');
    message.member.roles.add('886996311117795429')
    if(db.get('previousRoleUser')){
          let prevUser = message.guild.members.cache.find(m => m.id === db.get('previousRoleUser'));
          if(prevUser){
                prevUser.roles.remove('886996311117795429')
          }
    db.set('previousRoleUser', message.author.id)
  }
}
 

Приведенный выше код является просто примером, который не тестируется. Но я думаю, что это как — то сработало бы. Просто установите значение предыдущего пользователя в quick.db, а затем извлеките оттуда информацию, когда захотите ее использовать.

Комментарии:

1. Вы также можете использовать сообщение.гильдия.участники.кэш. функция фильтрации также была бы более эффективной, так как иногда присоединение базы данных добавляет много путаницы некоторым программистам, как правило, с хорошими ответами!!

2. Честно говоря, я бы просто использовал кэш членов гильдии (или извлекал членов гильдии), как мы с Jeffplays2005 упоминали в наших комментариях. Устраняет необходимость в сохранении каких-либо данных, будь то в переменной или базе данных. Тем более, что даже если бот выйдет из строя, этот подход все равно будет работать так же хорошо, как и база данных. Хотя в любом случае работает.