Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Список возможных типов с примерами использования:

Тип

Пример использования

Текст

Code Block
установитьПеременнуюВДиалог(
	ключ = "NonEditabletext",
    значение = "Нередактируемый текст",
    название = "Примечание",
    показыватьОператору = true,
    редактируемое = false,
    обязательное = false,
    тип = "Текст"
)
Code Block
установитьПеременнуюВДиалог(
    ключ = "textField",
    значение = "г.Москва Ул.Тверская",
    название = "Адрес",
    показыватьОператору = true,
    редактируемое = true,
    обязательное = true,
    тип = "Текст"
)

Число

Code Block
установитьПеременнуюВДиалог(
	ключ = "number",
    значение = "",
    название = "Возраст",
    показыватьОператору = true,
    редактируемое = true,
    обязательное = true,
    тип = "Число"
)

Выпадающий список

Code Block
установитьПеременную("priority", "{\"v1\": \"Blocker\", \"v2\": \"Critical\", \"v3\": \"Major\", \"v4\": \"Minor\"}")+
установитьПеременнуюВДиалог(
    ключ = "priority",
    значение = "[\"v1\", \"v2\"]",
    название = "Выберите критичность",
    редактируемое = true,
    показыватьОператору = true,
    обязательное = true,
    множественныйВыбор = true,
    тип = "Выпадающий список",
    варианты = "{priority}"
)
Code Block
установитьПеременнуюВДиалог(
    ключ = "severity",
    значение = "",
    название = "Выберите важность",
    редактируемое = true,
    показыватьОператору = true,
    обязательное = true,
    тип = "Выпадающий список",
    варианты = "{\"v1\": \"High\", \"v2\": \"Medium\", \"v3\": \"Low\"}"
)

Переключатель

Code Block
установитьПеременнуюВДиалог(
	ключ = "switcher",
    значение = "true",
    название = "Активный?",
    показыватьОператору = true,
    редактируемое = true,
    обязательное = true,
    тип = "Переключатель"
)

 

Для чтения переменной необходимо вызвать ее по наименованию в фигурных скобках:

...

Шаг получения текущего значения переменной сервиса.

Здесь можно подробно ознакомиться с переменными сервиса Переменные сервиса

получитьПеременнуюСервиса("имя_переменной_сервиса", "имя_переменной_куда_сохранять")

изменитьПеременнуюСервиса(*args)

Шаг изменения значения переменной сервиса.

Здесь можно подробно ознакомиться с переменными сервиса Переменные сервиса

изменитьПеременнуюСервиса("имя_переменной_сервиса", "значение_или_имя_переменной_откуда_записать")

...

Переписка с пользователями 

...

Текст сообщения может содержать HTML теги для форматирования сообщения. Текст сообщения также может включать в себя вставку значений из переменных. Система самостоятельно проверит форматирование сообщения на соответствие требованиям канала. 

Info

Для канала Telegram есть поддержка тегов pre и code в тексте сообщений из сценариев

Пример вывода простого текстового сообщения:

...

Info

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

...

задатьПользователюВопрос(*сообщение)

...

 

Шаг отправки пользователю вопроса пользователю и ожидания ответа.

В качестве аргумента для задатьПользователюВопрос принимается текст вопроса или переменная, которая содержит такой текст. Сообщения без текста не будут отправлены. Текст вопроса может содержать HTML теги для форматирования сообщения. Текст сообщения также может включать в себя вставку значений из переменных. Система самостоятельно проверит форматирование сообщения на соответствие требованиям канала.

.сохранитьРезультат(*переменная)

В качестве аргумента для сохранитьРезультат принимается название переменной, в которую сценарий поместит ответ пользователя. Если указанная переменная ранее не была определена в сценарии - сценарий создаст её.

...

Code Block
breakoutModewide
задатьПользователюВопрос("На какую дату нужен пропуск ?").сохранитьРезультат("whatDay") +
...

Пример сценария с вопросом и разбором результатов:

