Создание виджетов
В инструкции описаны базовые способы создания виджетов для чат-ботов. Виджет ─ это одно или несколько сообщений, с которыми можно взаимодействовать с помощью кнопок. Пример: сообщение со списком задач, в котором для пролистывания списка используются кнопки Вперед и Назад:
Далее:
- под отправкой сообщения подразумевается botx-метод отправка директ нотификации;
- под обновлением сообщения ─ botx-метод редактирование события.
Взаимодействие с виджетом построено следующим образом:
- Выполняется отправка сообщения.
- При последующих взаимодействиях ранее отправленное сообщение обновляется, при этом контент сообщения может изменяться.
Сохранение контекста между обновлениями реализовывается с помощью двух атрибутов сообщения:
-
data
─ прикрепляется к кнопке и отправляется боту при нажатии на эту кнопку. Используется для передачи контекста определенной кнопки (например, нажатие кнопки Назад или Вперед). -
metadata
─ прикрепляется к сообщению и отправляется боту при нажатии на любую кнопку. Используется для передачи контекста всего виджета (например, список элементов, который прокручивается в виджете).
Создание виджета из одного сообщения
Рассмотрим процесс создания на примере виджета, который будет показывать числа от 1 до 10 с возможностью перехода вперед и назад.
Начнем с команды /range-widget
, которая будет управлять виджетом. Хендлер этой команды будет отправлять и обновлять сообщение.
Если в команду пришло сообщение с пустой metadata
, значит виджет еще не был отправлен и это только предстоит сделать. Введем переменную current_index
, которая будет отвечать за активный элемент в виджете. Будем пытаться получить его из data
, а при отсутствии такого ключа выставлять на начало - 0
.
Отправим сообщение:
POST /api/v4/botx/notifications/direct
{
"notification": {
"body": "Current element: 1",
"metadata": {"elems": [1, 2, 3]},
"bubble": [
[
{
"command": "/range-widget",
"label": "Вперед",
"data": {"current_index": 1}
}
]
],
...
},
...
}
В ответ на запрос получаем source_sync_id
─ это уникальный идентификатор отправленного сообщения.
Добавляем в сообщение кнопку Вперед с инкрементированным индексом активного элемента. При ее нажатии боту придет следующая команда:
{
"source_sync_id": "<source_sync_id>",
"command": {
"body": "/range-widget",
"command_type": "user",
"data": {"current_index": 1},
"metadata": {"elems": [1, 2, 3]},
},
...
}
Опираясь на current_index: 1
из data
сообщения, отобразим второй по счету элемент массива elems
- "2". Но теперь, кроме кнопки Вперед, нам нужно добавить кнопку Назад с декрементированным на единицу current_index
:
POST /api/v3/botx/events/edit_event
{
"sync_id": "<source_sync_id>",
"payload": {
"body": "Current element: 2",
"metadata": {"elems": [1, 2, 3]},
"bubble": [
[
{
"command": "/range-widget",
"label": "Вперед",
"data": {"current_index": 2}
},
{
"command": "/range-widget",
"label": "Назад",
"data": {"current_index": 0}
}
]
],
...
},
...
}
Теперь у нас есть сообщение с текстом "Current element: 2" и двумя кнопками: Назад и Вперед. Если пользователь еще раз нажмет Вперед, боту придет сообщение:
{
"source_sync_id": "<source_sync_id>",
"command": {
"body": "/range-widget",
"command_type": "user",
"data": {"current_index": 2},
"metadata": {"elems": [1, 2, 3]},
},
...
}
Теперь отобразим последний, 3 по счету и 2 по индексу элемент массива ─ "3". Обновим сообщение, убрав кнопку Вперед:
POST /api/v3/botx/events/edit_event
{
"sync_id": "<source_sync_id>",
"payload": {
"body": "Current element: 3",
"metadata": {"elems": [1, 2, 3]},
"bubble": [],
"bubble": [
[
{
"command": "/range-widget",
"label": "Назад",
"data": {"current_index": 1}
}
]
],
...
},
...
}
Создание виджета из нескольких сообщений
При создании виджета, который должен состоять из нескольких сообщений, элементы управления (Вперед/Назад) находятся в последнем сообщении. Рассмотрим процесс создания на примере виджета из 3 сообщений.
Мы будем прокручивать по 3 элемента из списка [1, 2, 3, 4]
на странице. Отслеживать текущие активные элементы будем с помощью поля page
, у первой страницы индекс 0.
Отправим первое сообщение:
POST /api/v4/botx/notifications/direct
{
"notification": {
"body": "Element: 1",
},
...
}
Примечание
Мы отправили сообщение без кнопок и метадаты. На практике к сообщению могут быть прикреплены кнопки для удаления или другого взаимодействия с элементом.
В ответ на сообщение мы получили sync_id
отправленного сообщения, <sync_id_1>
, сохраним его. Отправим такое же второе сообщение со вторым элементом, в ответ получаем <sync_id_2>
, сохраним и его.
POST /api/v4/botx/notifications/direct
{
"notification": {
"body": "Element: 3",
"metadata": {
"elems": [1, 2, 3, 4],
"sync_ids": [<sync_id_1>, <sync_id_2>]
},
"bubble": [
[
{
"command": "/widget",
"label": "Вперед",
"data": {"page": 1}
}
]
],
},
...
}
К этому сообщению мы добавили кнопку Вперед с инкрементированным page
. Добавим в metadata
сообщения sync_id
ранее отправленных сообщений ─ это нужно, чтобы виджет знал, какие сообщения обновлять.
При нажатии на кнопку Вперед придет следующая команда:
{
"source_sync_id": "<sync_id_3>",
"command": {/widget
"body": "/widget",
"command_type": "user",
"data": {"page": 1},
"metadata": {
"elems": [1, 2, 3, 4],
"sync_ids": [<sync_id_1>, <sync_id_2>]
},
},
...
}
На странице должно быть по 3 элемента, но для второй страницы остался только один ─ 4. Обновим первое сообщение последним элементом списка:
POST /api/v3/botx/events/edit_event
{
"sync_id": "<sync_id_1>",
"payload": {
"body": "Element: 4",
},
...
}
Для второго сообщения нет контента, поэтому обновим его текстом "Конец списка".
Сделаем то же самое для последнего сообщения, добавляем элементы управления:
POST /api/v3/botx/events/edit_event
{
"sync_id": "<source_sync_id>",
"payload": {
"body": "Конец списка",
"metadata": {
"elems": [1, 2, 3, 4],
"sync_ids": [<sync_id_1>, <sync_id_2>]
},
"bubble": [
[
{
"command": "/widget",
"label": "Назад",
"data": {"page": 0}
}
]
],
},
...
}
Виджет готов. С помощью виджетов из нескольких сообщений можно создавать удобный пользовательский интерфейс.