- PVSM.RU - https://www.pvsm.ru -
Вот и отгремел наш INTERCOM’18, c преферансом и бизнес-кейсами. Как обычно, вход на коференцию был платным: желающие могли купить билеты на TimePad по полной цене, либо… получить скидку у консультанта-рептилоида прямо на сайте [1]. В прошлом году это работало как привычный коллбэк: вы оставляете телефон в специальной форме, Павел звонит вам через минуту и задает вопросы; чем больше правильных ответов, тем выше скидка. В этот раз мы решили поменять механику, сделав ее сложнее как технически, так и в плане вопросов. Под катом – кишки Павлика 2.0, с текущей нодой и веб-сокетами, не забудьте надеть спецодежду перед вскрытием.

Вы заходите на сайт intercomconf.com [2] с декстопного браузера, в правом нижнем углу «просыпается» Павлик в виде чата и предлагает сыграть в игру. Вводите номер, нажимаете «Вот мой номер» – после этого Павел поднимает сессию между вашим браузером и нашим бэкендом.

Если всё успешно поднялось и ваш номер еще не участвовал в розыгрыше, то Павел предложит позвонить на номер 8-800. Тут уже вступает облако Voximplant и начинается викторина:

Ответ: дедлайн/deadline. За основу взят мем This is fine [3].
Да, ребусы были примерно вот такими. На каждый вопрос давалось три попытки: сначала шла «сложная» картинка, потом проще и в конце – самая простая. Первые попытки давали больше всего очков; после 5 ребусов Павел подсчитывал баллы и либо давал бесплатный билет, либо скидку 10%-30%.
При этом наш рептилоид достаточно умён: выдавал сообщения об ошибках (если неправильно ввести номер телефона, например), определял, что номер уже участвовал в розыгрыше («Знакомый номер я вижу на экране моего несуществующего мобильного. Одна попытка в одни руки — таковы правила.») и, самое главное, соотносил браузер и облако. Как же работал этот дерзкий IVR?

Ответ: колл-центр. Nuff said.
Говоря сухо, Павел 2.0 – это IVR, выполняемый в нашем облаке. Следовательно, вся логика рептилоида должна быть прописана в JS-сценарии, верно? Да, но нет.
Вторая версия Павла синхронизируется с браузером клиента: на сайте Павел показывает ребусы, а по телефону слышит ваши ответы, в зависимости от которых сменяются картинки и выводится результат. С первого взгляда, такое взаимодействие можно было реализовать с помощью нашего HTTP API [4]:
Но как «поймать» пользовательский браузер? Ведь в httpRequestAsync [6] надо передавать однозначный URL. И да, картинки – их же надо где-то хранить.
Поэтому кроме облачного JS-сценария мы использовали свой бэкенд на express.js [7] в паре с socket.io [8]: когда посетитель вводил номер, браузер отдавал этот номер бэкенду по http, после чего http-сессия превращалась в сессию на веб-сокетах. В итоге сценарий постоянно общался с бэкендом по http, а уже бэкенд использовал веб-сокеты, чтобы быстро прокидывать в браузер картинки и подсчитанные баллы.
Но все-таки, бОльшая часть логики хранилась в сценарии. Рассмотрим рептилоида с этой стороны…

Ответ: machine learning / машинное обучение. Взято из Инстаграма самого Арни [9].
Из очевидного: обязательно нужно подключить модуль распознавания ASR [10].
require(Modules.ASR);
Из интересного:
let rr = e[0].replace("это ", "").replace("вероятно ", "").replace("может быть ", "").replace("может это ", "");
rr = rr.replace(/ /g, '');
А потом начинает подсчет попыток, баллов, а также озвучивает комментарии по ходу дела:
Также функция инкрементирует переменные с попытками и номером вопроса, чтобы переключиться на следующий вопрос либо завершить игру;
Общий листинг сценария приближается к 300 строкам, самый объемный кусок – это обработка результата распознавания, onRecognitionResult.

Ответ: Firefox. У нас всё.
Хоть Павел и динозавр, но таки идет в ногу со временем: развивается год от года и все так же любит пошутить. Надеемся, вы оценили вторую версию нашего рептилоида и «вживую», и с точки зрения реализации. Делитесь мнениями в комментах, будьте здоровы и помните – Павел любит вас!
Автор: nvpushkarskiy2
Источник [15]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/javascript/295778
Ссылки в тексте:
[1] прямо на сайте: https://intercomconf.com/
[2] intercomconf.com: https://intercomconf.com
[3] This is fine: https://knowyourmeme.com/memes/this-is-fine
[4] HTTP API: https://voximplant.com/docs/references/httpapi
[5] StartScenarios: https://voximplant.com/docs/references/httpapi/managing_scenarios#startscenarios
[6] httpRequestAsync: https://voximplant.com/docs/references/voxengine/net#httprequestasync
[7] express.js: https://expressjs.com/
[8] socket.io: https://socket.io/
[9] самого Арни: https://www.instagram.com/p/BmQ0esElywb
[10] ASR: https://voximplant.com/docs/references/voxengine/asr
[11] CallAlerting: https://voximplant.com/docs/references/voxengine/appevents#callalerting
[12] экземпляр ASR: https://voximplant.com/docs/references/voxengine/asr#voxenginecreateasr
[13] останавливает ASR: https://voximplant.com/docs/references/voxengine/asr/asr#stop
[14] hangup: https://voximplant.com/docs/references/voxengine/call#hangup
[15] Источник: https://habr.com/post/426417/?utm_campaign=426417
Нажмите здесь для печати.