Code Block
breakoutModewide
задатьПользователюВопрос("Как дела?").сохранитьРезультат("what") +
если("{what} != Хорошо").то(
  комментарий("А дела то не хорошо") +
  завершитьИПеревестиНаОператора 
) +
комментарий("Все отлично") +
завершить

Время ожидания ответа от пользователя устанавливается таймером сценариев, значение которого можно указать в разделе Настройки - Сценарии. Если ответ от пользователя не поступит в указанное время, сценарий будет завершен. После завершения сценарий по таймеру система отправит пользователю соотвествующее служебное сообщение, текст которого можно указать в разделе Настройки - Сценарии.

Дополнительные модификаторы для данного шага включают в себя возможность указания вариантов ответа и правила проверки ответа по шаблону.

.

...

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

сохранитьРезультат(текст, файлы, ожидание)

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

Пример сценария с запросом файлов у пользователя:

Code Block
breakoutModewide
задатьПользователюВопрос("На какую дату нужен пропуск ?Пришли файл(ы) пожалуйста, у тебя есть 15 секунд.").сВариантамиОтветасохранитьРезультат(текст="Сегодняuser_text", "Завтра").сохранитьРезультат("whatDay") +
...

.проверитьФормат(*формат, *сообщение)

...

файлы="user_file[]", ожидание=15)
сообщениеПользователю("Ты написал: {user_text}")
сообщениеПользователю.сШаблоном("Ты приложил файлы: {user_file}")
завершить

ожидание не должно быть больше таймера сценариев, заданного в Настройки - Сценарии.

.сВариантамиОтвета(*варианты) 

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

Code Block
breakoutModewide
//  выражение для проверки, что введенная строка соотвествует формату даты вида 02.12.2021
задатьПользователюВопрос("Укажите дату").проверитьФормат("(0[1-9]|[12][0-9]|3[01])[- \/.](0[1-9]|1[012])[- \/.](19|20)\\d\\d", "Не понял вас, повторите пожалуйста.").сохранитьРезультат("day")+

//  выражение для проверки, что введенная строка содержит адрес электронной почты
задатьПользователюВопрос("Напишите email").проверитьФормат("^\\S+@\\S+\\.[a-z]{2,}$", "Пожалуйста, введите корректный email").сохранитьРезультат("_email")+

запроситьФайл(*сообщение).сохранитьРезультат(*переменная)

Шаг запроса файла  у пользователя и записи его в переменную. В качестве аргумента шаг принимает текст просьбы или переменную с таким текстом. Файл будет сохранен в хранилище файлов диалога и будет доступен в указанной переменной.

Code Block
breakoutModewide
запроситьФайл("Приложите файл").сохранитьРезультат("file")+ +

Модификатор шага добавляет пользователю опцию пропуска отправки файла.

.можноПропустить(*сообщение)

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

Code Block
breakoutModewide
запроситьФайл("Приложите файл").можноПропустить("Пропустить") +
...

Работа с API вызовами  

Шаги обращения к внешним сервисам и разбора полученных данных. В настоящее время поддерживается API вызовы REST и SOAP сервисов, планируется подключение к почтовым, FTP и прочим сервисам.

вызвать.внешнийСервис(*адрес, *тип).сохранитьРезультат(*args)

Шаг вызова REST API сервисов. Данный шаг ожидает получение ответа в формате плоского JSON. Для работы с SOAP сервисами используется данный шаг с модификаторам, которые будут указаны ниже.

В качестве аргументов для вызвать.внешнийСервис принимаются адрес ендпонта и тип вызова. Поддерживаются основные типы вызовов - GET, POST, PUT, DELETE. В качестве адреса ендпойнта принимается строка с адресом или переменная, которая содержит данную строку.

В качестве аргументов для сохранитьРезультат принимается список пар из названия поля в полученном JSON и названия переменной, в которую сценарий сохранит полученное значение.

Пример GET запроса, из ответа которого будет выбрано 1 поле result

