Search code examples
javascriptdiscorddiscord.js

Detecting Application Commands Intended for Other Bots in Discord.js


I'm currently working on a Discord.js bot where I need to detect when users trigger application commands intended for other bots. I want to be able to track when a user sends a command like "/play" meant for a music bot, and then capture the interaction where the music bot responds.

Example: a user types "/play", thinking it will trigger the music bot, but my bot intercepts it and logs that it was intended for the music bot. Then, when the music bot responds to the user's command, my bot should detect this interaction and log that the music bot replied, possibly with additional details such as an embed containing a link.

My question is: Is it possible to achieve this functionality with Discord.js, and if so, how can I implement it effectively?

What I've tried:

client.on('interactionCreate', async (interaction) => {
    if (!interaction.isCommand()) return; // Ignore if not a slash command

    // Check if the command is "/play"
    if (interaction.commandName === 'play') {
        // Log that the /play command was detected for the music bot
        console.log("Detected /play command meant for music bot.");

        // Check if the music bot responds with an embed containing a link
        const filter = (response) => {
            return response.author.id === '123456789012345678' && response.embeds.length && response.embeds[0].title === "Music Bot Response" && response.embeds[0].description === "Here is your requested song: [Song Title](songlink)";
        };

        interaction.channel.awaitMessages({ filter, max: 1, time: 10000, errors: ['time'] })
            .then(async (collected) => {
                console.log("Detected music bot replied with an embed containing a link.");

                // logic for handling the music bot's response here
            })
            .catch((error) => {
                console.error('Error while waiting for music bot response:', error);
            });
    }
});


Solution

  • You cannot detect interactions sent to other bots (source)

    But you can listen for an interaction response from the bot (as long as it's not ephemeral)

    client.on('messageCreate', async message => {
        if (!message.guild) return; // Ignore messages outside a guild
    
        if (message.interaction) {
            // Message originates from an interaction
    
            // Check if the command is "/play"
            if(message.interaction.commandName === 'play') {
    
                // logic for handling the music bot's response here, e.g.
                console.log(`Detected /play command initiated by ${message.interaction.user.username}`)
    
            }
        }
    })
    

    The message.interaction object does not contain interaction options (docs)

    The only way to obtain the music link is if the bot sent it through it's reply