Перейти к основному содержимому

Keyboard-нода

Keyboard хранит кнопки и их действия. goto ведёт на target, url открывает ссылку, а callback-ввод можно направить на input с inputType: "callback".

Текст кнопки и callback_data — разные значения. Если значение нужно сохранить, укажи это через схему callback/input, а не через выдуманное поле. После изменений используй db_report_button_navigation.

Вложенные меню​

Привяжи главное меню к сообщению через keyboardNodeId. Кнопка главного меню может вести в другую keyboard-ноду через action: "goto" и target: тогда подменю заменит кнопки того же сообщения только после нажатия. Текст сообщения сохранится.

При генерации поиск владельца клавиатуры не пересекает другую keyboard-ноду или переход по кнопке. Поэтому кнопки подменю не подменяют главное меню в стартовом сообщении. Например: приветствие → «Статус коннектора / Перезагрузить станцию» → нажатие «Статус коннектора» → «Коннектор 1 / Коннектор 2». Явные привязки через keyboardNodeId и существующие привязки через промежуточное условие сохраняются.

Для исправления уже сгенерированного бота нужны повторная генерация кода и перезапуск.

Скрытие после нажатия: hideAfterClick​

hideAfterClick — допустимое поле отдельной кнопки в data.buttons[], а не поле самой keyboard-ноды. Тип — boolean, значение по умолчанию — false. Поле объявлено в buttonSchema, которую использует nodeSchema.data.buttons. Общий справочник: Кнопки (Button).

Для inline-кнопки с переходом и hideAfterClick: true общий обработчик нажатий снимает всю inline-клавиатуру исходного сообщения перед запуском целевого блока. Само сообщение остаётся. Тип целевой ноды не ограничен: это может быть set_variable, condition, delay, http_request, message или другое действие. Обработка не зависит от БД пользователей. Если Telegram не разрешил снять клавиатуру, ошибка записывается в журнал, а переход продолжается.

Пример keyboard-ноды:

{
"id": "kb_period",
"type": "keyboard",
"position": { "x": 360, "y": 0 },
"data": {
"keyboardType": "inline",
"buttons": [
{
"id": "period_1h",
"text": "1 час",
"action": "goto",
"target": "sv_1h",
"hideAfterClick": true
},
{
"id": "period_2h",
"text": "2 часа",
"action": "goto",
"target": "sv_2h",
"hideAfterClick": true
}
]
}
}

У сообщения «Выберите период» укажи keyboardNodeId: "kb_period". Создай узлы sv_1h и sv_2h типа set_variable, записывающие соответственно «1 час» и «2 часа» в переменную period; оба ведут в сообщение «Вы выбрали: {period}». После выбора меню теряет кнопки, выбранное значение сохраняется и бот отправляет подтверждение. Отдельная нода delete_message или edit_message для скрытия не требуется.

data.hideAfterClick и data.editRemoveKeyboard не являются настройками keyboard-ноды. Для явного редактирования или удаления сообщения используй соответствующую ноду действия. edit_message в режиме keep не возвращает меню, уже снятое общим обработчиком.

Скрытие требует callback от Telegram: url, web_app, copy_text и pay такого callback не отправляют. Описанное поведение относится к inline-клавиатуре; reply-клавиатура — отдельный механизм. hideAfterClick не заменяет проверку повторного выполнения действия: при двух быстрых нажатиях оба callback могут успеть прийти до снятия кнопок.

Для применения исправления к существующему боту нужны повторная генерация кода и перезапуск.