Docs/Plugins/Commands
Commands
How the command system works - prefix, slash opt-in, levels, overrides, and lockdowns.
Not a plugin - this page explains how commands themselves behave.
Setup checklist
- Open Setup > Access & Permissions and assign role or user levels. Start with 50 for moderators and 100 for administrators.
- Use the Would it run? resolver with a real member, command, and channel. Fix level, override, lockdown, or blacklist results until it says the command will run for the reason you expect.
- Run the prefix form in a test channel. Prefix commands need no Discord registration and are the quickest permission test.
- Open Slash Commands, opt in one command, save, and wait a few seconds.
- Invoke the slash command. If it does not appear, confirm the bot was invited with Discord's application commands scope and the plugin or feature is on.
- Repeat the resolver after every access-rule change. It uses the command's real built-in level and shows which rule won.
Start with narrow overrides and lockdowns. A plugin-wide rule affects every command in that plugin, including commands added later.
Reading a command listing
Every command table in these docs lists a command with its arguments:
{curly braces}mark a required argument. Leave it out and the command tells you what it needed.[square brackets]mark an optional argument.
So /tempban {user} {duration} [reason] needs a user and a duration, and
takes a reason if you want to give one. The names match the option names
Discord shows on the slash form, and the prefix form takes the same
arguments in the same order. A few commands also offer an extra slash-only
option, such as attaching an image, because Discord's slash form can carry a
file and a typed message cannot.
Prefix
Every command works as a prefix command (!ban @user reason); the prefix is
per-server (commands.prefix). Mentioning the bot does not run commands -
the text prefix is the only trigger.
A space after a symbol prefix means the message is not a command. !ban runs,
! ban does nothing at all - no infraction, no log, no reply. That is
deliberate: moderators often mime punishing each other with ! ban or
! slowmode, and a joke should never execute. The same applies to custom
commands.
If your prefix ends in a letter or a digit, the space is your separator
instead, so hep ban runs normally for a server whose prefix is hep. Both
forms work there: hep ban and hepban.
Slash commands
Slash commands are opt-in per server: the dashboard's Slash Commands page lists every available command grouped by plugin, and only what you tick gets registered in your server. Changes deploy within seconds of saving. Commands whose plugin is unconfigured (or whose feature is not granted) are flagged on that page so you do not register dead entries.
Levels
Who can run what is decided by numeric levels from your levels: config
(0 everyone, 10 trusted, 50 moderator, 100 admin). Each command has a
default; overrides can change it per server.
Overrides and lockdowns
commands.overrides matches commands by name, group, plugin, or everything,
and can disable them, change the required level, or set a per-user
cooldown in seconds - handy for opening something like rank up in a
busy general chat without the spam:
commands:
overrides:
- name: rank
out: {cooldown: 30}
The cooldown counts per member per command; moderators (level 50 and up)
are exempt, and a member still on cooldown gets told how long is left.
commands.lockdown
restricts where commands run: channel and category allow-lists, role
allow/exclude lists. The channel and category allow-lists combine - a
command runs in any channel you list AND anywhere under any category you
list, so you can fence a plugin into a whole category plus a couple of
stray channels outside it. Exclude lists always win over allow lists.
One limitation worth knowing: channel and category lockdown lists do not recognize threads - a thread is its own channel as far as Discord is concerned, so a command locked to a channel or category cannot be used inside threads or forum posts, even ones under an allowed channel. Role lists are unaffected.
A lockdown only ever narrows who and where - it never lowers a command's
level. To let a role use a command above its level (say, tags create,
which needs level 10), add an override that lowers the level, or give the
role a level on the Access form.
The Setup → Access & Permissions page edits both structurally and includes a resolver: pick command + channel + member, and it answers "would this run?" with the exact rule that decided. The resolver knows every command's built-in level (shown next to each command in the picker), so its answer matches what the bot actually does.
Blacklists
commands.local_blacklist / commands.bot_blacklist block users from using
the bot in your server; entries can carry reasons as YAML comments. The
dashboard's Blacklist page manages the same lists.
The two blacklists
They are not the same:
bot_blacklistmakes the bot ignore the member completely - commands, tags, custom-command triggers, XP, starboard stars, the lot.local_blacklistblocks commands only; everything else still counts.
Cooldowns and denial behaviour
commands.dm_denied (on by default) deletes the command message and DMs the member the reason they could not run it. Turn it off and a denied command is ignored silently, with nothing posted in the channel either way.
To switch a command off, give it an override with out: { disabled: true }.
To switch a whole plugin off, remove its plugins.<name>: block.
Troubleshooting
- Prefix works but slash does not appear: opt the exact command in and verify the bot invite includes application commands.
- Slash appears but is denied: registration and permission to execute are separate. Use Would it run? for the member and channel.
- A role seems ignored: a direct user entry in
levelsoverrides all of that user's role levels, including downward. - A thread is unexpectedly denied: channel and category lockdown allowlists do not include child threads automatically.
- A command is silent:
commands.dm_denied: falsedeliberately suppresses the denial explanation.