#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,
});
});