Code Block
breakoutModewide
вызвать.внешнийСервис("https://api.autofaq.ai/v1/ping","GET").сохранитьРезультат(("result", "answer_code")) +

Пример POST запроса с указанием адреса вызова из переменной, телом запроса и разбором двух полей из ответа - message и code

Code Block
breakoutModewide
установитьПеременную("post_url", "https://api.autofaq.ai/v1/ping") +
...
вызвать.внешнийСервис("{post_url}", "POST").сТеломСообщения("{query}").сохранитьРезультат(("message", "response_message"),("code", "response_code")) +
...

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

.сПараметрами(*args)

Модификатор шага вызова сервиса для передачи URL параметров запроса. Параметры передаются парами в формате название параметра - значение параметра. Значение параметра может быть указано текстом или переменной, которая содержит данный текст.

Code Block
breakoutModewide
установитьПеременную("user_token", "1234567890abcd") +
...
вызвать.внешнийСервис("{url}","GET").сПараметрами(("query","order"),("token","{user_token}")).сохранитьРезультат(("result", "answer_code")) +
...

.сЗаголовками(*args)

Модификатор шага вызова сервиса для передачи заголовков запроса. Заголовки передаются парами в формате название заголовка - значение заголовка. Значение заголовка может быть указано текстом или переменной, которая содержит данный текст.

