Skip to content

Slash Command Extras ​

Slash Commands have some unique features unlike messageCommand and userCommand.

Options ​

Slash commands can take options. These could be variables like strings, numbers, or even channels. JellyCommands uses discord.js's system to provide a nice API on top.

See all available options.

Providing Options ​

You can provide options with the options property.

js
import { command } from 'jellycommands';

export default command({
    name: 'Command Name',
    description: 'A short description of what the command does',
  
    options: [
        {
            type: 'Channel',
            name: 'channel',
            description: 'Channel to send a message into',
            required: true,
        },
    ],

    run: ({ interaction }) => {
        // We set the second argument to true as this option is marked as required 
        const channel = interaction.options.getChannel('channel', true);

        // We can then use this channel!
        console.log(channel.name)
    }
});

Unlike the discord.js built in options, you can provide the option type as a string. If you prefer, however, you can provide it as an enum.

js
import { ApplicationCommandOptionType } from 'discord.js';
import { command } from 'jellycommands';

export default command({
    options: [
        {
            type: ApplicationCommandOptionType.Channel,
            name: 'channel',
            description: 'Channel to send a message into',
            required: true,
        },
    ],
})

Autocomplete ​

Some Slash Command Options support the autocomplete property. When set to true, you can use the autocomplete handler.

For example, let's write a command that returns a color and provides autocomplete on the color names:

js
import { command } from 'jellycommands';

const colors = [
    'Violet',
    'Indigo',
    'Blue',
    'Green',
    'Yellow',
    'Orange',
    'Red',
];

export default command({
    name: 'rainbow',
    description: 'send a rainbow',

    global: true,

    options: [
        {
            type: 'String',
            name: 'color',
            description: 'The color of the thing idk',
            required: true,
            // Enable autocomplete
            autocomplete: true,
        },
    ],

    run: ({ interaction }) => {
        interaction.reply(interaction.options.getString('color', true))
    },

    autocomplete: async ({ interaction }) => {
        // Get the name of the option that is being autocompleted
        const focused = interaction.options.getFocused(true);

        if (focused.name === 'color') {
            // Respond with 3 colours that match the current string
            interaction.respond(
                colors
                    .filter((color) => color.startsWith(focused.value))
                    .map((color) => ({ name: color, value: color }))
                    .slice(0, 3),
            );
        }
    },
});

MIT Licensed