# The complete command table

48 user-facing slash commands — 16 public, 2 group-admin, 30 owner-or-staff — plus the bare-uppercase `STOP` and `UNDO` keywords and an unbounded set of per-bot dynamic commands. 5 further slash spellings are Memescale platform-admin or fleet-operator tooling and are excluded entirely.

## How this table works

Every built-in command is matched by one regular expression, `^/?(?:name)(@\w+)?(\s|$)`, case-insensitive (`cmd_re`, `scripts/telegram/utils/commands.py:25-26`). The leading slash is optional, an `@<botusername>` suffix is accepted, and case never matters, unless a row below says the slash is required — a minority of built-ins are matched by a hand-written pattern instead of `cmd_re`, and a few of those also refuse the `@bot` suffix.

*cmd\_re(name) — the default pattern*

```
^/?(?:name)(@\w+)?(\s|$)
```

#### The five columns

| Setting | Value |
| --- | --- |
| Command | The spelling(s) that trigger it, with its aliases and whether `@<botusername>` and the leading slash are required or optional. |
| Who | Who the code allows to send it and have it act. "Owner or staff" means the bot's Memescale owner, pinned by their first `/start`, or a Memescale platform-admin username — never a Telegram group's own admins by that role alone. |
| Chats | Which chat types the route itself accepts: DM (private), group (group + supergroup), or any. |
| Menu scope | Where the command is suggested in Telegram's own `/` autocomplete list — never where it merely works. |

*Menu-scope legend*

| Menu scope value | Telegram scope | Meaning |
| --- | --- | --- |
| private | `all_private_chats` | Suggested in every DM with the bot. |
| group | `all_group_chats` | Suggested in every group and supergroup. |
| admin | `all_chat_administrators` | Suggested only to that chat's Telegram admins. |
| owner overlay | a per-chat / per-user override | Suggested only to the bot's owner or Memescale staff, layered on top of whichever default scope they'd otherwise see. |
| none | — | Never suggested anywhere. Works when typed from memory; Telegram never autocompletes it. |

A chat that isn't authorized for the bot at all gets an empty command menu pushed deliberately, regardless of any row below — see Groups and access, chapter 1.2.

> **Platform-admin commands are not documented here**
>
> 5 further slash spellings are Memescale platform-admin or fleet-operator tooling, restricted to platform staff or two hardcoded usernames in one hardcoded chat: `/newbot`, `/topicid`, `/updatepfp`, `/id`, `/fleet`. They are intentionally excluded from the table below.

