# Emoji packs: the three creation modes

An emoji pack is created three ways in Telegram — a 3D spinning coin, a static image, or a paste of premium emoji that already exist in another pack — each reached by its own direct command. The same three choices also appear as buttons on a chooser screen when you add to a pack you already own.

## Commands

`/newpack` opens the wizard. `/emojipack` is an identical alias for it — the dashboard's own copy refers to the feature as `/emojipack`, while the bot's Telegram command menu lists `/newpack`. Both trigger the same handler.

*Commands*

| Command | In the Telegram command menu? | Effect |
| --- | --- | --- |
| /newpack | Yes — private and group | Opens the coin wizard. If premium emoji are pasted in the same message, opens Existing Emoji instead. |
| /emojipack | No — alias only | Identical to /newpack. |
| /staticemoji | No | Opens the From Image (static) wizard directly. |
| /mypacks | Yes — private and group | Lists your packs, 10 per page. |

A command matches with or without an `@botname` suffix, and with trailing text or an emoji after it — `/newpack@YourBot` and `/newpack 🔥` both match; `/newpackfoo` does not. `/newpack` and `/emojipack` also match when they appear in a photo or document caption, not just as message text; `/staticemoji` only matches as message text.

#### Where to find the on/off switch

| Setting | Value |
| --- | --- |
| Dashboard location | Management tab → "Emoji Creator" card, tooltip "/emojipack — custom static + spinning-coin emoji packs". |
| State key | `emoji_packs_enabled` — see below for what it actually gates. |

## The three modes

Reaching a mode by its direct command skips straight into that mode — `/newpack` (no premium emoji attached) goes straight to an image request, `/staticemoji` goes straight to a name request, and pasting premium emoji into `/newpack` goes straight to a name request. None of the three asks you to pick a mode first.

*The three modes and how to reach each one directly*

| Mode | Chooser button label | Direct command | First prompt |
| --- | --- | --- | --- |
| Coin | Coin flip | /newpack or /emojipack, no premium emoji attached | "Let's make a 3D coin emoji. Send an image — upload a PNG, SVG, or AVIF as a file to keep transparency, or paste an image URL." |
| Static | From Image | /staticemoji | "Make a static emoji pack. Send a name for the pack." |
| Existing emoji | Existing Emoji | /newpack (or /emojipack) with premium emoji pasted in the same message | "Gotchu, send a name for the pack" |

The chooser itself — three buttons labelled **Coin flip** (`ep:new:coin`), **From Image** (`ep:new:static`) and **Existing Emoji** (`ep:new:ids`) — is not shown for a brand-new pack. It appears once a pack already exists: tapping **Add New Emojis** on a pack's detail card re-opens it, scoped to that pack, with the prompt "Add to this pack. A coin flip, an emoji from an image, or existing emojis?" and a **Back** button alongside the three mode buttons.

* [The coin creator flow](#emoji-coin-creator)
* [Adding to an existing pack](#emoji-pack-management)

## Authorization

Accepted chat types are private, group and supergroup. Channels are rejected outright — none of the four commands work there.

#### Who may send /newpack, /emojipack, /staticemoji or /mypacks

| Setting | Value |
| --- | --- |
| In a DM | Only the bot's owner/admin, or a username listed in `dm_authorized_usernames`. |
| In an authorized group | Any member of that group — authorization keys on the chat, not the sender. |
| In an unauthorized group, or an unlisted DM sender | The command is silently ignored — no reply. |

Buttons inside an already-open wizard (the `ep:` callbacks) are not re-checked against this list. Once a wizard message exists, tapping its buttons only requires the tap to come from the Telegram user id the wizard was opened for, plus the group's `emoji_packs_enabled` switch below.

## The /start precondition

Telegram only lets a bot create a sticker set owned by a user it can resolve as a private peer — someone who has opened a DM with it. `/newpack`, `/emojipack` and `/staticemoji` check this before doing anything else; `/mypacks` does not need it.

*Shown when the check fails, for 30 seconds*

```
Before I can make a pack for you, Telegram needs you to open a private chat with @<bot> and send /start once — then run this again.
```

| Setting | Value |
| --- | --- |
| Resolvability cache | 600 seconds — a successful check is not repeated within that window. |

## emoji\_packs\_enabled

#### The group on/off switch

| Setting | Value |
| --- | --- |
| Default | On. |
| Effect when off | Suppresses /newpack, /emojipack, /staticemoji and /mypacks in groups and supergroups. Their entries are also removed from the group's Telegram command menu. |
| DMs | Never affected — the switch is not consulted at all in a private chat. |
| Where to change it | Dashboard → Management tab → "Emoji Creator" card. |

> **Note**
>
> No Telegram Premium check and no plan or package-tier check exist anywhere in the pack-creation code path. Creating a pack is gated only by the authorization rules and the /start precondition above.
