Файлы проекта
На этом шаге мы настроим конфигурационный файл бота и напишем сценарий, используя функции, написанные на предыдущем этапе.
Конфигурационный файл
Создайте конфигурационный файл бота chatbot.yaml
и укажите следующие параметры:
# Название проекта
name: citiesGame
# Точка входа
entryPoint:
- main.sc
# Параметры NLU-сервиса CAILA:
botEngine: v2
language: ru
nlp:
intentNoMatchThresholds:
phrases: 0.2
patterns: 0.2
Файл сценария
Создайте файл main.sc
в папке src
. В нем будет сценарий работы бота:
require: responseCity.js
require: city/city.sc
module = sys.zb-common
theme: /
state: Start || modal = true
q!: $regex</start>
intent!: /LetsPlay
script:
$session = {}
$client = {}
$temp = {}
$response = {}
a: Привет! Предлагаю сыграть в игру "Города". Кто загадывает город: компьютер или пользователь?
state: User
intent: /user
a: Назовите город
script:
$session.keys = Object.keys($Cities);
$session.prevBotCity = 0;
go!: /LetsPlayCitiesGame
state: Computer
intent: /computer
script:
$session.keys = Object.keys($Cities);
var city = $Cities[chooseRandCityKey($session.keys)].value.name
$reactions.answer(city)
$session.prevBotCity = city
go!: /LetsPlayCitiesGame
state: LocalCatchAll
event: noMatch
a: Это не похоже на ответ. Попробуйте еще раз.
state: LetsPlayCitiesGame
state: CityPattern
q: * $City *
script:
if (isAFullNameOfCity()) {
if (checkLetter($parseTree._City.name, $session.prevBotCity) == true
|| $session.prevBotCity == 0) {
var removeCity = findByName($parseTree._City.name, $session.keys, $Cities)
if (checkCity($parseTree, $session.keys, $Cities) == true) {
$session.keys.splice(removeCity, 1)
var key = responseCity($parseTree, $session.keys, $Cities)
if (key == 0) {
$reactions.answer("Я сдаюсь")
} else {
$reactions.answer($Cities[key].value.name)
$session.prevBotCity = $Cities[key].value.name
removeCity = findByName($Cities[key].value.name, $session.keys, $Cities)
$session.keys.splice(removeCity, 1)
}
} else $reactions.answer("Этот город уже был назван")
}
} else $reactions.answer("Используйте только полные названия городов")
state: NoMatch
event: noMatch
a: Я не знаю такого города. Попробуйте ввести другой город
state: EndGame
intent!: /endThisGame
a: Очень жаль! Если передумаешь — скажи "давай поиграем"
Подключаемые модули
В начале сценария под тегом require
мы подключаем написанные на предыдущем шаге функции из responseCity.js
.
Далее мы импортируем системный модуль city
, который позволяет из скриптовых вставок обращаться к справочнику городов $Cities
, а в паттернах использовать именованную сущность $City
.
Основные стейты сценария
Сценарий бота состоит из следующих основных стейтов:
Start
— начало работы бота. Бот приветствует пользователя и предлагает выбрать, кто будет начинать игру.LetsPlayCitiesGame
— начало игры. Стейт содержит логику проверки введенного города и выводит ответ бота.EndGame
— конец игры, если пользователь захотел сдаться.
Теперь перейдем к разбору структуры сценария.