Проблема с функцией защиты от ссылок Discord Bot: ссылки не удаляются

**Описание проблемы:

В настоящее время я работаю над реализацией функции защиты от ссылок для своего бота 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.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
65
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я не могу быть на 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);

Другие вопросы по теме