--- url: /commands/first-command.md description: >- Пошаговая инструкция — создаем пользовательскую команду «!кубик», проверяем ее и добавляем аргументы и кнопку. --- # Первая команда за 5 минут

Сделаем команду «кубик»: участник пишет !кубик, бот отвечает случайным числом от 1 до 6. Потом научим кубик принимать число граней и добавим кнопку «Бросить еще».

## Создаем команду { #create }
### Откройте раздел «Команды» В панели выберите чат, в меню слева — **«Команды»**, затем вкладку **«Пользовательские»** и нажмите **«+ Создать команду»**. ### Заполните основное | Поле | Что написать | Зачем | |---|---|---| | Имя | `dice` | Латиницей. По нему команда вызывается через слэш: `/dice` | | Slash-команда | включить | Команда появится в меню Telegram | | Алиасы | `кубик`, `кость` | Можно вызывать `!кубик` и `!кость` | | Описание | Бросить кубик | Показывается в меню Telegram и в `/help` | | Группа | Игры | Для порядка в списке команд | ### Настройте действие У новой команды уже есть одно действие — оно выполняется, когда участник пишет команду. Назовите его «Бросок», тип оставьте **«Отправка сообщения»** и напишите шаблон: ```template 🎲 {{ member }} бросает кубик… выпало **{{ random(1, 6) }}**! ``` `random(1, 6)` — функция, которая выдает случайное целое число от 1 до 6 включительно. ### Сохраните Нажмите **«Сохранить»** или Ctrl + S. Рядом с командой появится статус «Работает». ### Проверьте Откройте вкладку **«Тест»** и нажмите **«Запустить»** — бот выполнит команду от вашего имени и пришлет результат в личные сообщения. Если бот не пишет, откройте его в Telegram и нажмите **«Запустить»** (Start): Telegram не разрешает ботам писать первыми. Теперь напишите в чат `!кубик`:
🎲 [Анна](#) бросает кубик… выпало **4**! Готово — у вас есть своя команда. ## Кубик с любым числом граней { #arguments } Пусть участник сам выбирает, сколько граней у кубика: `!кубик 20`. Все, что написано после команды, бот передает в `arguments`, а первое слово берется так: `arguments.get(1)`. ```template {% set sides = arguments.get(1) ?: 6 %} {% require sides is number returning 'Напиши число граней, например: !кубик 20' %} {% require sides >= 2 and sides <= 1000 returning 'У кубика может быть от 2 до 1000 граней' %} 🎲 {{ member }} бросает кубик на {{ sides }}… выпало **{{ random(1, sides) }}**! ``` Построчно: 1. `set sides = …` — запомнить число граней. `?: 6` значит «а если ничего не написали, то 6». 2. `require … returning '…'` — «потребовать». Если условие не выполнено, бот остановится и ответит текстом после `returning`. Здесь проверяем, что написали число. 3. Вторая проверка — что число в разумных пределах. 4. Сам ответ. 🎲 [Анна](#) бросает кубик на 20… выпало **17**! Напиши число граней, например: !кубик 20 ## Кнопка «Бросить еще» { #button } Добавим под ответом кнопку, которая бросает кубик еще раз. Кнопка запустит то же самое действие — для этого вместо адреса действия пишем `'self'`. ```template {% set sides = parameters.get('sides') ?: arguments.get(1) ?: 6 %} {% require sides is number returning 'Напиши число граней, например: !кубик 20' %} {% do parameters.store('sides', sides) %} 🎲 {{ member }} бросает кубик на {{ sides }}… выпало **{{ random(1, sides) }}**! {% do button('PRIMARY', 'reroll', 'Бросить еще', '🎲', 'self') %} ``` Что изменилось: * `parameters.store('sides', sides)` — бот запоминает число граней **вместе с отправленным сообщением**. Когда кто-то нажмет кнопку под ним, действие получит это число через `parameters.get('sides')`. * `button('PRIMARY', 'reroll', 'Бросить еще', '🎲', 'self')` — синяя кнопка. По порядку: стиль, идентификатор кнопки (придумываете сами), надпись, эмодзи, какое действие запустить. 🎲 [Анна](#) бросает кубик на 20… выпало **17**! Каждое нажатие отправит новый бросок от имени того, кто нажал. Если хотите, чтобы вместо нового сообщения менялось старое, включите у действия флажок **«Заменять сообщение с нажатой кнопкой»**. ## Защита от спама { #cooldown } Чтобы кубик не бросали сто раз в минуту, откройте вкладку **«Поля вызова»** и задайте **кулдаун**: например, 10 секунд на участника. Там же можно ограничить, кто может вызывать команду и в каких топиках. Подробнее — в статье [Настройки команды](./settings#invocation). ## Что дальше { #next } * [Настройки команды](./settings) — все поля и права доступа. * [Действия](./actions/) — формы, выдача ролей и другие типы. * [Кнопки и меню выбора](./components) — цветные кнопки, листание страниц, меню. * [Полезные примеры](/templates/examples) — готовые команды, которые можно скопировать.