Перезапись разрешений для discord bot для отключения роли во всех текстовых / голосовых каналах

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

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

Вопрос:

Я пытаюсь создать discord-бота. Когда я набираю ?mute @role , я хочу, чтобы мой бот создал «Отключенную» роль и удалил SEND_MESSAGES SPEAK разрешения и для этой роли в каждом канале на сервере. У меня есть это там, где он добавит роль человеку, но пока я не могу заставить его устанавливать разрешения. Я использую discord.js v12. Мой код приведен ниже. Потерпите меня, потому что я не разбираюсь в javascript, и я раньше не публиковал вопросы в StackOverflow.

 if (!message.member.permissions.has('KICK_MEMBERS'))
 return message.channel.send(
  "*You don't have permission to use this command.*"
 );

const role = message.guild.roles.cache.find((role) => role.name === 'Muted');

const member3 = message.guild.member(user);

if (!role) {
 message.guild.roles
  .create({
   data: {
    name: 'Muted',
    color: 'GREY',
   },
   reason: 'Created role to mute member',
  })
  .then(console.log)
  .catch(console.error);
}

if (!user) {
 message.channel.send(`There's no person to mute tho`);
 return;
}

if (member3.permissions.has('ADMINISTRATOR')) {
 return message.channel.send(`I can't mute ${user} because he is staff`);
}

const roleMute = message.guild.roles.cache.find(
 (role) => role.name === 'Muted'
);

message.guild.channels.cache.forEach((channel) => {
 channel.updateOverwrite(channel.guild.roles.roleMute, {
  SEND_MESSAGES: false,
  SPEAK: false,
 });
});

member3.roles.add(roleMute);
  

Ответ №1:

Вы почти все поняли правильно. Попробуйте это, чтобы создать свою роль и перезаписать разрешения. Рекомендуется помещать оба в try...catch блок, чтобы при возникновении ошибки она обрабатывалась.

 try {
 role = await message.guild.roles.create({
  data: {
   name: 'Muted',
   color: '#514f48',
   permissions: [],
  },
 });
 message.guild.channels.cache.forEach(async (channel, id) => {
  await channel.updateOverwrite(role, {
      SEND_MESSAGES: false,
      SPEAK: false,
      ADD_REACTIONS: false,
      SEND_TTS_MESSAGES: false,
      ATTACH_FILES: false 
  })
 });
} catch (e) {
 console.log(e.stack);
}
  

Как только это будет сделано, вы можете оставить эту часть в своем коде

 message.guild.channels.cache.forEach((channel) => {...}
  

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

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

Ответ №2:

Ваша проблема в этих строках:

 message.guild.channels.cache.forEach((channel) => {
 channel.updateOverwrite(channel.guild.roles.roleMute, {
  SEND_MESSAGES: false,
  SPEAK: false,
 });
});
  

Вы пытаетесь получить доступ к roleMute переменной, как если бы она была свойством GuildRoleManager объекта (которым она не является). Поскольку вы только что определили roleMute как единственную переменную:

 const roleMute = message.guild.roles.cache.find(
 (role) => role.name === 'Muted'
);
  

Все, что вам нужно сделать, это указать эту переменную в качестве параметра.

 message.guild.channels.cache.forEach((channel) => {
 channel.updateOverwrite(roleMute, {
  SEND_MESSAGES: false,
  SPEAK: false,
 });
});