Потребность

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

Решение

Для примера сделаем небольшую игру «Логические концовки». Вы можете поговорить с этим ботом в телеграме по адресу @Logic_check_bot. Посмотреть на сценарий вы можете здесь.

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

Запрашиваем данные об игроке

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

В сценарии создайте первый экран, добавьте на него блок HTTP-запрос:

метод - GET
в поле URL вставьте данный адрес:
https://tools.aimylogic.com/api/data/${userId}
На вкладке RESPONSE нажмите на + и в поле Имя переменной вставьте:
history
а в поле Значение вставьте:
$httpResponse
И нажмите Сохранить.



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

Если пользователь у нас впервые

От блока http-запрос Завершен с ошибкой сделаем новый экран с блоком Текст:
Привет! Это игра логические концовки. Вооружись логическим мышлением! В этой игре нужно правильно закончить фразы. Ну что, начнём?



Добавим варианты ответов пользователя

Добавим на этот экран блок Интенты и добавим туда готовый интент Согласие.

Узнать больше о блоке Интенты вы можете здесь, а о готовых интентах - здесь.

Чтобы учесть все возможные реплики пользователя, вы можете познакомиться со статьей "[Синтаксис шаблонов](https://help.aimylogic.com/ru/article/sintaksis-shablonov-8fwvnu/)"



Оформим таблицу, в которой будем хранить содержание игры

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

Выглядеть таблица будет следующим образом:



В таблице должно быть 4 столбца с названиями:

question

answer

level

score

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

Заполните таблицу следующим содержанием, как видно на скриншоте выше:

Если стол выше стула, то стул... ниже стола 1 10
Если два больше одного, то один... меньше двух 2 20
Если сестра старше брата, то брат... младше сестры 3 30
Если правая рука справа, то левая... слева 4 40
Если река глубже ручейка, то ручеек... мельче реки 5 50
Если из ведра льется вода, то ведро... дырявое 6 60

Колонки Level и Score помогут нам возвращать пользователя к тому месту, где мы остановились, и также выводить счёт, так что они должны содержать соответствующие числовые значения.

Получаем данные из таблицы

Обязательно опубликуйте гугл-таблицу, как описано здесь.

Создайте новый HTTP-запрос.
URL нужно оформить так, как написано в инструкции здесь.

На вкладке RESPONSE нажмите на + и в поле Имя переменной вставьте:
items
а в поле Значение вставьте:
$httpResponse
И нажмите Сохранить.

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



Соедините вариант фраз "да" с этим HTTP-запросом:


Выбираем первую фразу

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

$items.first()



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

Выводим первую фразу

Соедините блок условий $items.first() с новым экраном. Добавьте на него блок Текст. В блоке Текст напишите:

Дополни такую фразу:

На этот же экран добавьте ещё один блок Текст и напишите в нём:
$items.current().question



Принимаем варианты ответов

Добавим на этот же экран блок Фразы и в примерах напишем
$answer



Создадим справочник

Чтобы принимать ввод пользователя и сравнивать его с правильными ответами, перейдите во вкладку Сущности и создайте справочник под названием
answer



Перенесите в колонку "Сущность" содержание столбца answer вашей гугл-таблицы (можно копировать и вставлять). Нажмите Сохранить изменения.





Если названия в колонке Сущности будут не совпадать с текстом у вас в таблице, вы получите ошибку.

Подробнее о сущностях вы можете почитать здесь.

Сравниваем данный ответ с правильным ответом

Вернитесь на вкладку "Сценарий". От варианта фраз "$answer" сделайте связь с блоком Условия, в который поместим данный текст:

$answer === $items.current().answer

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

Далее соедините блок Условия с текстовым блоком, в котором напишите:

Да, это правильный ответ!

И добавьте на этот же экран блок Переход:



Теперь от экрана, содержащего "Дополни такую фразу", от варианта "**Любая другая фраза**" создайте новый экран с блоком текст, содержащим:

А вот и неправильно!



И на этот же экран добавьте еще один блок текст:

Попробуй ещё раз!

И блок Переход.



И свяжите блок "Переход" с экрана о неправильном ответе с экраном, на котором выводится вопрос:



Соедините вариант else блока условий с экраном, где выводим сообщение о неправильном ответе:



Сохраним информацию об игроке

Когда пользователь ответил верно, нужно дать ему следующую фразу. Но перед тем, как выводить следующую фразу, создадим блок http-запрос, с помощью которого отправим текущую информацию об игроке, его текущий уровень и счет.

Отправляем в ту же базу данных, откуда в начале сценария мы получали данные.
метод POST
url:
https://tools.aimylogic.com/api/data/${userId}
на вкладке BODY передаем нужные данные в таком формате (скопируйте и вставьте):

