Advanced

Custom Commands

Build your own commands without writing code. Choose between simple text responses with dynamic variables, or the visual Block Editor, a drag-and-drop scripting system with conditions, loops, math, persistent storage, and embeds.

Overview

Custom commands are created and managed entirely from the dashboard: open your server, then Custom Commands in the sidebar. Every command has a trigger (what activates it) and a response. There are two response modes:

Text Response

A single message sent back when the command triggers. Supports all template variables. Perfect for FAQs, links, and quick info commands.

Visual Blocks

A sequence of drag-and-drop blocks executed top to bottom: send messages, add roles, check conditions, roll dice, store data, and more. No code required.

Four trigger types: command, exact match, contains, and regex
31 building blocks across 7 categories
Per-server persistent database for counters, scores, and state
Cooldowns scoped per user, channel, or server
Enable / disable commands without deleting them

Creating a Command

1

Open the Custom Commands page

In your server dashboard, click Custom Commands, then Create Command.

2

Set the trigger

Give the command a name/trigger and pick a trigger type. Optionally make it case-sensitive.

3

Choose a response mode

Pick Text for a simple reply, or Visual Blocks to open the block editor and build logic.

4

Save and test

Save the command and trigger it in your server. Changes apply instantly, no restart needed.

Trigger Types

TypeFires When
CommandThe message starts with the bot prefix + trigger (e.g. !hello)
Exact MatchThe whole message equals the trigger text exactly
ContainsThe trigger text appears anywhere in the message
RegexThe message matches your regular expression pattern
Careful with "Contains" and "Regex"

These can fire on normal conversation. Combine them with a cooldown, or use conditions inside the block editor to limit where they respond.

Template Variables

Variables use double curly braces and are replaced when the command runs. They work in text responses and in any text field inside blocks (messages, embed fields, database keys…).

User

VariableOutput
{{user}}Mentions the user (@Username)
{{user.id}}The user's Discord ID
{{user.username}}Username as plain text
{{user.displayname}}Server display name (nickname if set)
{{user.avatar}}URL of the user's avatar image

Server

VariableOutput
{{server}}Server name
{{server.id}}Server ID
{{server.membercount}}Current member count
{{server.icon}}URL of the server icon

Channel

VariableOutput
{{channel}}Mentions the channel (#channel)
{{channel.id}}Channel ID
{{channel.name}}Channel name as plain text

Arguments

Arguments are the words a user types after the trigger. For example, in !say hello world, the arguments are "hello world".

VariableOutput
{{args}}Everything after the trigger
{{args.0}}The first argument (then {{args.1}}, {{args.2}}…)

Custom Variables

Any variable you create with the Set Variable, Random Number, math, or database Get Value blocks becomes available as {{yourVariableName}} in all later blocks.

Text Response Example
Hey {{user}}, welcome to {{server}}! We're now {{server.membercount}} members strong.

The Block Editor

Blocks run from top to bottom. Drag them from the palette, fill in their settings, and reorder freely. Condition and loop blocks contain nested blocks that only run when their condition passes.

Actions

BlockWhat It Does
Send MessageSends a message to the channel
Reply to UserReplies directly to the triggering message
Send DMSends a private message to the user (silently skipped if their DMs are closed)
Add ReactionReacts to the triggering message with an emoji
Delete TriggerDeletes the message that triggered the command
Add RoleGives the user a role
Remove RoleRemoves a role from the user
WaitPauses execution for 1–60 seconds

Conditions

Each condition holds nested blocks that only run when it passes. Every condition can be negated ("if NOT…").

BlockPasses When
If Has RoleThe user has the selected role
If In ChannelThe command ran in the selected channel
If Is AdminThe user has the Administrator permission
If Message ContainsThe trigger message contains specific text
Random ChanceA configurable percentage roll succeeds (e.g. 25%)

Variables

BlockWhat It Does
Set VariableStores a value under a name for use as {{name}} later
User / Server / Channel / ArgumentsReference cards listing the built-in variables; they don't execute anything

Control Flow

BlockWhat It Does
RepeatRuns its nested blocks 1–10 times
StopImmediately ends command execution

Math

BlockWhat It Does
Random NumberStores a random integer between min and max in a variable
Add / Subtract / MultiplyComputes a result from two values and stores it in a variable

Embeds

BlockWhat It Does
Send EmbedSends a rich embed to the channel
Reply with EmbedReplies to the user with a rich embed

Database blocks get their own section below.

Command Database

The database blocks give your commands memory. Each server gets its own key-value store that persists between command runs, ideal for counters, scores, opt-in lists, and daily streaks.

BlockWhat It Does
Get ValueReads a key into a variable (with a default if missing)
Set ValueWrites a value to a key
Add to NumberIncrements a numeric key and stores the new total in a variable
Check ExistsStores whether a key exists (true/false) in a variable
Delete ValueRemoves a key entirely

User-Scoped Keys

Every database block has a user-scoped toggle. When enabled, the key is stored separately per user, so points with user-scope on gives every member their own counter, while the same key without user-scope is shared by the whole server.

Keys support variables too: a key like warnings-{{user.id}} achieves manual per-user storage if you need to mix scopes.

You can inspect and manage all stored values on the dashboard's Custom Commands → Database page.

Embeds

The embed blocks open a mini embed builder. Every field accepts template variables.

FieldDescription
TitleBold heading at the top of the embed
DescriptionMain body text (supports Discord markdown)
ColorHex color of the embed's side bar (defaults to teal)
AuthorSmall header line with optional icon URL
ThumbnailSmall image in the top-right corner
ImageLarge image below the description
FieldsName/value pairs, optionally displayed inline side by side
FooterSmall text at the bottom

Cooldowns

Prevent spam by setting a cooldown in seconds (0 = none). The scope decides who shares the timer:

ScopeBehavior
Per UserEach member has their own cooldown
Per ChannelOne timer per channel, shared by everyone in it
Per ServerOne global timer for the whole server

Examples

1. Simple FAQ (Text Response)

Trigger type Command, trigger ip:

Text Response
Our Minecraft server IP is **play.example.com**. See you there, {{user.displayname}}!

2. 8-Ball (Blocks)

Random Number min 1, max 4 → variable roll
If Message Contains "?", nested:
Reply to User The magic 8-ball says: answer #{{roll}}…
If Message Contains "?" (negated), nested:
Reply to User "That doesn't look like a question!"

3. Per-User Daily Counter (Blocks + Database)

Add to Number key daily-claims, user-scoped, +1 → variable total
Reply with Embed title Daily Reward, description {{user}} you've claimed {{total}} rewards so far!

4. Role-Gated Response (Blocks)

If Has Role @VIP, nested:
Reply to User "Welcome to the VIP lounge!"
Stop
Reply to User "You need the VIP role for this command."

5. Server Stats (Blocks + Embed)

Send Embed title {{server}} Stats, thumbnail {{server.icon}}, field Members = {{server.membercount}}

Limits & Tips

LimitValue
Wait block1–60 seconds per block
Repeat block1–10 iterations
TriggersCommands only fire for humans; bot messages are ignored
Role hierarchy

Add Role / Remove Role blocks only work if Natsumi's bot role is above the target role in the server's role list.

Build incrementally

Start with a Reply block to confirm the trigger works, then add conditions and storage one block at a time. Disabled commands keep their blocks, so you can pause a command while reworking it.