#javascript #discord.js
#javascript #discord.js
Вопрос:
Я пытаюсь создать защиту от спама, и когда бот должен редактировать разрешение отключенной роли для каждого канала, ничего не происходит.
Итак, сначала я создаю роль
const mute_role = message.guild.roles.cache.find(r => r.name == "Muted");
if (!mute_role) {
try {
mute_role = await message.guild.roles.create({
data: {
name: "Muted",
color: "#000000",
permissions: []
}
})
Затем я редактирую разрешения роли на всех каналах гильдии
message.guild.channels.cache.forEach(async (channel, id) => {
await channel.updateOverwrite(mute_role,
{
SEND_MESSAGES: false,
ADD_REACTIONS: false,
}
);
});
} catch (e) {
console.log(e.stack);
}
}
И после этого он должен перейти к остальной части кода, но, похоже, он пропускает эту часть, потому что он продолжает антиспам и добавляет роль, если запускается спам
Вот полный код для защиты от спама
bot.on('message', async message => {
if (message.author.bot) return;
const mute_role = message.guild.roles.cache.find(r => r.name == "Muted");
if (!mute_role) {
try {
mute_role = await message.guild.roles.create({
data: {
name: "Muted",
color: "#000000",
permissions: []
}
})
message.guild.channels.cache.forEach(async (channel, id) => {
await channel.updateOverwrite(mute_role,
{
SEND_MESSAGES: false,
ADD_REACTIONS: false,
}
);
});
} catch (e) {
console.log(e.stack);
}
}
if (usersMap.has(message.author.id)) {
const userData = usersMap.get(message.author.id);
const { lastMessage, timer } = userData;
const difference = message.createdTimestamp - lastMessage.createdTimestamp;
let msgCount = userData.msgCount;
console.log(difference);
if (difference > DIFF) {
clearTimeout(timer);
console.log('Cleared timeout');
userData.msgCount = 1;
userData.lastMessage = message;
userData.timer = setTimeout(() => {
usersMap.delete(message.author.id);
console.log('Removed from RESET');
}, TIME);
usersMap.set(message.author.id, userData);
}
else {
msgCount ;
console.log(msgCount)
if (parseInt(msgCount) === LIMIT) {
message.member.roles.add(mute_role);
message.channel.send(`${message.author} has been muted for spamming`);
setTimeout(() => {
message.member.roles.remove(mute_role);
message.channel.send(`${message.author} has been unmuted`);
}, TIME);
}
else {
userData.msgCount = msgCount;
usersMap.set(message.author.id, userData);
}
}
}
else {
let fn = setTimeout(() => {
usersMap.delete(message.author.id);
console.log('Removed from map');
}, TIME);
usersMap.set(message.author.id, {
msgCount: 1,
lastMessage: message,
timer: fn
})
}
})
Ответ №1:
Хорошо, я только что узнал, почему это не работает
Вместо того, чтобы использовать
const mute_role = message.guild.roles.cache.find(r => r.name == "Muted");
Мне просто пришлось использовать
let mute_role = message.guild.roles.cache.find(r => r.name == "Muted");
Комментарии:
1. Отметьте это как правильный ответ и закройте свой вопрос, чтобы другим, у кого может возникнуть такая же проблема, было легче найти правильное решение.