Code Block
breakoutModewide
установитьПеременную("user_token", "1234567890abcd") +
...
вызвать.внешнийСервис("{url}", "POST").сЗаголовками(("Content-Type", "application/json"),("charset", "utf-8"),("Authorization","Bearer {user_token}")).сохранитьРезультат(("result", "answerзадатьПользователюВопрос("На какую дату нужен пропуск ?").сВариантамиОтвета("Сегодня", "Завтра").сохранитьРезультат("whatDay") +
...

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

Code Block
breakoutModewide
выполнитьJs("""
    var variants = ['Да','Нет','Не употребляю'];
    var exit = {'variants':JSON.stringify(variants)};
exit;
""") +
задатьПользователюВопрос("Кофе?").сВариантамиОтвета("{variants}").сохранитьРезультат("userSaid")

.проверитьФормат(*формат, *сообщение)

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

Code Block
breakoutModewide
//  выражение для проверки, что введенная строка соотвествует формату даты вида 02.12.2021
задатьПользователюВопрос("Укажите дату").проверитьФормат("(0[1-9]|[12][0-9]|3[01])[- \/.](0[1-9]|1[012])[- \/.](19|20)\\d\\d", "Не понял вас, повторите пожалуйста.").сохранитьРезультат("day")

//  выражение для проверки, что введенная строка содержит адрес электронной почты
задатьПользователюВопрос("Напишите email").проверитьФормат("^\\S+@\\S+\\.[a-z]{2,}$", "Пожалуйста, введите корректный email").сохранитьРезультат("_email")

запроситьФайл(*сообщение).сохранитьРезультат(*переменная)

Шаг запроса файла  у пользователя и записи его в переменную. В качестве аргумента шаг принимает текст просьбы или переменную с таким текстом. Файл будет сохранен в хранилище файлов диалога и будет доступен в указанной переменной.

Code Block
breakoutModewide
запроситьФайл("Приложите файл").сохранитьРезультат("file")+ +

Модификатор шага добавляет пользователю опцию пропуска отправки файла.

.можноПропустить(*сообщение)

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

Code Block
breakoutModewide
запроситьФайл("Приложите файл").можноПропустить("Пропустить") +
...

Работа с API вызовами  

Шаги обращения к внешним сервисам и разбора полученных данных. В настоящее время поддерживается API вызовы REST и SOAP сервисов, планируется подключение к почтовым, FTP и прочим сервисам.

вызвать.внешнийСервис(*адрес, *тип).сохранитьРезультат(*args)

Шаг вызова REST API сервисов. Данный шаг ожидает получение ответа в формате плоского JSON. Для работы с SOAP сервисами используется данный шаг с модификаторам, которые будут указаны ниже.

В качестве аргументов для вызвать.внешнийСервис принимаются адрес ендпонта и тип вызова. Поддерживаются основные типы вызовов - GET, POST, PUT, DELETE. В качестве адреса ендпойнта принимается строка с адресом или переменная, которая содержит данную строку.

В качестве аргументов для сохранитьРезультат принимается список пар из названия поля в полученном JSON и названия переменной, в которую сценарий сохранит полученное значение.

Пример GET запроса, из ответа которого будет выбрано 1 поле result

Code Block
breakoutModewide
вызвать.внешнийСервис("https://api.autofaq.ai/v1/ping","GET").сохранитьРезультат(("result", "answer_code")) +

Пример POST запроса с указанием адреса вызова из переменной, телом запроса и разбором двух полей из ответа - message и code

Code Block
breakoutModewide
установитьПеременную("post_url", "https://api.autofaq.ai/v1/ping") +
...
вызвать.внешнийСервис("{post_url}", "POST").сТеломСообщения("{query}").сохранитьРезультат(("message", "response_message"),("code", "response_code")) +
...

...

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

.сПараметрами(*args)

Модификатор шага вызова сервиса для передачи тела URL параметров запроса. Поддерживаются форматы x-www-form-urlencoded и json. JSON передается кодированный в строку. Названия и значения параметров принимаются строкой Параметры передаются парами в формате название параметра - значение параметра. Значение параметра может быть указано текстом или переменной, которая содержит эту строкуданный текст.

Code Block
breakoutModewide
// передача JSON установитьПеременную("user_token", "1234567890abcd") +
...
вызвать.внешнийСервис("{url}", "POSTGET").сЗаголовкамисПараметрами(("Content-Typequery", "application/jsonorder")).сТеломСообщения,("{\"name\":\"new document\token", \"question\":\"new question\"}""{user_token}")).сохранитьРезультат(("result", "answer_code")) +
// передача x-www-form-urlencoded
вызвать.внешнийСервис("{url}", "...

.сЗаголовками(*args)

Модификатор шага вызова сервиса для передачи заголовков запроса. Заголовки передаются парами в формате название заголовка - значение заголовка. Значение заголовка может быть указано текстом или переменной, которая содержит данный текст.

Code Block
breakoutModewide
установитьПеременную("user_token", "1234567890abcd") +
...
вызвать.внешнийСервис("{url}", "POST").сЗаголовками(("Content-Type", "application/x-www-form-urlencodedjson")).сТеломСообщения,("charset"name=new document, question=new question", "utf-8"),("Authorization","Bearer {user_token}")).сохранитьРезультат(("result", "answer_code")) +
...

.

...

сТеломСообщения(*args)

Модификатор шага вызова сервиса для передачи multipart тела запроса для передачи файлов. При передаче файла можно указать либо полное название файла либо идентификатор файла в файловом хранилище диалога.

Поддерживаются форматы x-www-form-urlencoded и json. JSON передается кодированный в строку. Названия и значения параметров принимаются строкой или переменной, которая содержит эту строку.

Code Block
breakoutModewide
// передача файла черезJSON указание
пути
вызвать.внешнийСервис("{url}", "POST").сСоставнымТеломСообщениясЗаголовками(("contentContent-Type", -> "C:/docker.yml"))application/json")).сТеломСообщения("{\"name\":\"new document\", \"question\":\"new question\"}").сохранитьРезультат(("result", "answer_code")) +
// передача файла через идентификатор файла в хранилищеx-www-form-urlencoded
вызвать.внешнийСервис("{url}", "POST").сЗаголовками(("apikeyContent-Type","{apikey_var} "application/x-www-form-urlencoded")).сСоставнымТеломСообщениясТеломСообщения(("content" -> "{fileId}"),("type" -> "addAttach")name=new document, question=new question").сохранитьРезультат(("result", "answer_code")) +

Асинхронные API вызовы

.сохранитьРезультатКакСтроку(*переменная)

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

Ответ может быть разобран далее по ходу сценария.AutoFAQ может получать и обрабатывать POST вызовы от других сервисов. Адрес выставляемого вебхука включает в себя идентификатор сервиса и идентификатор диалога в рамках которого работает сценарий.

Модификатор шага .получитьАдресВебхука для получения адреса вебхука в диалоге.

Модификатор шага .выставитьВебхук(limit) для выставления вебхука и ожидания поступления вызова от другого сервиса, где limit это время ожидание ответа в секундах. Используется вместе с модификатором .сохранитьРезультатКакСтроку()

Code Block
breakoutModewide
// запросустановили иадрес сохранениевнешней результата в строку
вызвать.внешнийСервиссистемы
установитьПеременную("{comand_url}", "POST").сТеломСообщения("{query}").сохранитьРезультатКакСтроку("answer")https://host.ru") +
//
// получили адрес вебхука
вызвать.получитьАдресВебхука("webhook_url") +
//
разбор ответа в JS коде (рассмотрено ниже)// собираем тело основного запроса с адресом вебхука
выполнитьJs("""
var request_body try= {'request':'run',     var answerParsed'param_request':param_request};
var exit = {'request_body':JSON.parsestringify(answerrequest_body)};
  } catch(errexit;
""") {+
//
// отправляем  var answerParsed = {'results':[]};
  }
   
  var resultsLength = answerParsed.results.length;
  var exit = {'resultsLength ':resultsLength};
  exit;
""") +
...

Сервисные шаги

если(*условие).то(*операции) 

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

Пример сообщения, отправляемого пользователю при равенстве переменной error единице.

Code Block
breakoutModewide
если("{error} == 1").то(
   сообщениеПользователю.сШаблоном("Система не работает")    
) +
...

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

Code Block
breakoutModewide
если("{when} == завтра").то(
   задатьПользователюВопрос("Ок! Введи пожалуйста нужное время").сохранитьРезультат("time") +
   запрос
вызвать.внешнийСервис("{comand_url}", "POST").сЗаголовками(("Content-Type", "application/json")).сТелом("{request_body}").сохранитьРезультатКакСтроку("responce") +
//
// включить вебхук - указать таймер ожидания 30 секунд и указать в какую переменную будет сохранен полученный JSON 
вызвать.выставитьВебхук(30).сохранитьРезультатКакСтроку("result") +

.сСоставнымТеломСообщения(*args)

Модификатор шага вызова сервиса для передачи multipart тела запроса для передачи файлов. При передаче файла можно указать либо полное название файла либо идентификатор файла в файловом хранилище диалога.

Code Block
breakoutModewide
// передача файла через указание пути
вызвать.внешнийСервис("{url}", "POST").сСоставнымТеломСообщения(("content" -> "C:/docker.yml")).сохранитьРезультат(("result", "answer_code")) +
// передача файла через идентификатор файла в хранилище
вызвать.внешнийСервис("{url}", "POST").сЗаголовками(("apikey","{apikey_var}")).сСоставнымТеломСообщения(("content" -> "{fileId}"),("type" -> "addAttach")).сохранитьРезультат(("result", "answer_code")) +

.сохранитьРезультатКакСтроку(*переменная)

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

Ответ может быть разобран далее по ходу сценария.

Code Block
breakoutModewide
// запрос и сохранение результата в строку
вызвать.внешнийСервис("{url}", "GETPOST").сПараметрамисТеломСообщения(("time","{timequery}")).сохранитьРезультатКакСтроку("resultanswer"))+
)// +разбор ...

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

.и(*условие)

Модификатор для указания дополнительного условия, объединененного с основным условием логической операцией И. Итоговый набор шагов будет выполнен только при одновременном выполнении основного и дополнительного условий.

Code Block
breakoutModewide
если("{error} == 0").и("{connection_mistakes} == 0").то(
   сообщениеПользователю.сШаблоном("Система работает")
)+

.или(*условие)

Модификатор для указания дополнительного условия, объединененного с основным условием логической операцией ИЛИ. Итоговый набор шагов будет выполнен при выполнении одного из условий - основного или дополнительного.

Code Block
breakoutModewide
если("{error} == 1").или("{connection_mistakes} == 1").то(
   сообщениеПользователю.сШаблоном("Система не отвечает")
)+

установитьМетку(*название)

Шаг установки метки в коде сценария. Метка используется для перехода из любого места сценария.

Code Block
breakoutModewide
установитьМетку("разответа в JS коде (рассмотрено ниже)
выполнитьJs("""
  try {
    var answerParsed = JSON.parse(answer);
  } catch(err) {
    var answerParsed = {'results':[]};
  }
   
  var resultsLength = answerParsed.results.length;
  var exit = {'resultsLength ':resultsLength};
  exit;
""") +
...
перейтиНаМетку("раз")+

перейтиНаМетку(*метка)

Шаг перехода на установленную в коде сценария метку.

code

...

Сервисные шаги

если(*условие).то(*операции) 

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

Пример сообщения, отправляемого пользователю при равенстве переменной error единице.

Code Block
breakoutModewide
если("{error} == 01").ито(
   сообщениеПользователю.сШаблоном("{connection_mistakes} == 0").то(Система не работает")    //
переход) на метку без указания лимита переходов, используется значение по-умолчанию 30
   перейтиНаМетку("раз") 
) +
...        

Если указанной метки не существует - шаг перехода будет проигнорирован. Для ограничения бесконечного зацикливания сценария в шаге установлен лимит на количество переходов равный 30. Для установки другого ограничения количества переходов служит модификатор шага.

.неБольше(*количество)

Модификатор для установки лимита по количеству переходов. При достижении лимита сценарий не перейдет на метку, а продожит работу далее по коду.

Code Block
перейтиНаМетку("раз").неБольше(3) +

комментарий(*сообщение)

Шаг позволяет добавлять комментарий в диалог. Комментарий виден администраторам и операторам системы, пользователь не видит комментарии. Шаг принимает в качестве аргумента текст комментарий. Текст комментария может включать переменные.

Code Block
breakoutModewide
комментарий("Сменил тематику чата на {newTheme}") +
...

выполнитьJs(*скрипт)

Шаг выполнения скрипта на JavaScript. Шаг позволяет реализовать произвольную логику вычислений или разбор сложных объектов. В качестве аргумета шаг принимает текст JS скрипта.

Info

Javascript VM соответствует ECMAScript 5.1

Используйте обычный синтаксис callback function поскольку не поддерживается синтаксис lambda функций ES6

JS скрипт имеет доступ ко всем переменным сценария. Результаты скрипта следует записать в JSON объект и передать его на выход, в DSL сценарии можно будет получить к ним доступ по названиям полей.

Пример JS кода с выводом результата в переменной exit.

Code Block
breakoutModewide
выполнитьJs("""
  var uids = JSON.parse(results);
  var ln = uids.length;
  if (ln == 0) {
     var uuid = '';
  } else {
     var uuid = uids[0]["UUID"];
  }
  var exit = {'uuid':uuid, 'numberOfUids':ln};
  exit;
""") +
завершитьСШаблоном("Заявка создана, всего создано полей {numberOfUids}, первый id - {uuid}.")

Внутри JavaScript есть возможность получить данные об операторе для случая, когда запущен сценарий на интеграцию по кнопке. Название объекта - initByOperator.

Пример использования:

Code Block
выполнитьJs("""
var initByOperator = JSON.parse(initByOperator);
var initByOperatorLogin = initByOperator.login;
var exit = {'operatorLogin ': initByOperatorLogin, 'operatorFIO': initByOperator.fullName, 'operatorEmail': initByOperator.email};
exit;
""")+
комментарий("ФИО оператора: {operatorFIO}") +
комментарий("Логин оператора: {operatorLogin}") +
комментарий("Email оператора: {operatorEmail}") +

Весь список параметров, к которым можно получить доступ:

id: String, login: String, fullName: Option[String], isActive: Boolean, isNotify: Boolean, serviceId: String, actions: Seq[UserRoleType], email: Option[String], settings: UserSettings = UserSettings()

...

+
...

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

Code Block
breakoutModewide
если("{when} == завтра").то(
   задатьПользователюВопрос("Ок! Введи пожалуйста нужное время").сохранитьРезультат("time") +
   вызвать.внешнийСервис("{url}", "GET").сПараметрами(("time","{time}")).сохранитьРезультатКакСтроку("result"))
) +
...

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

.иначе(*операции)

Модификатор шага, содержащий блок операций, которые будут выполнятся, если условие не будет соблюдено

Code Block
breakoutModewide
если("{when} == завтра").то(
   задатьПользователюВопрос("Ок! Введи пожалуйста нужное время").сохранитьРезультат("time") +
   вызвать.внешнийСервис("{url}", "GET").сПараметрами(("time","{time}")).сохранитьРезультатКакСтроку("result"))
).иначе(
   сообщениеПользователю.сШаблоном("Ничего не выбрали")
) +
...

.и(*условие)

Модификатор для указания дополнительного условия, объединененного с основным условием логической операцией И. Итоговый набор шагов будет выполнен только при одновременном выполнении основного и дополнительного условий.

Code Block
breakoutModewide
если("{error} == 0").и("{connection_mistakes} == 0").то(
   сообщениеПользователю.сШаблоном("Система работает")
)+

.или(*условие)

Модификатор для указания дополнительного условия, объединененного с основным условием логической операцией ИЛИ. Итоговый набор шагов будет выполнен при выполнении одного из условий - основного или дополнительного.

Code Block
breakoutModewide
если("{error} == 1").или("{connection_mistakes} == 1").то(
   сообщениеПользователю.сШаблоном("Система не отвечает")
)+

...

установитьМетку(*название)

Шаг установки метки в коде сценария. Метка используется для перехода из любого места сценария.

Code Block
breakoutModewide
установитьМетку("раз") +
...
перейтиНаМетку("раз")+

...

перейтиНаМетку(*метка)

Шаг перехода на установленную в коде сценария метку.

Code Block
breakoutModewide
если("{error} == 0").и("{connection_mistakes} == 0").то(
   // переход на метку без указания лимита переходов, используется значение по-умолчанию 30
   перейтиНаМетку("раз") 
) +
...        

Если указанной метки не существует - шаг перехода будет проигнорирован. Для ограничения бесконечного зацикливания сценария в шаге установлен лимит на количество переходов равный 30. Для установки другого ограничения количества переходов служит модификатор шага.

.неБольше(*количество)

Модификатор для установки лимита по количеству переходов. При достижении лимита сценарий не перейдет на метку, а продожит работу далее по коду.

Code Block
перейтиНаМетку("раз").неБольше(3) +

комментарий(*сообщение)

Шаг позволяет добавлять комментарий в диалог. Комментарий виден администраторам и операторам системы, пользователь не видит комментарии. Шаг принимает в качестве аргумента текст комментарий. Текст комментария может включать переменные.

Code Block
breakoutModewide
комментарий("Сменил тематику чата на {newTheme}") +
...

...

выполнитьJs(*скрипт)

Шаг выполнения скрипта на JavaScript. Шаг позволяет реализовать произвольную логику вычислений или разбор сложных объектов. В качестве аргумента шаг принимает текст JS скрипта.

Info

Javascript VM соответствует ECMASript 2016+

Используйте обычный синтаксис callback function поскольку не поддерживается синтаксис lambda функций ES6

JS скрипт имеет доступ ко всем переменным сценария. Результаты скрипта следует записать в JSON объект и передать его на выход, в DSL сценарии можно будет получить к ним доступ по названиям полей.

Пример JS кода с выводом результата в переменной exit.

Code Block
breakoutModewide
выполнитьJs("""
  var uids = JSON.parse(results);
  var ln = uids.length;
  if (ln == 0) {
     var uuid = '';
  } else {
     var uuid = uids[0]["UUID"];
  }
  var exit = {'uuid':uuid, 'numberOfUids':ln};
  exit;
""") +
завершитьСШаблоном("Заявка создана, всего создано полей {numberOfUids}, первый id - {uuid}.")

Внутри JavaScript есть возможность получить данные об операторе для случая, когда запущен сценарий на интеграцию по кнопке. Название объекта - initByOperator.

Пример использования:

Code Block
выполнитьJs("""
var initByOperator = JSON.parse(initByOperator);
var initByOperatorLogin = initByOperator.login;
var exit = {'operatorLogin ': initByOperatorLogin, 'operatorFIO': initByOperator.fullName, 'operatorEmail': initByOperator.email};
exit;
""")+
комментарий("ФИО оператора: {operatorFIO}") +
комментарий("Логин оператора: {operatorLogin}") +
комментарий("Email оператора: {operatorEmail}") +

Весь список параметров, к которым можно получить доступ:

id: String, login: String, fullName: Option[String], isActive: Boolean, isNotify: Boolean, serviceId: String, actions: Seq[UserRoleType], email: Option[String], settings: UserSettings = UserSettings()

knowledgeBases: Seq[Long] = Seq.empty, autoAssignEnabled: Boolean = false

Также есть доступ к библиотеке crypto-js и подготовлена готовая функции encode для генерации JWT токенов:

Code Block
var encoded = encode(
    {
      header: {
        alg: "HS256",
        typ: "JWT"
      },
      data: {
        id: 1337,
        username: "john.doe"
      }
    },
    "My very confidential secret!!!"
  );

...

Управление диалогом

запросВБазыЗнаний(*args)

...

Code Block
breakoutModewide
запросВБазыЗнаний("Как купить слона", "botKnows")+
если("{botKnows} == true").то(
  сообщениеПользователю.сШаблоном("Ответ есть")
)+
Info

Если группа в диалоге не определена на момент выполнения шага (например, в интеграции на событие “поступление диалога в систему”), то запрос будет отправлен в базы знаний основной группы.

назначитьТематику(*идентификатор)

...

Code Block
breakoutModewide
добавитьПолеВФормуОператора(
  форма = "Заведение заявки в Service Desk",
  переменная = "t1",
  название = "Описание заявки",
  тип = "Многострочный редактируемый текст",
  описание = "Опишите вашу проблему",
  обязательное = true
)

Список возможных значений параметра "тип":

  • Нередактируемый текст - вывод нередактируемого текстового сооющения на форме

  • Однострочный редактируемый текст - вывод однострочного поля для ввода

  • Многострочный редактируемый текст - вывод многострочного поля для ввода

  • Целое число - вывод поля для ввода целого числа

  • Выпадающий список - вывод поля для выбора одного значения из выпадающего списка

  • Множественный выбор - вывод поля для выбора нескольких значений из выпадающего списка

  • Переключатель - вывод переключателя, который сохранит булево значение true или false

  • Файлы - вывод поля для прикладывания файлов оператором

  • Дата - вывод поля с выбором даты (календарь)

  • Время - вывод поля для ввода времени в формате ЧЧ:ММ

  • ДатаВремя - вывод поля для ввода даты и времени (календарь и текстовое поле)

Для полей типа Выпадающий список или Множественный выбор необходимо указание параметра варианты . Данный парметр параметр должен содержать сериализованное представление списка вариантов в формате ключ-значение.

...

Code Block
breakoutModewide
установитьПеременную("slots", "{\"1\": \"Утро с 9 до 12\", \"2\": \"День с 12 до 18\", \"3\": \"Вечер с 18 до 21\", \"4\": \"Ночь с 21 до 24\"}") +
...
добавитьПолеВФормуОператора(
  форма = "Заведение заявки в Service Desk",
  переменная = "slot",
  название = "Временной слот",
  тип = "Выпадающий список",
  описание = "",
  обязательное = true,
  варианты = "{slots}"
) +
...

 

показатьФормуОператору(имя = "форма")

...