Search...
K

This page is a follow-up and bases its code on the previous page.

Tip
Crawl's avatarCrawl
used
ping
Crawl's avatar

CrawlToday at 21:00

Pong!

Discord allows developers to register slash commands, which provide users a first-class way of interacting directly with your application. Before being able to reply to a command, you must first register it.

This section will cover only the bare minimum to get you started, but you can refer to our in-depth page on registering slash commands for further details. It covers guild commands, global commands, options, option types, and choices.

Create a deploy-commands.js file in your project directory. This file will be used to register and update the slash commands for your bot application.

Since commands only need to be registered once, and updated when the definition (description, options etc) is changed, it's not necessary to connect a whole client to the gateway or do this on every ready event. As such, a standalone script using the lighter REST manager is preferred.

Below is a deployment script you can use. Focus on these variables:

  • clientId: Your application's client id
  • guildId: Your development server's id
  • commands: An array of commands to register. The slash command builder from discord.js is used to build the data for your commands

In order to get your application's client id, go to Discord Developer Portal and choose your application. Find the id under "Application ID" in General Information subpage. To get guild id, open Discord and go to your settings. On the "Advanced" page, turn on "Developer Mode". This will enable a "Copy ID" button in the context menu when you right-click on a server icon, a user's profile, etc.

Tip
deploy-commands.js

_15
const { REST, SlashCommandBuilder, Routes } = require('discord.js');
_15
const { clientId, guildId, token } = require('./config.json');
_15
_15
const commands = [
_15
new SlashCommandBuilder().setName('ping').setDescription('Replies with pong!'),
_15
new SlashCommandBuilder().setName('server').setDescription('Replies with server info!'),
_15
new SlashCommandBuilder().setName('user').setDescription('Replies with user info!'),
_15
].map((command) => command.toJSON());
_15
_15
const rest = new REST({ version: '10' }).setToken(token);
_15
_15
rest
_15
.put(Routes.applicationGuildCommands(clientId, guildId), { body: commands })
_15
.then((data) => console.log(`Successfully registered ${data.length} application commands.`))
_15
.catch(console.error);

config.json

_10
{
_10
"clientId": "123456789012345678",
_10
"guildId": "876543210987654321",
_10
"token": "your-token-goes-here"
_10
}

Once you fill in these values, run node deploy-commands.js in your project directory to register your commands to a single guild. It's also possible to register commands globally.

You only need to run node deploy-commands.js once. You should only run it again if you add or edit existing commands.

Tip

Once you've registered your commands, you can listen for interactions via null in your index.js file.

You should first check if an interaction is a chat input command via null, and then check the null property to know which command it is. You can respond to interactions with null.


_16
client.once('ready', () => {
_16
console.log('Ready!');
_16
});
_16
_16
client.on('interactionCreate', async (interaction) => {
_16
if (!interaction.isChatInputCommand()) return;
_16
const { commandName } = interaction;
_16
if (commandName === 'ping') {
_16
await interaction.reply('Pong!');
_16
} else if (commandName === 'server') {
_16
await interaction.reply('Server info.');
_16
} else if (commandName === 'user') {
_16
await interaction.reply('User info.');
_16
}
_16
});
_16
client.login(token);

Note that servers are referred to as "guilds" in the Discord API and discord.js library. interaction.guild refers to the guild the interaction was sent in (a null instance), which exposes properties such as .name or .memberCount.


_11
client.on('interactionCreate', async (interaction) => {
_11
if (!interaction.isChatInputCommand()) return;
_11
const { commandName } = interaction;
_11
if (commandName === 'ping') {
_11
await interaction.reply('Pong!');
_11
} else if (commandName === 'server') {
_11
await interaction.reply(`Server name: ${interaction.guild.name}\nTotal members: ${interaction.guild.memberCount}`);
_11
} else if (commandName === 'user') {
_11
await interaction.reply('User info.');
_11
}
_11
});

Crawl's avatarCrawl
used
server
Crawl's avatar

CrawlToday at 21:00

Server name: discord.js Guide

Total members: 2

You could also display the date the server was created, or the server's verification level. You would do those in the same manner – use interaction.guild.createdAt or interaction.guild.verificationLevel, respectively.

Refer to the null documentation for a list of all the available properties and methods!

Tip

A "user" refers to a Discord user. interaction.user refers to the user the interaction was sent by (a null instance), which exposes properties such as .tag or .id.


_11
client.on('interactionCreate', async (interaction) => {
_11
if (!interaction.isChatInputCommand()) return;
_11
const { commandName } = interaction;
_11
if (commandName === 'ping') {
_11
await interaction.reply('Pong!');
_11
} else if (commandName === 'server') {
_11
await interaction.reply(`Server name: ${interaction.guild.name}\nTotal members: ${interaction.guild.memberCount}`);
_11
} else if (commandName === 'user') {
_11
await interaction.reply(`Your tag: ${interaction.user.tag}\nYour id: ${interaction.user.id}`);
_11
}
_11
});

Crawl's avatarCrawl
used
user
Crawl's avatar

CrawlToday at 21:00

Your tag: User#0001

Your id: 123456789012345678

Refer to the null documentation for a list of all the available properties and methods!

Tip

And there you have it!

If you don't plan on making more than a couple commands, then using an if/else if chain is fine; however, this isn't always the case. Using a giant if/else if chain will only hinder your development process in the long run.

Here's a small list of reasons why you shouldn't do so:

  • Takes longer to find a piece of code you want;
  • Easier to fall victim to spaghetti code;
  • Difficult to maintain as it grows;
  • Difficult to debug;
  • Difficult to organize;
  • General bad practice.

Next, we'll be diving into something called a "command handler" – code that makes handling commands easier and much more efficient. This allows you to move your commands into individual files.

null
Test