Потребность

Бот должен уметь сохранять информацию о пользователе: когда пользователь зайдет повторно в нашего бота, то сможет начать с того места, где остановился в предыдущий раз.

Решение

Для примера сделаем небольшую игру «Логические концовки». Пример сценария:



Как это работает

В начале сценария нам нужно запросить данные об игроке. Для этого у нас должна быть создана какая-то база данных, в которой эти данные будут сохраняться и из которой их можно будет получить. Воспользуемся нашим сервисом для сохранения, удаления и чтения данных. Создаем первый экран и добавляем блок http-запрос. Выполним GET-запрос в нашу базу данных.



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

От блока http-запрос Завершен с ошибкой сделаем новый экран с блоком Текст.



Также добавим на этот экран блок Фразы, выглядит это так:



После того, как пользователь согласился сыграть в игру, нужно дать ему первый вариант фразы, которую нужно продолжить. Фразы мы будем сохранять в гугл-таблице. Выглядеть таблица будет следующим образом:



Чтобы получить эти данные из таблицы, нужно создать блок http-запрос. Как читать данные из таблицы, вы можете посмотреть тут. В итоге получится такой запрос:



В переменной $items находится весь массив с фразами. Далее нам нужно взять из этого массива только первую фразу. От блока http-зарос Завершен успешно, делаем новый экран с блоком Условие.



Таким образом получаем первый элемент массива и теперь можем его вывести. Создаем новый экран с блоком Текст и блоком Фразы. В блоке Текст выводим нашу фразу, которую необходимо продолжить. Напишем $items.current().question. В блоке Фразы нужно дать пользователю возможность завершить нашу фразу. Создадим сущность с возможными ответами пользователя, назовем ее $answer.



Обратите внимание что идентификаторы сущности должны совпадать с тем, что у нас написано в гугл-таблце в столбце answer.

В итоге получается такой экран:



Теперь, когда пользователь дает ответ, нужно сравнить его ответ с нашим правильным ответом. От примера фразы $answer нужно сделать условие.



Если условие выполняется, то сообщаем пользователю о том, что это правильный ответ. Если же не выполняется, то пишем, что он допустил ошибку, и возвращаем его на экран, где мы выводим фразу. И так до тех пор, пока он не даст правильный ответ. Конструкция выглядит так:



Когда пользователь ответил верно, нужно дать ему следующую фразу. Перед тем, как выводить следующую фразу, сделаем блок http-запрос, с помощью которого отправим текущую информацию об игроке, его текущий уровень и счет. Отправляем в ту же базу данных, откуда в начале сценария мы получали данные. Меняем метод с GET на POST и на вкладке BODY передаем нужные данные. На экране, где мы выводим информацию о правильном ответе, создаем блок Переход и от него делаем переход на наш http-зарос.



Если запрос завершается успешно, делаем условие, которое возьмет из массива $items следующую фразу.



От условия $items.next() делаем связь на тот экран, где мы выводим текущую фразу. Получится такая конструкция:



Логика игры готова. Теперь нужно сделать так, чтобы мы узнавали пользователя и возвращали его на то место, где он остановился в последний раз. Вернемся в начало сценария. От блока http-запрос Завершен успешно, делаем новый экран с блоком Текст.



Экран будет выглядет точно так же, как и наш экран с приветствием



От фразы «Да», делаем блок http-запрос.



Тут мы также объявим массив $items, но значение будет выглядеть так: $httpResponse.slice(parseInt($history.level)). Давайте разберемся, что значит это выражение. slice - возвращает новый массив, содержащий копию части исходного массива, parseInt - преобразует строку в число. $history.level - уровень, на котором остановился пользователь. Получится, что мы откинем часть массива, а значит, выведем пользователю только те фразы, на которые он еще не давал ответ. А дальше от логики Запрос завершен успешно делаем связь на условие, которое берет первый элемент.



Осталось дать возможность пользователю начать новую игру. Создадим новый экран с глобальным блоком Фразы.



От фразы Новая игра делаем блок http-зарос с методом DELETE.



Так мы очистим все данные об этом игроке. От блока http-запрос Завершен успешно делаем связь на начало сценария.

Игра готова, подключим нашего бота в канал телеграм и посмотрим, как это работает

Была ли эта статья полезна?
отменить
Спасибо!