Конструктор команд
Конструктор позволяет создавать пользовательские команды и автоматизации из связанных блоков. Такой сценарий называется флоу (Flow).
Основная схема: происходит событие → при необходимости проверяется условие → выполняется действие. Команда или событие, с которого начинается запуск, называется триггером.
Флоу может запускаться:
- текстовой командой с префиксом сервера;
- при входе или выходе участника;
- при отправке сообщения;
- при входе или выходе из голосового канала;
- при добавлении реакции;
- при бусте сервера.
Важно: конструктор не создаёт команды Discord вида
/команда(slash-команды). Команды запускаются как обычные сообщения с префиксом, напримерr!hello.
Как создать флоу
Откройте страницу «Конструктор».
Управлять флоу могут:
- владелец сервера;
- участники с разрешением Discord Администратор;
- участники с разрешением Управлять сервером.
Чтобы создать флоу:
- Нажмите Новый флоу — откроется экран С чего начнём?.
- Выберите готовый сценарий или нажмите на способ запуска в разделе «Начать с нуля».
- Готовый сценарий сразу расставит блоки и откроет первый шаг, который нужно дополнить своими данными — обычно это ID роли или канала.
- «Начать с нуля» задаёт только запуск: если это команда, введите её имя — префикс сервера подставится сам.
- Добавьте остальные блоки, соедините их и заполните обязательные поля.
- Проверьте схему кнопкой Прогнать.
- Включите флоу кнопкой Включить.
Важно: пока во флоу нет ни одного шага, он не сохраняется и в списке не появляется. Запись создаётся, когда на холсте окажется первый блок, — поэтому открыть конструктор и передумать можно без последствий.
Если флоу пока не должен запускаться:
- вернитесь в список флоу;
- выключите его кнопкой питания;
- после настройки снова откройте и опубликуйте.
Первый пример: команда с ответом
- Создайте флоу с запуском по команде и именем
hello. - Добавьте блок Сообщение и задайте текст: «Привет!».
- Оставьте ID канала пустым — ответ придёт туда, где вызвали команду.
- Нажмите Прогнать. В тесте бот покажет предполагаемый ответ, но не отправит его в Discord.
- Включите флоу и отправьте
r!helloв чате. Если префикс сервера другой, используйте его вместоr!.
Для нескольких действий соедините выход одного блока со следующим. После успешного действия выполнение продолжится по обычному соединению.
Условие выбирает один из двух выходов — да или нет; подключите обе ветки.
Если действие завершится ошибкой, можно направить выполнение через красный выход. Без подключения этого выхода обычная ошибка остановит флоу.
Подробнее о проверке — в разделе «Тестирование». Условия и переменные описаны ниже, в дополнительных возможностях.
Статусы и сохранение
Общего переключателя для всего конструктора нет. Каждый флоу включается и выключается отдельно.
- Активен — бот может запускать флоу.
- Кнопка питания в каталоге выключает флоу, но не удаляет его.
- Сохранить записывает изменения, не меняя текущий статус.
- Опубликовать сохраняет изменения и делает флоу активным.
Изменения активного флоу после сохранения сразу становятся рабочими.
Выключенный флоу остаётся черновиком до публикации.
Индикатор ошибок блокирует кнопки Тест и Опубликовать, но не блокирует Сохранить. Не сохраняйте активный флоу с ошибками: некорректная версия может сразу начать использоваться ботом.
Изменение имени триггера
При изменении имени в верхней части редактора создаётся новый активный триггер.
Старый триггер автоматически не выключается. После переименования проверьте список флоу и при необходимости отключите старую запись вручную.
Основные настройки
| Параметр | Где изменяется | Значение по умолчанию | Описание |
|---|---|---|---|
| Имя триггера | При создании и в верхней части редактора | cmd_ без имени команды | Определяет команду или событие, которое запускает флоу. |
| Статус | В карточке флоу или кнопкой Опубликовать | Новый флоу активен | Определяет, может ли бот запускать флоу. |
| Префикс команд | «Сервер» | r! | Используется для всех команд, созданных в конструкторе. |
| Стартовый блок | На холсте | В новом флоу — Сообщение | Первый блок, с которого начинается выполнение. |
| Обработка ошибки | Красный выход блока | Не подключена | Позволяет направить выполнение по отдельной ветке при ошибке. |
Флоу должен начинаться с одного блока. Это первый блок схемы — к нему не подключён предыдущий блок.
Несколько несвязанных стартовых блоков сохранить нельзя.
Команда в чате
При создании команды указывается только её имя.
Например, если имя команды — hello, а префикс сервера — r!, участники вызывают её так:
r!hello
Имя команды может содержать:
- строчные латинские буквы;
- цифры;
- символ
_.
Допустимая длина — от 1 до 32 символов.
Внутри системы такая команда называется cmd_hello. Это название может отображаться:
- в сообщениях об ошибках;
- в файле сохранённой схемы;
- в переменной
{trigger_name}.
Участникам вводить cmd_ не нужно.
Кто может использовать команду
Команду из конструктора может вызвать любой участник, который:
- не является ботом;
- может отправлять сообщения в канале.
Обычные настройки прав команд и дополнительные права staff-системы к таким командам не применяются.
Чтобы ограничить команду определённой ролью:
- добавьте в начало схемы блок Права / роль;
- подключите защищённые действия к выходу да;
- подключите к выходу нет сообщение об отказе или другой завершающий блок.
Условие должно иметь обе ветки: да и нет.
События сервера
Действия других ботов не запускают флоу.
| Триггер | Когда срабатывает | Дополнительные переменные |
|---|---|---|
| Вход участника | Человек входит на сервер | member_count |
| Выход участника | Человек выходит, исключается или блокируется | member_count |
| Любое сообщение | Отправляется сообщение без префикса команды | message_text, message_length |
| Вход в голосовой | Участник подключается к голосовому каналу | channel_id, channel_name |
| Выход из голосового | Участник полностью выходит из голосового канала | voice_seconds |
| Реакция на сообщение | Участник ставит реакцию | message_id, emoji, emoji_id, channel_id |
| Буст сервера | Участник бустит сервер | boost_count, boost_level |
Для события Выход участника нельзя определить, вышел ли пользователь самостоятельно, был исключён или заблокирован. Discord передаёт для этих случаев одно событие.
Перемещение между голосовыми каналами не считается выходом и повторным входом. Голосовая сессия продолжается.
Канал для сообщений
У некоторых событий нет исходного текстового канала:
- вход участника;
- выход участника;
- буст сервера;
- голосовые события;
- реакция на сообщение.
Если такой флоу содержит блок Сообщение, укажите в нём ID канала. Иначе бот не будет знать, куда отправить текст, и флоу завершится ошибкой.
Для команды в чате ID канала можно оставить пустым. Ответ будет отправлен в канал, где вызвали команду.
Задержка применения изменений
Часто срабатывающие триггеры могут обновляться с задержкой до 30 секунд:
- Любое сообщение;
- голосовые события;
- Реакция на сообщение.
Редкие события, включая вход, выход и буст, обычно подхватывают изменения сразу.
Дополнительные возможности
Схему соединённых блоков флоу также называют графом. Следующие разделы — справочник для более сложных сценариев: переменные, хранение данных, условия, циклы, повторно используемые части флоу и программный код. Для первой команды с ответом они не нужны.
Переменные и плейсхолдеры
Переменная хранит значение под именем, например имя участника. Чтобы вставить это значение в сообщение, укажите имя переменной в фигурных скобках — такую подстановку называют плейсхолдером:
Привет, {user_name}!
Перед выполнением бот заменит плейсхолдер значением переменной.
Если переменной не существует, плейсхолдер останется в тексте без изменений.
Списки значений (массивы) и наборы именованных полей (объекты) вставляются в формате JSON — текстовом формате записи данных. Например, [1, 2, 3] — список из трёх чисел. Логические значения вставляются как true (да) или false (нет).
Системные переменные
Эти переменные бот создаёт автоматически при каждом запуске.
| Переменная | В командах | В событиях | Значение |
|---|---|---|---|
trigger_name | Да | Да | Полное имя триггера, например cmd_hello. |
guild_id | Да | Да | ID сервера. |
user_id | Да | Да | ID участника, вызвавшего флоу. |
user_name | Да | Да | Отображаемое имя участника. |
user_mention | Да | Да | Упоминание участника. |
channel_id | Да | Не у всех событий | ID исходного канала. |
args | Да | Нет | Аргументы команды в виде массива. |
args_text | Да | Нет | Аргументы команды одной строкой. |
Остальные переменные зависят от выбранного события и указаны в таблице триггеров.
Защищённые имена переменных
Нельзя перезаписать:
guild_id;user_id;channel_id;message_id;trigger_name;- переменные с точкой, например
loop.index,server.nameиerror.message.
Блоки работы с переменными отклонят такое имя, а флоу с ним не сохранится.
Для выполнения действия над другим участником используйте поле ID участника внутри соответствующего блока.
Такое поле поддерживают, в частности:
- выдача и снятие роли;
- кик;
- начисление и списание очков;
- списание очков (paywall);
- блоки уровней.
Локальные и глобальные переменные
| Тип | Срок хранения | Как используется |
|---|---|---|
Локальная (local) | Только во время одного запуска | Создаётся блоками и результатами действий. |
Глобальная (global) | Между запусками и перезапусками бота | Записывается в базу данных и доступна всем флоу сервера. |
Имена переменных:
- могут содержать латинские буквы, цифры и
_; - не могут начинаться с цифры;
- не могут быть длиннее 64 символов.
Локальная переменная
Блок Локальная переменная поддерживает операции:
set— записать значение;make_array— создать массив;increment— увеличить числовое значение;append— добавить элемент в массив.
Записать значение (set)
Если введённое значение является корректным JSON, оно преобразуется в соответствующий тип:
- число;
trueилиfalse;- массив;
- объект.
Остальной текст сохраняется как строка.
Создать список (make_array)
Создаёт массив из:
- JSON-массива;
- значений, разделённых запятыми.
Увеличить число (increment)
Прибавляет к текущему значению указанное число.
Если переменная ещё не существует, её начальное значение считается равным нулю.
По умолчанию прибавляется 1.
Добавить в список (append)
Добавляет значение в конец массива.
Если переменная ещё не существует, сначала создаётся пустой массив.
Операции make_array и append поддерживают не больше 200 элементов.
Тип переменной
Поле Тип в блоке локальной переменной используется редактором для проверки совместимости блоков.
При операции set реальный тип всё равно определяется содержимым значения.
Для надёжного изменения типа существующей переменной используйте блок Преобразовать тип.
Глобальная переменная
Глобальные переменные поддерживают операции:
set;increment.
Операция set сохраняет значение в базе данных, но не создаёт доступный плейсхолдер автоматически.
Чтобы использовать сохранённое значение дальше в графе, добавьте блок Прочитать из БД.
Операция increment:
- изменяет значение в базе данных;
- сразу создаёт локальную переменную с тем же именем и новым значением.
Удалить глобальную переменную через панель пока нельзя.
Блоки действий
| Блок | Значения по умолчанию | Что делает |
|---|---|---|
| Сообщение | Текст пустой, ID канала пустой | Отправляет сообщение длиной до 2000 символов. |
| Выдать роль | ID роли пустой | Выдаёт роль участнику. |
| Снять роль | ID роли пустой | Снимает роль с участника. |
| Кикнуть | Причина пустая | Исключает участника с сервера. |
| Задержка | 3 секунды | Приостанавливает граф на срок от 1 до 300 секунд. |
| Случайное число | От 1 до 10 | Создаёт случайное целое число в {random_result}. |
| Начислить очки | Сумма пустая | Начисляет положительное количество очков и создаёт {new_balance}. |
| Статистика сервера | Без настроек | Создаёт переменные со статистикой сервера. |
Числовое поле со значением 0 может пройти проверку редактора, но быть отклонено ботом, если блок требует положительное число.
Сообщение
Сообщение обрезается до 2000 символов.
Если ID канала не указан:
- в команде сообщение отправится в канал вызова;
- в событии без исходного канала граф завершится ошибкой.
Указанный канал должен принадлежать тому же серверу.
Сообщение не пингует @everyone, @here и роли, даже если они есть в тексте или пришли из переменной, например {args_text}. Такие упоминания отображаются, но уведомлений не будет.
Упоминания участников, например {user_mention}, работают как обычно.
Выдать или снять роль
Боту необходимо разрешение Управлять ролями.
Самая высокая роль бота должна находиться выше управляемой роли.
Кикнуть
Боту необходимо разрешение Исключать участников.
Роль бота должна находиться выше роли участника.
Если причина не указана, в журнале действий администраторов (журнале аудита) используется имя флоу.
Случайное число
Минимальное и максимальное значения включаются в диапазон.
Например, диапазон от 1 до 10 может вернуть как 1, так и 10.
Начислить очки
Сумма должна быть положительным целым числом. Вместо числа можно подставить
переменную, заданную выше по цепочке, — например {random_result} из блока
«Случайное число».
После выполнения новый баланс доступен в переменной:
{new_balance}
Статистика сервера
Блок создаёт переменные:
server.name;server.member_count;server.boost_level;server.boost_count;server.role_count;server.channel_count;server.owner_id;server.age_days.
Условия и ветвление
Каждый блок условия должен иметь обе связи:
- да;
- нет.
| Блок | Значения по умолчанию | Что проверяет |
|---|---|---|
| Сравнение | Оператор > | Сравнивает переменную с указанным значением. |
| Права / роль | ID роли пустой | Проверяет наличие роли у участника. |
| Вероятность | 3% | С заданной вероятностью переходит в ветку да. |
| Уровень не ниже | Уровень 5 | Проверяет, что уровень участника не ниже порога. |
| Списать очки | Сумма пустая | Пытается списать всю сумму одной операцией. |
| Switch | Варианты yes,no | Выбирает ветку по строковому значению переменной. |
В блоке условия допустимы только проверки из таблицы; Switch — отдельный блок со своими выходами, внутри условия его не выбрать. Выполнить действие — например, выдать роль или кикнуть — условие не может.
Списать очки — единственная проверка, которая меняет баланс: это paywall, где списание и выбор ветки происходят одной операцией.
- Граф, в котором условие ссылается на действие, не сохраняется. Сообщение об ошибке называет такой блок.
- Если такой блок был сохранён раньше, при запуске он завершится ошибкой, а действие не выполнится.
Сравнение
Если обе стороны можно преобразовать в числа, сравниваются числа.
Для операторов == и !=, если числовое преобразование невозможно, сравниваются строки.
Вероятность
Допустимое значение — от 0 до 100%.
0— ветка да никогда не выбирается;100— ветка да выбирается всегда.
Списать очки
Списание выполняется как одна операция.
- Выход да — очки успешно списаны.
- Выход нет — у участника недостаточно очков, баланс не изменён.
Switch
Значение переменной преобразуется в строку и сравнивается с названиями выходов.
Если совпадения нет, используется выход default.
Циклы
Цикл повторяет группу шагов: Foreach — для каждого элемента списка, While — пока выполняется условие. Одно повторение называется итерацией.
Обычные циклические соединения блоков на холсте запрещены.
Для повторения используйте:
- Foreach;
- While.
Блок цикла на холсте — контейнер. Шаги, лежащие внутри его рамки, и есть тело цикла: перетащите их туда из библиотеки блоков или прямо с холста, а порядок задайте перетаскиванием внутри контейнера. Отдельного порта «тело цикла» больше нет — наружу из контейнера ведёт единственный выход дальше, он же выход после цикла.
Чтобы вынести шаг обратно, перетащите его из контейнера на холст: он встанет в цепочку сразу после цикла.
Цикл можно вложить в цикл — до трёх уровней, столько же исполняет движок. Попытка уйти глубже отклоняется с подсказкой.
Если у шага внутри цикла есть собственная связь наружу, она сильнее порядка: выполнение уходит по ней, и тело на этом шаге заканчивается. В контейнере такой шаг помечен подписью выходит из цикла, стрелка от него уходит за границу рамки, а шаги под ним показаны блёклыми — до них управление не дойдёт.
Вложенность — часть формата самого флоу, а не только картинки в редакторе:
тело цикла хранится списком шагов (children). Флоу, сохранённые раньше,
конвертируются при первом открытии автоматически — ничего делать не нужно.
Версия формата записана в поле schema_version.
Цикл Foreach
Блок Цикл Foreach перебирает элементы массива.
В поле Переменная-массив укажите имя переменной.
Поддерживаются:
- настоящий массив;
- строка с JSON-массивом;
- строка со значениями через запятую.
Если массив пустой, шаги внутри контейнера пропускаются, и выполнение сразу переходит к выходу дальше.
Внутри цикла доступны переменные:
{loop.item}— текущий элемент;{loop.index}— индекс, начиная с нуля;{loop.count}— общее количество элементов.
В конструкторе они подписаны по-русски — {текущий}, {номер} и {всего}, — но в текст шага и в сохранённый флоу подставляются под своими именами loop.*.
Один блок Foreach выполняет не больше 100 итераций.
Цикл While
Блок Цикл While проверяет условие перед каждой итерацией.
Поддерживаемые условия:
truthy;falsy;==;!=;>;<.
В поле Значение указывается готовое значение: число, true/false или текст. Переменные вида {n} в нём не подставляются. Если граница хранится в переменной, сравнивайте её блоком Сравнить переменную внутри цикла и выходите из цикла блоком Break.
Внутри While доступна переменная:
{loop.index}
Она начинается с нуля.
Условие тоже видит {loop.index} — номер итерации, которая сейчас начнётся. Поэтому условие loop.index < 3 выполнит тело ровно три раза.
Переменные {loop.item} и {loop.count} доступны только внутри Foreach.
Лимит итераций
Допустимый диапазон — от 1 до 100 итераций.
- значение меньше 1 заменяется на 1;
- значение больше 100 заменяется на 100;
- дробная часть отбрасывается: 2.5 — это 2 итерации;
- если значение нельзя прочитать как целое число — например, это слово или переменная
{n}, — блок завершается ошибкой.
Если цикл выполнил максимальное количество итераций и не был остановлен блоком Break (выход из цикла) или Return (остановка флоу), он завершается ошибкой.
После последней разрешённой итерации условие повторно не проверяется.
Вложенные циклы
Внутри вложенного цикла {loop.index} — индекс самого внутреннего цикла.
Внутри While, вложенного в Foreach, {loop.item} и {loop.count} по-прежнему относятся к внешнему Foreach, а {loop.index} — уже к While.
После завершения внутреннего цикла внешний {loop.index} восстанавливается: шаги ниже него снова видят индекс внешнего цикла. Так же восстанавливаются {loop.item} и {loop.count} внешнего Foreach — неважно, какой цикл вложен в какой.
Выход из цикла и остановка флоу
Выход из цикла (Break)
Блок Break завершает ближайший цикл и продолжает выполнение с выхода дальше.
Рекомендуется класть его непосредственно внутрь контейнера цикла.
Break вне цикла вызывает ошибку.
Внутри саб-флоу Break завершает только цикл, который находится в самом саб-флоу.
Break на верхнем уровне саб-флоу, вне его циклов, вызывает ошибку так же, как Break вне цикла, — даже если сам саб-флоу вызван из цикла: цикл вызывающего графа такой Break не завершает. Ошибка относится к блоку вызова саб-флоу, и её можно обработать красным выходом этого блока. Красный выход самого блока Break в этом случае не срабатывает.
Остановка флоу (Return)
Блок Return полностью останавливает выполнение флоу.
Указанное в нём значение сейчас не отправляется пользователю и не используется Discord-исполнителем.
Отложить продолжение
Блок Отложить продолжение останавливает текущий запуск и продолжает граф позднее.
Допустимая отсрочка:
- от 1 секунды;
- до 30 суток.
Состояние сохраняется на сервере и переживает перезапуск бота.
Это позволяет создавать сценарии вроде:
- выдать роль через неделю после входа;
- отправить напоминание через сутки;
- продолжить цепочку через несколько дней.
Количество времени можно брать из переменной, например:
{cooldown}
Отличие от задержки
Задержка:
- ждёт внутри текущего запуска;
- ограничена 300 секундами;
- расходует общий лимит времени выполнения.
Отложить продолжение:
- сохраняет состояние отдельно;
- может ждать до 30 суток;
- переживает перезапуск бота.
Ограничения отсрочки
Блок нельзя размещать:
- внутри цикла;
- внутри саб-флоу.
Состояние итератора или саб-флоу восстановить невозможно, поэтому такой граф будет отклонён.
К выходу блока должен быть подключён следующий блок.
Если продолжать нечего, отсрочка не имеет смысла.
Продолжение выполняется по актуальной версии флоу.
Если за время ожидания граф изменили и нужный блок был удалён, продолжение завершится, а ошибка попадёт в журналы.
Отложенное продолжение не выполнится, если флоу:
- удалён;
- выключен.
Если в момент продолжения на сервере одновременно выполняется слишком много флоу, продолжение не теряется, а переносится:
- сначала на 1 минуту;
- затем каждый раз вдвое дольше, но не больше чем на 15 минут.
Переносов может быть не больше 8 — около 75 минут в сумме.
Если свободного места так и не нашлось, продолжение отменяется, а причина попадает в журналы бота.
На одном сервере может одновременно храниться не больше 1000 ожидающих продолжений.
Если лимит достигнут, вероятно, блок используется в слишком часто срабатывающем флоу.
Один сервер может создавать не больше 30 новых отложенных продолжений в минуту.
Если за последнюю минуту их уже 30, блок завершается ошибкой, и продолжение не создаётся.
Одна цепочка может откладывать продолжение не больше 10 раз подряд.
Цепочка — это запуск флоу и все продолжения, которые из него выросли: если продолжение снова доходит до блока Отложить продолжение, оно откладывает следующее звено.
На 11-й отсрочке подряд блок завершается ошибкой, и цепочка обрывается.
Так остановится, например, граф, в котором связь после отсрочки ведёт обратно к блоку перед ней. Для регулярных повторов блок не предназначен.
Готовые продолжения разных серверов выполняются по очереди: сначала по одному от каждого сервера, затем по второму и так далее.
Поэтому большая очередь продолжений на одном или нескольких серверах не задерживает продолжения других серверов.
За минуту бот выполняет не больше 25 готовых продолжений на все серверы.
Если готовые продолжения копятся сразу у 25 серверов и больше, первыми выполняются самые давно ожидающие, и продолжение другого сервера может ждать дольше.
Тестирование отсрочки
При тестовом запуске граф доходит до блока и останавливается.
Запись в очередь отложенных продолжений при этом не создаётся.
Саб-флоу
Саб-флоу позволяет вынести часть графа в отдельный повторно используемый блок.
Чтобы создать саб-флоу:
- выделите связанные блоки;
- нажмите Саб-флоу;
- укажите имя;
- задайте входные параметры;
- укажите выходные переменные.
Выбранные блоки сохранятся внутри текущего графа и будут заменены одним блоком вызова.
Переменные саб-флоу
Саб-флоу видит локальные переменные вызывающего графа.
Переданные входные параметры временно заменяют переменные с такими же именами.
После завершения:
- прежние значения восстанавливаются;
- наружу передаются только объявленные выходные переменные.
Указанные типы входов и выходов во время выполнения не проверяются.
Общая глубина вложенных циклов и саб-флоу — не больше трёх.
Макросы
Кнопка Макрос сохраняет выделенный набор блоков как шаблон.
Макрос хранится только в локальном хранилище текущего браузера.
Он:
- не синхронизируется между устройствами;
- не хранится на сервере;
- может исчезнуть после очистки данных браузера.
Саб-флоу, в отличие от макроса, сохраняется вместе с графом.
Программный код (Custom Code)
Блок Custom Code позволяет выполнять ограниченные вычисления над локальными и системными переменными.
В коде нужно использовать имя переменной без фигурных скобок:
score
а не:
{score}
Блок получает только JSON-совместимые значения.
Изменённые значения возвращаются в локальные переменные.
Доступные переменные
Напрямую можно использовать только имена, допустимые как идентификаторы Python.
Переменные с точками недоступны, например:
server.name;loop.item;error.message.
Доступ к свойствам и элементам массивов запрещён.
Разрешённые возможности
Разрешены:
- присваивания;
- числа и строки;
- массивы и объекты;
- арифметика;
- логические выражения;
- сравнения;
- условия
if.
Запрещены:
- импорты;
- вызовы функций;
- доступ к свойствам;
- индексация, например
items[0]; - циклы;
- определения функций.
Код выполняется изолированно и не имеет доступа к файлам, сети, Discord или данным за пределами переданных переменных.
Лимиты одного блока:
- 2 секунды выполнения;
- 256 МБ памяти.
При превышении лимита блок завершается ошибкой.
Режим JavaScript
Режим JavaScript не использует полноценный JavaScript-движок.
Поддерживается только небольшой JS-подобный синтаксис:
let;const;var;true;false;null;- точки с запятой.
После преобразования код проверяется и выполняется по правилам безопасного подмножества Python.
Тестирование
Кнопка Прогнать переводит редактор в тестовый режим: граф исполняется на сервере тем же движком, который работает в Discord, а редактор проигрывает результат шаг за шагом.
Проверяются:
- ветвления;
- Switch;
- циклы;
- Break и Return;
- саб-флоу;
- обработка ошибок;
- лимиты шагов.
Тест можно запускать с несохранёнными изменениями.
Что видно во время прогона
На холсте выполненные блоки помечаются зелёной галочкой и результатом шага, текущий подсвечивается синим, ещё не пройденные показаны пунктиром. Соединение между блоками, по которому реально пошло выполнение, становится бегущим пунктиром — видно пройденный путь, а не только итог.
Правая панель показывает:
- Что бы отправил бот — превью сообщения так, как его увидели бы в Discord;
- Значения переменных — с пометкой, на каком шаге появятся ещё не вычисленные;
- Журнал — что произошло на каждом шаге и сколько это заняло.
Кнопки Пауза, Шаг и Стоп управляют воспроизведением. Выйти из режима можно кнопкой Стоп или клавишей Esc — выделенный блок и открытый инспектор сохранятся.
За шестерёнкой в панели задаются вводные прогона: от чьего лица он идёт, из
какого канала и с какими аргументами команды. Идентификатор участника при этом
всегда ваш — подменить {user_id} нельзя.
Во время прогона граф не редактируется: правки под исполнением сделали бы показанный результат неправдой.
Что не выполняется во время теста
Реальные действия не применяются:
- сообщения не отправляются;
- роли не выдаются и не снимаются;
- баланс не изменяется;
- реальные данные сервера не читаются.
Из-за этого тест не проверяет:
- права бота;
- существование каналов;
- существование ролей;
- существование участников;
- реальные балансы.
Для таких действий симуляция обычно возвращает успешный результат.
Тестовые значения
Переменные во время теста синтетические, но предсказуемые.
Одинаковые входные данные приводят к одинаковому результату.
Блок Случайное число во время теста возвращает середину диапазона.
Условия по умолчанию обычно переходят в ветку да.
Чтобы проверить отрицательную ветку, измените тестовые данные или выбранный результат условия.
Условие цикла While выбранным результатом не задаётся: цикл проверяет его по значениям переменных во время теста. Если переменную условия пишет блок с тестовым значением — например, Уровень пользователя всегда возвращает уровень 1, — тест может завершиться ошибкой лимита там, где на сервере цикл закончится.
Если блок не поддерживает симуляцию, его название будет показано в журнале прогона.
В реальном Discord такой блок выполнится, но во время теста не произведёт действие.
После тестирования в редакторе обязательно проверьте флоу на сервере Discord.
Обработка ошибок
У большинства блоков есть красный выход ошибки. Если блок завершился с ошибкой, выполнение можно направить через этот выход.
Если он подключён, при ошибке создаются переменные:
{error.message};{error.type};{error.node_id}.
После этого выполнение продолжается по красной ветке.
Если выход ошибки не подключён, обычная ошибка останавливает флоу.
Необработанная ошибка команды
Если ошибка возникает в команде и не обрабатывается отдельной веткой, сообщение об ошибке публикуется в исходном канале.
Его могут увидеть обычные участники, а не только администраторы.
Текст ошибки может содержать значение из поля блока, в том числе введённое участником. Упоминания @everyone, @here и ролей в нём тоже не пингуют.
Ошибка события
У событий без исходного канала ошибка остаётся:
- в журналах бота;
- в разделе Аналитика.
В аналитике учитываются:
- запуски;
- ошибки блоков;
- остановки из-за лимитов.
Что не считается обычной ошибкой
Через красный выход не перенаправляются:
- превышение общего времени выполнения;
- Return;
- Отложить продолжение;
- корректный Break внутри цикла.
Это управляющие сигналы, а не ошибки.
Break вне цикла считается обычной ошибкой и может быть обработан красным выходом самого Break.
Исключение — Break на верхнем уровне саб-флоу: его ошибку обрабатывает красный выход блока вызова саб-флоу, а не красный выход Break.
Ограничения
| Ограничение | Значение |
|---|---|
| Выполненных блоков за один запуск | 1000 |
| Общая длительность запуска | 900 секунд |
| Итераций одного Foreach или While | 100 |
| Вложенность циклов и саб-флоу | 3 |
| Один блок Задержка | 300 секунд |
| Блок Отложить продолжение | До 30 суток |
| Ожидающих продолжений на сервер | 1000 |
| Новых продолжений на сервер в минуту | 30 |
| Отсрочек подряд в одной цепочке | 10 |
| Сообщение Discord | 2000 символов |
Имя команды после cmd_ | 32 символа |
| Имя переменной | 64 символа |
Массив через make_array или append | 200 элементов |
| Строковый ввод переменной | 4096 символов |
| Custom Code | 2 секунды и 256 МБ |
Лимит 4096 символов применяется к:
set;make_array;append;- значению по умолчанию при чтении из базы данных.
Это не общий лимит для всех локальных строк. Другие блоки или Custom Code могут создать более длинное значение.
При записи глобальной переменной её JSON-представление также не должно превышать 4096 символов.
Лимит общей длительности проверяется перед запуском следующего блока. Уже начавшееся действие не прерывается посередине.
Все блоки основного графа, циклов и саб-флоу используют общий лимит в 1000 выполненных блоков.