Перейти к основному содержимому

Файлы проекта

На этом шаге мы настроим конфигурационный файл бота и напишем сценарий, используя функции, написанные на предыдущем этапе.

Конфигурационный файл

Создайте конфигурационный файл бота 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 — конец игры, если пользователь захотел сдаться.

Теперь перейдем к разбору структуры сценария.