* [Groups and access](#menu-access-groups)

## Public commands

16 spellings, subject to whatever authorization or toggle each row states — "public" describes who the code lets try, not that every attempt succeeds.

*16 public spellings, 14 rows (2 rows carry an alias)*

| Command | Who | Chats | Menu scope | What it does |
| --- | --- | --- | --- | --- |
| `/start` (`@bot` ok, slash required) | Anyone — DM only | private | none | Owner or staff: opens the `/menu` card (prefixed, on the very first run only, with the notifications-on message). Anyone else: `Hi, I'm <bot name>.` |
| `/authorize` (`@bot` ok, slash optional) | Anyone sends it; only an owner/staff send actually authorizes | any | none | Owner or staff: authorizes the current chat. Anyone else: silently recorded as discovered — no reply either way for them. |
| `/holders` (`@bot` ok, slash optional) | Anyone — no authorization check | any | group + admin, once configured | Live holder count for the bot's configured token. |
| `/getid` (`@bot` ok, slash optional) | Anyone; an owner/staff send also authorizes the chat | any | none | Replies with the chat's numeric id and records the chat as discovered. |
| `/mycalls` (`@bot` ok, slash optional) | Anyone with a real Telegram user id | any | none | The sender's own scanner call history on this bot. |
| `/viewallcalls` (`@bot` ok, slash optional) | Anyone in the group | group | none | Every call made in the current group. |
| `/leaderboard [window]` (`@bot` ok, slash optional) | Anyone in the group | group | none | Caller leaderboard for the current group, optionally windowed to `1d` / `7d` / `30d`. |
| `/raid <tweet> <goals>` (`@bot` ok, slash required) | Owner/staff in any chat; a DM-authorized username in a DM; any member of an allowed group | DM, group, supergroup — `is_authorized` decides which | none | Posts a tweet-engagement raid board. |
| `/newpack`, `/emojipack` (`@bot` ok, slash required) | Any member of an authorized group; owner/staff or a DM-authorized username in a DM | DM, group, supergroup | private + group (`/emojipack` itself: none — alias only) | Opens the emoji-pack wizard: a 3D coin, or — with premium emoji already pasted in the same message — a static pack of exactly those. |
| `/staticemoji` (`@bot` ok, slash required) | Same authorization as `/newpack` | DM, group, supergroup | none | Opens the static (non-3D) emoji-pack wizard directly. |
| `/mypacks` (`@bot` ok, slash required) | Same authorization as `/newpack`, with no DM-resolvable prerequisite | DM, group, supergroup | private + group, while the packs toggle is on | Lists the sender's saved emoji packs, 10 per page. |
| `/presets` (`@bot` ok, slash required) | Anyone — no owner, admin or authorization check at all | any | none | Opens the inline preset picker for the next photo sent or replied to. |
| `/cancelpresets` (`@bot` ok, slash required) | Anyone cancels their own run; platform staff cancel anyone's | any | none | Cancels an in-flight Try All / Random N preset batch in the chat. |
| `/download`, `/mp3` (`@bot` ok, slash required) | Anyone in an authorized chat | any | private + group + admin, while `social_dl_enabled` (listed as `download` only — `/mp3` never appears in the menu) | Sends a 45-second hint to paste a SoundCloud or YouTube link. The actual download is a passive link match, not this command — `/download <link>` and `/mp3 <link>` work because the message already contains the link. |

## Group-admin commands

Both exist only once **Admin Moderation** is switched on in the dashboard — off by default. The route itself is always registered; with the toggle off, `moderate()` returns before doing anything, and the route has already consumed the message — so a disabled `/ban` or `/mute` is silent, not an error.

| Command | Who | Chats | Menu scope | What it does |
| --- | --- | --- | --- | --- |
| `/ban` (`@bot` ok, slash required) | A Telegram admin of that specific group, checked live — not the bot's owner/staff by that role alone | group | admin, while the moderation toggle is on | Bans the replied-to or @-mentioned target and purges their tracked message history in the group. |
| `/mute` (`@bot` ok, slash required) | Same as `/ban` | group | admin, while the moderation toggle is on | Restricts the target from sending anything and from group-management actions, for 24 hours. There is no `/unmute`. |

* [Moderation](#owner-moderation)

## Owner-or-staff commands

30 spellings, 24 rows. Every command below shares one gate: the bot's Memescale owner or a Memescale platform-admin username — never a Telegram group's own admin standing, in any group. A non-owner sending one of the buy-bot commands gets no reply at all; tapping a buy-bot button as a non-owner gets the alert `Owner / admins only`.

#### General

*8 rows, 10 spellings*

| Command | Who | Chats | Menu scope | What it does |
| --- | --- | --- | --- | --- |
| `/showlimits` (`@bot` ok, slash optional) | Owner or staff | private — DM only | none | HTML list of every blocked user and every rate-limited user configured for the bot. |
| `/whichport` (no `@bot`, slash required, exact match only) | Owner or staff | private — DM only | none | Reports the GPU bridge's port and a live health probe. |
| `/whichlora` (no `@bot`, slash required, exact match only) | Owner or staff | private — DM only | none | One two-line block per character: its LoRA file and whether it's currently loaded on the GPU. |
| `/whoisactive` (`@bot` ok, slash optional) | Owner or staff | any | none | Live probe of what the GPU is generating right now and what's queued behind it. |
| `/menu`, `/options`, `/help` (`@bot` ok, slash optional) | Owner or staff | any | none | Opens the settings card: feature toggles and Manage Groups. Telegram group admins cannot open it. |
| `/showrefs [trigger]` (`@bot` ok, slash required) | Owner or staff | any | none | Posts the character's stored reference images (up to 4) with a Delete button per image. |
| `/addrefs [trigger]` (`@bot` ok, slash required) | Owner or staff | any | none | Adds a reference image, up to 4 per character, from an attached or replied photo, or prompts and waits for one. |
| `/forkbuybot [paste]` (`@bot` ok, slash required) | Owner or staff | Private, group, supergroup | none | Forks another bot's buy post — text, formatting and media — into this bot's buy-bot layout. Writes body text, size emoji and media only; never enables the bot and never adds a group. |

#### Buy bot

*16 rows, 20 spellings — one gate, `buybotctl.py`'s `is_owner(...)`, no chat-type restriction on any of them*

| Command | Who | Chats | Menu scope | What it does |
| --- | --- | --- | --- | --- |
| `/enablebuybot` (`@bot` ok, slash required) | Owner or staff | Group, DM | none | Turns the buy bot on. In a group: authorizes that group and adds it as a posting target (max 10). Asks for the contract address first if none is set. |
| `/minbuy <amount>` (`@bot` ok, slash required) | Owner or staff | Group, DM | none | Sets the minimum USD buy size that gets posted. |
| `/buyemoji <emoji>` (`@bot` ok, slash required) | Owner or staff | Group, DM | none | Sets the emoji used in the buy-size row — premium or plain. |
| `/buybotimage` (`@bot` ok, slash required) | Owner or staff | Group, DM | none | Sets the buy media (image, GIF or video) — attach it, or send it as the next message. |
| `/buybotgroups` (`@bot` ok, slash required) | Owner or staff | Group, DM | none | Opens the buy bot's own group-target picker — separate from Manage Groups. |
| `/buybotsettings`, `/buybotmenu`, `/buybot` (`@bot` ok, slash required) | Owner or staff | Group, DM | owner overlay — the only user-facing command listed there | Opens the full settings card: on/off, groups, min buy, emoji, media, links, token, fork or view the layout. |
| `/buybothelp`, `/buybotcommands` (`@bot` ok, slash required) | Owner or staff | Group, DM | none | Sends the plain-text command list (`HELP_TEXT`) — it omits `/buybotdiscord`, `/buybotdocs`, `/buybotmedium`, `/buybotreddit` and `/buybotgithub`, all five of which work like the other link commands. |
| `/repeatlastbuy` (`@bot` ok, slash required) | Owner or staff | Group, DM | none | Reposts the last recorded buy through the current layout, media and emoji. |
| `/buybotwebsite` (`@bot` ok, slash required) | Owner or staff | Group, DM | none | Sets the website link. |
| `/buybotx`, `/buybottwitter` (`@bot` ok, slash required) | Owner or staff | Group, DM | none | Sets the X (Twitter) link. |
| `/buybottelegram` (`@bot` ok, slash required) | Owner or staff | Group, DM | none | Sets the Telegram link. |
| `/buybotdiscord` (`@bot` ok, slash required) | Owner or staff | Group, DM | none | Sets the Discord link. |
| `/buybotdocs` (`@bot` ok, slash required) | Owner or staff | Group, DM | none | Sets the docs link. |
| `/buybotmedium` (`@bot` ok, slash required) | Owner or staff | Group, DM | none | Sets the Medium link. |
| `/buybotreddit` (`@bot` ok, slash required) | Owner or staff | Group, DM | none | Sets the Reddit link. |
| `/buybotgithub` (`@bot` ok, slash required) | Owner or staff | Group, DM | none | Sets the GitHub link. |

* [Commands and the settings card](#buybot-commands-table)
* [Reference images](#tools-reference-images)
* [Queue and GPU status](#tools-queue-gpu-status)

## STOP, UNDO, and dynamic commands

#### STOP and UNDO

| Command | Who | Chats | Menu scope | What it does |
| --- | --- | --- | --- | --- |
| `STOP` (bare, uppercase, no slash) | Owner or staff | private — DM only | none — not a slash command, so Telegram can never list it | Disables owner notifications until `/start` re-arms them. |
| `UNDO` (bare, uppercase, no slash) | Owner or staff | private — DM only | none | Reverts the single most recently remembered change to Command Changes or Rate Limits & Blocks notifications — as shipped, nothing arms this, so it always replies `No recent notification changes to undo.` |

Both are matched as the exact message text, case-insensitively, with nothing else in it — `stop`, `Stop` and `STOP` all match; `STOP please` does not.

#### Dynamic commands

Every bot also carries commands with no fixed spelling, sourced from that bot's own `memebot.json` and matched with the same slash-optional shape as the built-ins:

*Per-bot dynamic commands*

| Kind | Source | Cap | Matches |
| --- | --- | --- | --- |
| Character triggers | `characters[].triggerCommand`, for each enabled character | 4 per bot — `MAX_CHARACTERS_PER_BOT`; over the cap, saving a new one fails with `@<bot> is at the 4-character cap` | `^/?<trigger>(@<botusername>)?$` — first word only |
| Text commands | `textCommands[]` with `isActive` | No cap on count | `^/?<trigger>(@<botusername>)?(\s\|$)` |
| Button commands | `buttonCommands[]` with `isActive` | No cap on count | same pattern as text commands |

Text and button commands share one trigger namespace with each other and with character triggers — a trigger can't be reused across the three. Every fixed built-in above is matched first, at the router; a custom command of the same name never gets a turn. None of the three are gated by the group allowlist on their own — see below.

* [The trigger namespace](#holders-cmds-custom-commands-namespace)

#### Two cross-cutting facts

The group allowlist (`allowedGroups`) is not one gate for the whole bot — each feature that cares checks it independently, at its own call site, and several (`/holders`, `/presets`, `/cancelpresets`, text and button commands, the scanner, the calls commands) never check it at all. The buy bot keeps an entirely separate posting-target pool, `bots[].buyBot.targetGroupIds`, capped at 10 — distinct from the allowlist, which has no cap anywhere.

* [What the allowlist gates](#menu-access-groups-what-gates)
* [The buy bot's separate pool](#menu-access-groups-buybot-pool)
