Commands and the settings card
Every buy bot command, every button on the settings card, and the state the bot holds while it waits for an answer.
Command reference
Commands are case-insensitive and accept the /command@botname form. /buybothelp is not a complete list of what works — its built-in text omits /buybotdiscord, /buybotdocs, /buybotmedium, /buybotreddit and /buybotgithub, all five of which work exactly like the other link commands. The table below is complete: 17 commands, 21 spellings once aliases are counted.
| Command | Aliases | Chats | Who may send it | What it does |
|---|---|---|---|---|
| /enablebuybot | — | Group, DM | Owner / admins | Turns the buy bot on. In a group: authorizes that group and adds it as a target (up to 10). Asks for the contract address first if none is set. |
| /minbuy <amount> | — | Group, DM | Owner / admins | Sets the minimum buy in USD. Takes the amount inline (/minbuy 20, $20) or opens a prompt. |
| /buyemoji <emoji> | — | Group, DM | Owner / admins | Sets the size-row emoji — premium or plain. The first emoji in the message wins. |
| /buybotimage | — | Group, DM | Owner / admins | Sets the buy media. Attach an image, GIF or video to the command, or send it as the next message. |
| /repeatlastbuy | — | Group, DM | Owner / admins | Reposts the last recorded buy through the current layout, media and emoji. |
| /buybotgroups | — | Group, DM | Owner / admins | Opens the Manage Groups picker. |
| /buybotsettings | /buybotmenu, /buybot | Group, DM | Owner / admins | Opens the settings card. |
| /buybothelp | /buybotcommands | Any chat | Owner / admins | Sends the plain-text command list (incomplete — see above). |
| /buybotwebsite | — | Group, DM | Owner / admins | Sets the website link. |
| /buybotx | /buybottwitter | Group, DM | Owner / admins | Sets the X (Twitter) link. |
| /buybottelegram | — | Group, DM | Owner / admins | Sets the Telegram link. |
| /buybotdiscord | — | Group, DM | Owner / admins | Sets the Discord link. |
| /buybotdocs | — | Group, DM | Owner / admins | Sets the docs link. |
| /buybotmedium | — | Group, DM | Owner / admins | Sets the Medium link. |
| /buybotreddit | — | Group, DM | Owner / admins | Sets the Reddit link. |
| /buybotgithub | — | Group, DM | Owner / admins | Sets the GitHub link. |
| /forkbuybot | — | Private, group, supergroup | Owner / admins | Forks another bot’s buy post — text, formatting and media — into this bot’s layout. Writes body text, size emoji and media only; never enables the bot, never adds a group. |
“Owner / admins” means the bot’s Memescale owner or a Memescale platform admin — never a Telegram group admin, regardless of that admin’s standing in the group where the command is sent.
None of these commands appear in the bot’s default command menu. /buybotsettings alone is menu-listed, for the owner / Memescale admins only, through Telegram’s per-user command scopes.
The prompt state machine
A command sent without its value — /minbuy alone, /buyemoji alone, a link command with nothing after it — opens a prompt instead of failing. The state lives in a per-chat pending entry: a kind (minbuy, emoji, image, link, token, chain, gca, wz, wzlink, wzca, wzmedia, wzemoji, socials, soclink, and the group picker’s own kind), a timestamp, and whatever context the prompt needs.
Rules
| Setting | Value |
|---|---|
| What answers it | The owner’s very next message in that same chat — text, or a photo/video/GIF where media is expected. |
| Timeout | 600 seconds (10 minutes). A message that arrives after that is treated as a fresh, unrelated message. |
| Survives a restart | Yes — pending prompts are stored in the bot’s persisted state, not memory. |
| A stranger’s message | Left alone. It neither answers nor cancels the prompt. |
| When the owner’s message is deleted | Only after it is fully processed — the download, the dashboard write and the card redraw all finish first. The bot never replies to a message it is about to delete. |
| An unrecognized message | Left alone if the handler doesn’t take it — for example, chatter while a card is waiting on a button tap. |
A card waiting on a button tap (the wizard, the socials card, the random-media confirm) does not treat a text message as its answer — sending a second file re-asks the same question instead of ending it.
Limits
| Setting | Value |
|---|---|
| Prompt timeout | 600 seconds (10 minutes) |
| Settings write timeout | 20 seconds |
| Fork dispatch timeout | 45 seconds |
| Target groups | 10 maximum |
| Group-title rescan | at most every 300 seconds; immediate on the command itself and on Refresh |
| Contract address length accepted | up to 160 characters |
The settings card
Opened by /buybotsettings, /buybotmenu or /buybot. The card is one message; every button either edits it in place or turns it into a prompt that redraws it once answered.
Card text
Five lines, in order:
- $SYM Buy Bot ON ✅ / Buy Bot OFF ❌ — the ✅ rides as a premium emoji from the card’s own pack, falling back to a plain ✅ if Telegram refuses custom emoji on this bot.
- Groups: <titles> / Groups: none yet
- Buy media: … — present only while random gallery mode is on. A fixed picture is the card’s own attached media and needs no line.
- Token: $SYM on <Chain> / Token: <truncated address> / Token: not set
- Layout: custom (forked/edited) / Layout: default
Card text, worked
| Input | Output |
|---|---|
| enabled=true, symbol=DOGE, groups=[“Doge Fam”], chain=ethereum, hasBody=false, imageMode=fixed | $DOGE Buy Bot ON ✅ Groups: Doge Fam Token: $DOGE on Ethereum Layout: default |
Built from _summary_text in buybotctl.py. The media line is skipped here because the mode isn’t random.
Buttons
| Label | Opens / does |
|---|---|
| Manage Groups | Opens the group picker — see below. |
| Min Buy: $<n> | Prompt: Send the minimum buy in USD, e.g. 20. Confirms with Min buy set to $<n> ✅ shown to 2 decimal places, e.g. $20.00 — the button itself drops decimals on whole numbers ($20), the confirmation line never does. |
| Buy Emoji <glyph> | Prompt: Send the emoji for the buy row (premium emoji work too). Confirms with Buy emoji set ✅ — it repeats with the size of each buy. The button carries the emoji itself: a premium emoji rides as the button’s own icon; a plain glyph (or a premium one Telegram refuses to show as an icon on this bot) appears appended to the label instead. |
| Buy Media | Prompt: Send me the new image, GIF, or video. While random gallery mode is on, this first asks to confirm switching it off — see the wizard’s random-media confirm. |
| Update Socials | Turns the card into the post-fork wizard’s links step, for the slots the card already lists (the layout’s own slots, plus any slot that already has a link, plus website / X / Telegram always) — see The post-fork wizard. |
| Token: $<SYM> / Token | Prompt: Paste the token's contract address. Runs the same DexScreener lookup and confirm card as setup. If DexScreener’s listing differs from what’s currently set for any slot the layout uses, the socials card follows. |
| Fork a Layout | Turns the card into a hint: Send /forkbuybot and paste another bot's buy post (or forward it, image included) — I'll keep its emoji and layout and fill in your token's live numbers. Edit it any time on memescale.ai/dashboard → Buy Bot. It does not start a fork by itself. |
| View Layout | Renders the current post on the card itself. Nothing is sent to the group. |
| Refresh (blue, full width) | Redraws the card and forces an immediate group-title rescan. |
| Disable Buy Bot Everywhere (red, full width) | Shown only while the bot is on. Turns it off everywhere; acks Buy bot disabled everywhere. |
| Enable Buy Bot (green, full width) | Shown only while the bot is off and at least one group is wired. Turns it on; acks Buy bot enabled. No switch at all is shown before the first group. |
| « Main Menu | Hands the message back to the /menu root. |
| Close | Deletes the card. Opens nothing. |
Manage Groups
Reached from /buybotgroups or the settings card’s Manage Groups button. The same picker also drives /menu’s Access Controls; only what a pick writes differs.
- One row per group the bot is admin in and the caller is a member of: ✅ Title (gets the buys) or ❌ Title (doesn’t). Tapping a row flips it and the picker stays open.
- Any current target the admin check can no longer vouch for (the bot was demoted or removed) still gets a ✅ row, so it can be removed.
- Add Groups replaces the card with a prompt:
Let's add a group. Make sure I am in the group as an admin first, and then send me either the link to the group, or the group ID which you can get by typing /getid.
The next message is read as a public link, an @handle, a t.me/c/… message link, or the numeric ID from /getid. {what} in the replies below is filled with “link” or “group ID” to match what was sent.
| Situation | Reply |
|---|---|
| The bot doesn’t know the chat, or has left it | I'm not in this group yet, add me first and repaste the {what}. |
| The bot is in the chat but isn’t admin | I'm in the group but not an admin yet, once I am admin repaste the {what}. |
| The chat is a channel, not a group | That's not a group. Send the {what} of a group I'm an admin in. |
A private invite link (t.me/+…, joinchat, tg://join) | That's a private invite link, and Telegram doesn't let bots look those up. Send /getid inside the group and paste the group ID here. |
| Already a target | The picker redraws with <title> already gets the buys ✅ on top. Nothing is written. |
| Already at 10 targets | Limit reached, we're already in 10 groups. Remove a group first and then send the {what} again to enable the buy bot. |
| Otherwise | The group is authorized and added. The picker redraws with Added <title> ✅ on top. |
Tapping an unpicked row past the 10-group cap gets a shorter alert instead: Limit reached, we're already in 10 groups. Remove a group first.
Group titles on the card are never stale by design: the card draws with the freshest title the bot already has, then a background check runs one getChat per target — always right after the command itself and after Refresh, otherwise at most every 300 seconds. A rename updates the record and redraws the card in place, as long as nothing else has edited it since.
Token, chain and socials cards
Reached from the settings card’s Token button, from /enablebuybot in a DM, and from the post-fork wizard’s Edit Contract Address.
- The prompt:
Paste the token's contract address.(From a fresh DM setup it readsSend the token's contract address and I'll set it up.) - An address up to 160 characters is looked up on DexScreener. A recognizable but unlisted EVM address (six chains share the same
0x…shape) instead opens a chain picker:Which chain is this token on?with one button per EVM chain. Tapping a chain button with no pending address getsPaste the contract address first. - The result is a confirm card:
Found $SYM — <name>(orI couldn't find that token on DexScreener yet — it may be very new.), then the chain, the address, andLock it in?, with Confirm ✅ / Cancel. - Confirm ✅ writes the contract address and chain, acks
Locked in, and the card showsToken locked in ✅ $SYM on <Chain>. - Cancel deletes the bot’s own messages from this flow. The owner’s own messages are never deleted.
When DexScreener’s listing has a value that differs from what’s currently set, for any slot the layout uses, Confirm opens the socials card instead of finishing immediately: Socials detected on DexScreener — are these accurate?, one line per detected slot (<Platform>: <short url>, with (updated) appended to any the owner changed in-card), then Tap a platform to change its link, or Approve to save them all. Buttons: one per detected platform (two per row), then Approve ✅ and Enter manually.
- Tapping a platform:
Send your <name> link. (Reply skip to keep the detected one.) - Approve ✅ writes every detected link at once. Any slot still empty afterward is asked one by one.
- Enter manually skips detection and asks every slot one by one.
Stale-callback messages
| Card | Message |
|---|---|
| Token confirm | That one expired — send the address again |
| Socials | That one expired — tap Token or Update Socials on the card |
| Wizard | That one expired — send /forkbuybot again or open /buybotsettings |
| Media random-confirm | That one expired — send /buybotimage again |
The post-fork wizard
Opens automatically right after a successful /forkbuybot, and — for its first step only — from the settings card’s Update Socials button. One card, edited in place, buttons full width. Nothing else is sent for the whole flow.
Step 1 — links
Lead line: Done, forked. Confirm the following links are accurate. (Update Socials instead shows Confirm the following links are accurate., with no “Done, forked” prefix.) Body: one <Platform>: <short url> or <Platform>: not set line per slot, then Contract Address: <address> or Contract Address: not set.
| Button | What it does |
|---|---|
| Edit <Platform> URL (one per slot) | Prompt: Gotchu, send the new <Platform> URL. |
| Edit Contract Address | Prompt: Gotchu, send the new contract address. |
| Links Are Correct | Writes only what changed, acks Links saved (or Links confirmed if nothing changed). Reached via Update Socials, the settings card reappears with that as its note; reached via the fork wizard, the card advances to Step 2. From the fork path it is refused without a token: Add the contract address first. From the settings-card entry that check is skipped. |
| « Back | Only present in the Update Socials variant. Returns to the settings card untouched. |
Step 2 — media and buy emoji
Text: Confirm the buybot media and buy emojis are correct. then Buy Emoji: followed by the configured emoji repeated exactly 6 times. This rides as the caption on the buy media itself.
| Button | What it does |
|---|---|
| Edit Media (GIF, MP4, Image) | Prompt: Gotchu, send the new media (GIF, MP4, or image). If random gallery mode is off, the new media writes immediately and the card returns with Media updated ✅. If random gallery mode is on, see the random-media confirm below. |
| Edit Buy Emoji | Prompt: Gotchu, send the new buy emoji. Writes immediately; the card returns with Buy emoji updated ✅. |
| Preview Buybot | Renders the layout as an actual post, in place, with a « Back button. If the layout renders empty for the last buy, the card shows The layout renders empty for that buy. instead. |
| Lock It In | Turns the bot on if a group is already wired and it isn’t already enabled, then acks Locked in and moves to Step 3. |
Random-media confirm
Editing the media while random gallery mode is on first shows This new media will disable the random image that currently displays as buybot media. Are you sure you would like to continue? with Go Back (red) and Proceed (green). Nothing is downloaded or written before Proceed.
- Go Back acks
Kept the random gallery imageand returns to the media step unchanged. - Proceed writes the new media with the mode forced to fixed, acks
Media updated, and the card returns withMedia updated ✅ Random gallery image mode is off — buys now use this media.
Step 3 — final
With a group already wired: Your buybot is fully configured and live in <groups> for $SYM, CA: <ca>, click the button below to preview what it looks like. Without one: Your buybot is fully configured for $SYM, CA: <ca>. Send /enablebuybot inside the group where the buys should post to go live. Click the button below to preview what it looks like. Buttons: Preview Buybot, Close.
Exiting
- Tap Close on the final step to end normally.
- « Back on any edit-in-progress returns to the card without saving that edit.
- Leaving a prompt unanswered for 10 minutes ends it the same way any other prompt times out — see The prompt state machine.
- A stale button on an expired wizard card replies
That one expired — send /forkbuybot again or open /buybotsettingsand changes nothing.
Every edit turns the card into Gotchu, send the new … with a « Back button; the answer turns it back into the card, updated. A media change uses Telegram’s in-place media edit; a card that was text-only becoming a media card is re-sent once. Preview turns the card into the rendered post itself, with « Back to return.