В настоящее время я работаю над реализацией функции защиты от ссылок для своего бота Discord, используя Discord.js и базу данных Firebase Realtime. Предполагается, что эта функция удаляет любые сообщения, содержащие ссылки, внутри каналов сервера. Однако я столкнулся с проблемой, из-за которой бот не может удалить сообщения со ссылками.
Функция защиты от ссылок предназначена для включения/выключения на основе команд пользователя (включение/выключение защиты от ссылок). Когда эта функция включена, ожидается, что бот будет удалять любые сообщения, содержащие ссылки, в режиме реального времени. Я проверил, что бот успешно извлекает сообщения в канале и правильно идентифицирует сообщения со ссылками. Однако, несмотря на идентификацию сообщений со ссылками, бот не может удалить их должным образом.
// antilink.js
const { EmbedBuilder } = require('discord.js');
const db = require('../db/db.js'); //firebase
// Function to delete messages containing links
async function deleteMessagesWithLinks(channel) {
try {
const messages = await channel.messages.fetch(); // Fetch all messages in the channel
messages.forEach(msg => {
if (msg.content.match(/(http(s)?://[^\s]+)/g)) { // Check if the message contains a link
msg.delete()
.then(deletedMsg => console.info(`Deleted message: ${deletedMsg.content}`))
.catch(error => console.error('Error deleting message:', error));
}
});
} catch (error) {
console.error('Error fetching or deleting messages:', error);
}
}
// Command to toggle anti-link feature on/off and delete links
async function execute(message, args) {
if (!message.guild) return message.reply('This command can only be used in a server.');
const guildId = message.guild.id;
try {
if (args[0] === 'status') {
// Check the current status of the anti-link feature
const snapshot = await db.ref(`guilds/${guildId}/antilink/enabled`).once('value');
const isEnabled = snapshot.val();
// Send a message with the current status
const statusMessage = isEnabled ? 'enabled' : 'disabled';
const embed = new EmbedBuilder()
.setColor('#00ff00') // Example color
.setTitle(`Anti-link feature is ${statusMessage}`)
.setDescription(`Anti-link feature is currently ${statusMessage}.`);
return message.channel.send({ embeds: [embed] });
}
// Toggle anti-link feature on/off
const snapshot = await db.ref(`guilds/${guildId}/antilink/enabled`).once('value');
let isEnabled = snapshot.val();
if (args[0] === 'on') {
if (isEnabled) {
return message.channel.send('Anti-link feature is already enabled.');
}
isEnabled = true;
} else if (args[0] === 'off') {
if (!isEnabled) {
return message.channel.send('Anti-link feature is already disabled.');
}
isEnabled = false;
} else {
// If no argument is provided, display the current status
const status = isEnabled ? 'enabled' : 'disabled';
return message.channel.send(`Anti-link feature is currently ${status}.`);
}
// Update the anti-link feature status in the database
await db.ref(`guilds/${guildId}/antilink`).update({ enabled: isEnabled });
// Send a confirmation message with status
const statusMessage = isEnabled ? 'enabled' : 'disabled';
const embed = new EmbedBuilder()
.setColor('#00ff00') // Example color
.setTitle(`Anti-link feature has been ${statusMessage}`)
.setDescription(`Anti-link feature is now ${statusMessage}.`);
message.channel.send({ embeds: [embed] });
// If anti-link feature is enabled, delete messages with links
if (isEnabled) {
await deleteMessagesWithLinks(message.channel);
}
} catch (error) {
console.error('Error toggling anti-link feature:', error);
message.channel.send('An error occurred while toggling anti-link feature. Please try again later.');
}
}
// Export the command and the deleteMessagesWithLinks function in a single module.exports
module.exports = {
name: 'antilink',
description: 'Toggle anti-link feature on/off and delete links.',
execute,
deleteMessagesWithLinks
};
Функция deleteMessagesWithLinks отвечает за получение сообщений в канале и удаление сообщений, содержащих ссылки. Функция выполнения управляет включением/выключением функции защиты от ссылок на основе команд пользователя. Обе функции экспортируются из модуля и выполняются соответственно, когда бот получает соответствующие команды.
Я убедился, что у бота есть необходимые разрешения (например, MANAGE_MESSAGES) для удаления сообщений в канале. База данных Firebase Realtime настроена правильно, и бот может без проблем извлекать и обновлять из нее данные.
Мне нужны рекомендации по выявлению потенциальной причины этой проблемы и реализации решения, позволяющего гарантировать, что бот успешно удаляет сообщения, содержащие ссылки, когда включена функция защиты от ссылок.
Будем очень признательны за любые идеи, предложения или альтернативные подходы. Спасибо заранее за вашу помощь!
Примечание: версия — discord.js v14.
Я не могу быть на 100% уверен в причине вашей проблемы, не видя файла событий MessageCreate, но я думаю, что это, скорее всего, связано со структурой кода в прослушивателе событий MessageCreate. Функция «deleteMessagesWithLinks» не срабатывает после выполнения команды. Лучшее решение — поместить эту функцию в начало события MessageCreate.
Это должно выглядеть примерно так
discord.client.on('MessageCreate', (msg) => {
const guild = msg.guild;
const channel = msg.channel;
if (!msg.startsWith('prefix')) {
// check here for the link in msg.content
} else {
// execute cmd
}
}).setMaxListeners(0);