Command
Create a textual command
To create a command it is recommended to use the CLI to correctly generate the body of the command.
CLI pattern
Define message origin
Once your command is created, If you want handle messages from GuildChannels only or from DMChannel only, follow these steps.
Setup a cooldown
If you want to setup a cooldown, you simply need to add the coolDown property when you create the command, define the duration you want in milliseconds, and trigger the cooldown where you want in the command body. Example:
If you forget the message.triggerCoolDown()
in the command, a warn appear in server logs on loading of the command.
Arguments
ALl command can have a lots of arguments. This framework considers that Discord bot commands should resemble Unix commands in their syntax. You will therefore find some similarities between CLIs and the commands of your Discord bot.
The character is not a valid argument separator. If you want to break the line before putting an argument, add a space at the start of argument. (issue#19)
The name
and description
argument properties are obligatory.
Categories of arguments
There are three specific types of arguments based on the Yargs parser, here is a short overview.
The most common type of argument on Discord bots. It is used to define values according to their positioning in the command typed.
The last code example will be used like that on Discord:
!cmd "multiline value"
!cmd value
Required arguments
If argument is required, it will never have the null
value and will return an error message before the execution of the command if it is missing. The command will then not be executed.
Casting types
Yout can use the type
property to force a certain type of input and convert the textual input into an object of the type you want.
For example if I want the user to mention a member as positional, and retrieve the GuildMember
mentioned in the body of my command, I can use the type
property like this:
All types are available in src/types.ts
, and you can add custom types there. Please refer to the types file for an exhaustive list of existing types.
Middlewares
Middlewares are powerful tools that allow you to execute code before a command runs. They can be used for validation, data processing, or any other pre-command logic. In bot.ts, middlewares must be created in custom namespaces.
Creating a Middleware Namespace
First, create a namespace for your middlewares using the CLI:
When prompted, name your namespace (e.g., "middlewares").
Middleware Structure
A middleware file exports multiple instances of Middleware
. Here's a basic example:
Middleware Return Type
A middleware must return a MiddlewareResult
object with:
result
:true
to continue command executionfalse
to silently stop command executionstring
to stop command execution and display an error message
data
: Additional data to pass to the next middleware or command (optional)
Using Middlewares in Commands
To use middlewares in your commands, add them to the middlewares
array:
Middleware Chain
Multiple middlewares are executed in order. Each middleware can access data from previous middlewares through the data
parameter. The following example is useless, but it shows how middlewares can be chained together:
Best Practices
Always create middlewares in a custom namespace
Use descriptive names for your middlewares (it will be used for error handling and documentation)
Keep middleware logic focused and single-purpose
Handle edge cases and provide clear error messages
Document the data your middleware expects and provides
Create a slash command
Slash commands are Discord's native way to create interactive commands that appear when users type /
in a Discord channel. bot.ts provides a powerful system to create and manage slash commands with full TypeScript support.
Using the CLI
The easiest way to create a new slash command is to use the CLI:
The CLI will guide you through the process by asking:
The command name
A description for the command
Whether the command is guild-only
Whether the command is bot owner only
Whether the command will have subcommands or options
After answering these questions, a new file will be created in the src/slash
directory with your command name.
Command Structure
A slash command file exports a default instance of SlashCommand
. Here's a basic example:
Command Options
The SlashCommand
constructor accepts the following options:
name
string
The name of the command (required)
description
string
A description of what the command does (required)
channelType
"guild" | "dm" | "thread"
Where the command can be used
guildOnly
boolean
Whether the command can only be used in guilds
guildOwnerOnly
boolean
Whether the command can only be used by guild owners
botOwnerOnly
boolean
Whether the command can only be used by bot owners
userPermissions
PermissionsString[]
Required Discord permissions to use the command
allowRoles
RoleResolvable[]
Specific roles allowed to use the command
denyRoles
RoleResolvable[]
Specific roles denied from using the command
middlewares
Middleware[]
Custom middleware functions to run before the command
run
Function
The function that executes when the command is used
build
Function
Optional function to customize the command builder
Adding Command Options
You can add options to your slash command using the build
function:
Command Types
bot.ts provides TypeScript types to ensure type safety in your commands:
Registering Commands
Slash commands are automatically registered when your bot starts. For guild-specific commands, they are instantly available. For global commands, they may take up to an hour to propagate across Discord. If you set the BOT_GUILD_ID
environment variable, the slash commands will be registered to that guild.
Best Practices
Keep command names short and descriptive
Use clear descriptions that explain what the command does
Group related functionality using subcommands
Return or await all async calls in your
run
function for error handlingAdd appropriate permission checks for sensitive commands
Advanced Usage
For more complex commands, you can use subcommands and groups:
Last updated