Бот Discord непреднамеренно рассылает спам-сообщения после ответа пользователя

#javascript #node.js #if-statement #discord #discord.js

Вопрос:

Я создаю бота discord, который в основном обнаруживает слово, которое пользователь отправляет в сообщении, и он ответит сообщением. Но проблема в том, что мой бот рассылает сообщение по электронной почте вместо того, чтобы отправить сообщение только один раз. Я не уверен, что происходит, я искал решение по всему Интернету и не мог его найти, поэтому я пришел сюда за помощью.

                 let Discord;
                let Database;
                if(typeof window !== "undefined"){
                    Discord = DiscordJS;
                    Database = EasyDatabase;
                } else {
                    Discord = require("discord.js");
                    Database = require("easy-json-database");
                }
                const delay = (ms) => new Promise((resolve) => setTimeout(() => resolve(), ms));
                const s4d = {
                    Discord,
                    client: null,
                    tokenInvalid: false,
                    reply: null,
                    joiningMember: null,
                    database: new Database("./db.json"),
                    checkMessageExists() {
                        if (!s4d.client) throw new Error('You cannot perform message operations without a Discord.js client')
                        if (!s4d.client.readyTimestamp) throw new Error('You cannot perform message operations while the bot is not connected to the Discord API')
                    }
                };
                s4d.client = new s4d.Discord.Client({
                    fetchAllMembers: true
                });
                s4d.client.on('raw', async (packet) => {
                    if(['MESSAGE_REACTION_ADD', 'MESSAGE_REACTION_REMOVE'].includes(packet.t)){
                        const guild = s4d.client.guilds.cache.get(packet.d.guild_id);
                        if(!guild) return;
                        const member = guild.members.cache.get(packet.d.user_id) || guild.members.fetch(d.user_id).catch(() => {});
                        if(!member) return;
                        const channel = s4d.client.channels.cache.get(packet.d.channel_id);
                        if(!channel) return;
                        const message = channel.messages.cache.get(packet.d.message_id) || await channel.messages.fetch(packet.d.message_id).catch(() => {});
                        if(!message) return;
                        s4d.client.emit(packet.t, guild, channel, message, member, packet.d.emoji.name);
                    }
                });
                s4d.client.login('tokenNumber').catch((e) => { s4d.tokenInvalid = true; s4d.tokenError = e; });



s4d.client.on('message', (s4dmessage) => {
  if (s4dmessage.content.includes('oranges')) {
    s4dmessage.channel.send(String('Yum! I love eating oranges!'));
  }

}
);

                s4d;
            
 

Ответ №1:

Ваш бот проверяет, содержит ли сообщение слово «апельсин», и если да, отправляет ответ, что ему нравится есть апельсины. Поскольку в ответе также содержится слово «оранжевый», ваш бот повторяет эту функцию до тех пор, пока вы не будете ограничены в скорости.

Убедитесь, что вы проверили, является ли автор сообщения ботом, и если это так, просто выйдите с помощью return :

 s4d.client.on('message', (s4dmessage) => {
  if (s4dmessage.author.bot) return;
  if (s4dmessage.content.includes('oranges')) {
    s4dmessage.channel.send(String('Yum! I love eating oranges!'));
  }
});