--- url: /commands/actions/code.md description: >- Действие «Выполнение кода» — выполнить шаблон без обычного ответа, сохранить данные или выбрать следующее действие через run. --- # Выполнение кода

Действие только выполняет шаблон. Его используют, когда нужно что-то сделать, а не написать: сохранить данные, выдать роль по условию или решить, какое действие запустить дальше.

## Как отвечает бот { #reply } * Если шаблон сам ничего не отправил, бот ответит коротким «Готово». * Если шаблон отправил сообщение через `chat.sendMessage(…)` или `createMessage().send()`, «Готово» не будет. * Если сработал `{% require %}` или `{% return 'текст' %}`, бот ответит этим текстом как сообщением об ошибке — ответом, эфемерно или молча, в зависимости от [настройки ошибок](../settings#error-mode). Текст, написанный в шаблоне вне островков, в чат не попадает — у этого действия нет своего сообщения. ## Пример: ежедневная награда { #daily } Команда `!бонус` раз в сутки начисляет 100 монет. Монеты хранятся в [атрибуте](/templates/storage/attributes) участника. ```template {% set last = member.getAttribute('bonus_at') %} {% require now().millis - (last.value ?: 0) >= 86400000 returning 'Бонус уже получен. Приходи завтра!' %} {% set coins = member.getAttribute('coins').increment(100) %} {% do last.update(now().millis) %} {% do chat.sendMessage('💰 ' ~ member.name ~ ', +100 монет! Теперь у тебя ' ~ coins) %} ``` Построчно: 1. Берем атрибут с моментом прошлого бонуса — он хранится числом миллисекунд. 2. `require` проверяет, что с прошлого бонуса прошли сутки (86 400 000 мс). Если нет — бот останавливается и отвечает текстом после `returning`. 3. Прибавляем 100 монет: `increment` возвращает новое значение. 4. Запоминаем текущий момент. 5. Отправляем сообщение в чат. Раз шаблон сам что-то отправил, «Готово» бот уже не пишет. 💰 Анна, +100 монет! Теперь у тебя 1350 ::: info Почему не просто текст В действии «Выполнение кода» нет своего сообщения, поэтому ответ отправляется функцией `chat.sendMessage`. Если нужен ответ с разметкой, кнопками и настройками «куда отправить», сделайте это действие типа «Отправка сообщения» — логика будет той же. ::: ## Пример: развилка по аргументу { #router } Команда `!клуб` с тремя действиями: «Развилка» (по умолчанию, тип «Выполнение кода»), «Состав» и «Статистика» (оба — «Отправка сообщения»). Развилка смотрит на первое слово и передает управление нужному действию: ```template {% set sub = arguments.get(1) | lower %} {% if sub == 'состав' %} {% run '0b7d4a52-6c1e-4f3a-9e28-5d9c3b7a1f60' %} {% elseif sub == 'стата' %} {% run '8e2f6c19-3a7d-4b58-a1c4-7f9e0d2b6c35' %} {% endif %} {% return 'Используй: !клуб состав или !клуб стата' %} ``` `run` завершает текущее действие, поэтому строка с `return` выполнится, только если ни одно условие не подошло. Подробнее — в статье [Цепочки действий](../run).