Работа с фун кциями
Перед тем как приступить к написанию сценария бота мы напишем несколько функций, которые будут осуществлять механику игры.
Основные функции игры
В папке src создайте файл responseCity.js. Здесь будут храниться основные функции игры, которые мы будем вызывать из сценария:
- вывод города, начинающегося на последнюю букву предыдущего;
 - поиск введенного города по ключу;
 - проверка наличия введенного города в списке городов;
 - проверка совпадения последней буквы предыдущего города с первой буквой введенного города;
 - вывод случайного ключа города;
 - проверка на использование короткого названия города.
 
function responseCity(parseTree, keys, cities) {
    var city = parseTree._City.name
    var letter = city[city.length - 1]
    var response = 0
    keys.forEach(function(elem) {
        if (cities[elem].value.name[0].toLowerCase() == letter) {
            response = elem
        }
    })
    if (response == 0) {
        letter = city[city.length - 2]
        keys.forEach(function(elem) {
        if (cities[elem].value.name[0].toLowerCase() == letter) {
            response = elem
        }
    })
    }
    return response
}
function findByName(city, keys, cities) {
    var response = 0
    var i = 0
    keys.forEach(function(elem) {
        if (cities[elem].value.name == city) {
            response = i
        }
        i++
    })
    return response
}
function checkCity(parseTree, keys, cities) {
    var city = parseTree._City.name
    var response = false
    keys.forEach(function(elem) {
        if (cities[elem].value.name == city) {
            response = true
        }
    })
    return response;
}
function checkLetter(playerCity, botCity) {
    var response = false
    if ((playerCity[0].toLowerCase() == botCity[botCity.length - 1])
        || (playerCity[0].toLowerCase() == botCity[botCity.length - 2])) {
        response = true
    }
    return response
}
function chooseRandCityKey(keys) {
    var i = 0
    keys.forEach(function(elem) {
        i++
    })
    return  $jsapi.random(i);
}
function isAFullNameOfCity() {
    return $jsapi.context().parseTree._City.name.toUpperCase() == $jsapi.context().parseTree.text.toUpperCase();
}
В нашем проекте будем использовать системный модуль city/cities-ru.csv, в котором хранится список более 8500 городов. В дальнейшем рассмотрим подключение этого модуля в разделе Разработка сценария.
Каждый город представляет собой запись в следующем виде:
6556;Санкт-Петербург,Ленинград,Петербург,СПб,Питер,Петроград,Северная Пальмира,Северной Пальмире,Северная Столица,Северной Столице,город на Неве,город Петра,город Святого Петра,Санктпетербург,Санкт Петербург;
{
    "name":"Санкт-Петербург",
    "lat":59.93863,
    "lon":30.31413,
    "country":"RU",
    "timezone":"Europe/Moscow",
    "population":5028000,
    "capital":"false",
    "continent":"Europe"
    }
Мы будем использо вать только поля id и name.
Описание функций
responseCity()
Функция responseCity() возвращает город, который начинается на последнюю букву введенного пользователем города. Если города на определенную букву закончились, то возвращаем город начинающийся с п редпоследней буквы.
function responseCity(parseTree, keys, cities) {
    // сохраняем введенный город
    var city = parseTree._City.name
    // берем последнюю букву города
    var letter = city[city.length - 1]
    // будем присваивать переменной ключ найденного города
    var response = 0
    /* пройдемся по элементам списка городов пока не найдем город,
    который начинается на последнюю букву предыдущего города*/
    keys.forEach(function(elem) {
        if (cities[elem].value.name[0].toLowerCase() == letter) {
            response = elem
        }
    })
    /* если города, начинающиеся с определенной буквы закончились,
    то используем вторую букву с конца */
    if (response == 0) {
        letter = city[city.length - 2]
        keys.forEach(function(elem) {
        if (cities[elem].value.name[0].toLowerCase() == letter) {
            response = elem
        }
    })
    }
    return response
}
findByName()
Функция findByName() осуществляет поиск введенного города в списке городов по ключу.
/* будем вызывать эту функцию из сценария
для удаления введенного города из всего списка */
function findByName(city, keys, cities) {
    // будем хранить ключ найденного города
    var response = 0
    var i = 0
    // пройдемся по элементам списка городов пока не найдем введенный город
    keys.forEach(function(elem) {
        if (cities[elem].value.name == city) {
            response = i
        }
        i++
    })
    return response
}
checkCity()
Функция checkCity() проверяет наличие введенного города в списке city/cities-ru.csv. Возвращает true или false.
function checkCity(parseTree, keys, cities) {
    // сохраняем введенный город
    var city = parseTree._City.name
    var response = false
    // пройдемся по элементам списка городов пока не найдем введенный город
    keys.forEach(function(elem) {
        if (cities[elem].value.name == city) {
            response = true
        }
    })
    return response;
}
checkLetter()
Функция checkLetter() предназначена для проверки совпадения первой буквы введенного пользователем города с последней или предпоследней буквой города, который ввел бот.
function checkLetter(playerCity, botCity) {
    var response = false
    /* выводим true, если первая буква введенного пользователем города
    совпадает с последней буквой введенного ботом города  */
    if ((playerCity[0].toLowerCase() == botCity[botCity.length - 1])
        || (playerCity[0].toLowerCase() == botCity[botCity.length - 2])) {
        response = true
    }
    return response
}
chooseRandCityKey()
Функция chooseRandCityKey() возвращает случайное значение клю ча города. Вызывается из сценария, когда игру начинает бот.
function chooseRandCityKey(keys) {
    return $jsapi.random(keys.length);
}
isAFullNameOfCity()
Функция isAFullNameOfCity() проверяет, ввел ли пользователь полное название города. Результатом функции будет true или false.
function isAFullNameOfCity() {
    return $jsapi.context().parseTree._City.name.toUpperCase() == $jsapi.context().parseTree.text.toUpperCase();
}
Теперь переходим к созданию конфигурационного файла и сценария бота.