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 могут успеть прийти до снятия кнопок.
Для применения исправления к существующему боту нужны повторная генерация кода и перезапуск.