{
"level": "$items.current().level",
"score": "$items.current().score"
}


Нажмите Сохранить.



И свяжем блок Переход с экрана, содержащего сообщение о правильном ответе, с данным http-запросом:



Выводим следующую фразу

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

$items.next()



От условия $items.next() делаем связь на тот экран, где мы выводим $items.current().question:



Добавляем действие на случай, если есть история о пользователе

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

С возвращением! В прошлый раз мы дошли до уровня $history.level. Твой счет: $history.score. Продолжим?



Также, добавим на этот экран блок Фразы и добавим варианты реакций пользователя.



Получаем неотвеченные вопросы
От фразы «Да» предыдущего экрана, делаем блок http-запрос. Здесь нам снова нужно получить данные из гугл-таблицы, как обычно.
url может быть таким же, как в блоке HTTP-запрос "Получаем вопрос"
на вкладке RESPONSE нажмите на + и в поле Имя переменной вставьте:
items
а в поле Значение вставьте:
$httpResponse.slice(parseInt($history.level))

Давайте разберемся, что значит это выражение. slice - возвращает новый массив, содержащий копию части исходного массива, parseInt - преобразует строку в число. $history.level - уровень, на котором остановился пользователь. Получится, что мы откинем часть массива, а значит, выведем пользователю только те фразы, на которые он еще не давал ответ.

И нажмите Сохранить.



А дальше связываем вариант Завершен успешно с условием, которое берет первый элемент - $items.first().



Новая игра

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



От фразы Новая игра делаем связь к новому блоку http-запрос, с помощью которого будем удалять данные о пользователе:

выберите метод DELETE и
в поле URL скопируйте данную ссылку:
https://tools.aimylogic.com/api/data/${userId}
нажмите Сохранить.




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



Добавим сообщение об успешном завершении игры

Найдите блок условий, содержащий $items.next(). От варианта else создайте текстовый блок с текстом:

Поздравляю, игра пройдена! Хочешь сыграть ещё?



На этот же блок добавьте блок Фразы и добавьте возможные варианты ответа.

Свяжите ответ "да" с блоком HTTP-запрос "Получаем вопрос", на котором обращаемся к гугл-таблице.



На первом блоке условий, где также есть выражение $items.first() свяжите вариант else с экраном "Поздравляю, игра пройдена! Хочешь сыграть ещё?"



Игра готова!

Можете нажать кнопку Тестировать и проверить, как это работает.

Как можно дополнить сценарий:
дополните примеры фраз другими возможными словами, которые пользователи могут написать на соответствующем этапе сценария
дополните речь бота другими репликами;
везде, где есть вариант "любая другая фраза" свяжите этот вариант либо с этим же экраном, либо с текстовым блоком, в котором дайте пользователям инструкцию на тот случай, если они вводят не то, что вы от них ожидаете. Если не связать вариант "Любая другая фраза" ни с чем, то бот будет отвечать "Извините, непонятно" на ввод, который не попадает в варианты Фраз.
добавьте кнопку Новая игра на экран "С возвращением!"
В некоторых HTTP-запросах вариант "Завершен с ошибкой" на имеет связи с текстовыми блоками. Свяжите варианты "Завершен с ошибкой" с текстовым блоком, содержащим текст "Ошибка $httpStatus".
можете добавить обращение к пользователю по имени, как описано в этой статье.
В каждом текстовом блоке вы можете добавить другие варианты текста, нажав на "Добавить другую реплику". Тогда бот будет выдавать разные варианты фраз в случайном порядке и не будет повторяться.
Можете добавить в реплики бота смайлики, скопировав их отсюда.
Можете добавить экран, на котором бот будет прощаться с пользователем, если пользователь написал "хватит" или "не хочу играть"
Вы также можете добавить в начало сценария ещё один блок условий, который будет проверять, не на последнем ли уровне остановился пользователь в прошлый раз. И, если на последнем, то будет переводить на экран "Игра пройдена! Играть ещё раз?", а если уровень не последний, то будет выводить сообщение о том, на каком уровне пользователь остановился:

$history.level == 6



Подключите один из каналов, например, Telegram или вк.





Возникли сложности?

Вы можете обратиться в поддержку за помощью. При обращении предоставьте скриншот переписки с ботом (скриншот ошибки или скриншот, иллюстрирующий, в каком месте сценария находится сложность), скопируйте лог ошибки, если он есть. Сообщите имейл, прикреплённый к аккаунту и название сценария. С удовольствием вам поможем!

Также можете попросить совета в нашем сообществе в телеграме: https://t.me/aimylogic
Была ли эта статья полезна?
отменить
Спасибо!