| name | create-command |
| description | Add Discord commands to the bot. Use when implementing new slash commands or message commands. |
Creating Commands
Quick Reference
Files to modify:
src/config/commandConfig.js - Add category (if needed) and command configuration
src/commands/<category>/<command>.js - Implement the command
For interactive UI commands: Also refer to the create-deact-element skill.
Step 1: Add Command Category (if needed)
If an appropriate category doesn't exist, add it to commandCategoryConfigRaw:
const commandCategoryConfigRaw = {
yourCategory: {
name: "Your Category",
description: "Description of this category",
folder: "yourCategory",
commands: ["yourcommand"],
},
};
Then create the directory: src/commands/yourCategory/
Step 2: Add to Category Commands List
Add your command name to the appropriate category's commands array:
yourCategory: {
commands: ["existingcommand", "yourcommand"],
},
Step 3: Add Command Configuration
Add your command to commandConfigRaw:
yourcommand: {
name: "Your Command",
aliases: ["yourcommand", "yc"],
description: "Short description for help text",
longDescription: "Detailed description shown in /help yourcommand",
execute: "yourCommand.js",
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,
money: 25,
},
Argument Types
| 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 |
Argument Options
| 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 |
Step 4: Implement the Command
Create src/commands/<category>/yourCommand.js:
const yourCommandMessageCommand = async (message) => {
};
const yourCommandSlashCommand = async (interaction) => {
};
module.exports = {
message: yourCommandMessageCommand,
slash: yourCommandSlashCommand,
};
Subcommands
For commands with subcommands (e.g., /party add):
Parent Command (entry point only)
party: {
name: "Party",
aliases: ["party"],
description: "Entry point for party commands",
subcommands: ["partyinfo", "partyadd", "partyremove"],
args: {},
stages: [stageNames.ALPHA, stageNames.BETA, stageNames.PROD],
},
Subcommand
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",
},
Naming convention: Subcommand ID is parentsubcommand (e.g., partyadd, tradeinfo).
Command Implementation Patterns
See references/ for implementation examples:
pattern-simple-command.md - Basic command without interactive UI
pattern-deact-command.md - Command using Deact for interactive UI
pattern-args-parsing.md - Parsing arguments from message and slash commands
Common Gotchas
-
Command 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/testing
stageNames.BETA - Beta testing
stageNames.PROD - Production
-
Argument 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.
Related Skills
create-deact-element - Creating interactive UI components
deact-component-callback - Handling button clicks and selections