Add Discord commands to the bot. Use when implementing new slash commands or message commands.
Files to modify:
src/config/commandConfig.js - Add category (if needed) and command configurationsrc/commands/<category>/<command>.js - Implement the commandFor interactive UI commands: Also refer to the create-deact-element skill.
If an appropriate category doesn't exist, add it to commandCategoryConfigRaw:
const commandCategoryConfigRaw = {
// ... existing categories
yourCategory: {
name: "Your Category",
description: "Description of this category",
folder: "yourCategory",
commands: ["yourcommand"],
},
};
Then create the directory: src/commands/yourCategory/
Add your command name to the appropriate category's commands array:
yourCategory: {
// ...
commands: ["existingcommand", "yourcommand"], // Add here
},
Add your command to commandConfigRaw:
yourcommand: {
name: "Your Command",
aliases: ["yourcommand", "yc"], // First alias is the primary command name
description: "Short description for help text",
longDescription: "Detailed description shown in /help yourcommand",
execute: "yourCommand.js", // File in src/commands/<category>/
args: {
requiredArg: {
type: "string",
description: "Description of the argument",
optional: false,
variable: false,
},
optionalArg: {
type: "int",
description: "Optional argument",
optional: true,
variable: false,
},
},
stages: [stageNames.ALPHA, stageNames.BETA, stageNames.PROD],
exp: 10, // Optional: XP reward
money: 25, // Optional: Money reward
},
| Type | Discord.js Method | Description |
|---|---|---|
string |
getString() |
Text input |
int |
getInteger() |
Integer number |
bool |
getBoolean() |
True/false |
user |
getUser() |
@mentioned user |
channel |
getChannel() |
#channel reference |
| Property | Type | Description |
|---|---|---|
type |
string |
One of the types above |
description |
string |
Shown in slash command hints |
optional |
boolean |
Whether argument is required |
variable |
boolean |
If true, captures remaining args (string only) |
enum |
any[] |
Restrict to specific values |
Create src/commands/<category>/yourCommand.js:
const yourCommandMessageCommand = async (message) => {
// Parse args from message.content
// Execute command logic
// Send response via message.channel.send()
};
const yourCommandSlashCommand = async (interaction) => {
// Get args from interaction.options
// Execute command logic
// Send response via interaction.reply()
};
module.exports = {
message: yourCommandMessageCommand,
slash: yourCommandSlashCommand,
};
For commands with subcommands (e.g., /party add):
party: {
name: "Party",
aliases: ["party"],
description: "Entry point for party commands",
subcommands: ["partyinfo", "partyadd", "partyremove"], // List subcommands
args: {},
stages: [stageNames.ALPHA, stageNames.BETA, stageNames.PROD],
// NO execute property - parent is just an entry point
},
partyadd: {
name: "Party Add",
aliases: ["partyadd", "pa"],
description: "Add a Pokemon to your party",
execute: "partyAdd.js",
args: { /* ... */ },
stages: [stageNames.ALPHA, stageNames.BETA, stageNames.PROD],
parent: "party", // Reference to parent command
},
Naming convention: Subcommand ID is parentsubcommand (e.g., partyadd, tradeinfo).
See references/ for implementation examples:
pattern-simple-command.md - Basic command without interactive UIpattern-deact-command.md - Command using Deact for interactive UIpattern-args-parsing.md - Parsing arguments from message and slash commandsCommand ID must be alphabetic and lowercase: The config validates that command IDs have no capital letters.
Stages control availability: Only include stages where the command should be active:
stageNames.ALPHA - Development/testingstageNames.BETA - Beta testingstageNames.PROD - ProductionArgument names in slash commands: Use getString("argname") where argname is lowercase.
Variable arguments: Only the last argument can have variable: true.
Enum values: For args with enum, the values must match exactly what users can input.
create-deact-element - Creating interactive UI componentsdeact-component-callback - Handling button clicks and selections