// Сценарий отправляет на указанный адрес текст переписки с пользователем.
// Дополнительно к пистму прикладываются все файлы в переписке меньше установленного размера.
// Сценарий может быть использован как для отправки переписки самому пользователю так и для отправки письма в сторонний сервис.
//
// Настройки сценария
//
// Формат текста письма. Установите true для HTML и false для обычного текста.
установитьПеременную("formated_text", "true") +
// Максимальный размер файлов для отправки в качестве вложения. Сценарий сообщит о пропущенных файлах и оператору и получателю письма.
установитьПеременную("maximumFileSize", "10000") +
// Предустановка адреса email пользователя в качестве получателя для быстрой отправки переписки пользователю на его почту.
установитьПеременную("useUserEmail", "true") +
// Адрес отправителя
установитьПеременную("from_email", "noreply@autofaq.ai") +
// Предустановленная тема письма. Оператор сможет сменить тему перед отправкой письма.
установитьПеременную("subject", "Переписка с пользователем {userFullName}")+
//
// Адрес сервиса по отправке писем, встроенного в AutoFAQ
установитьПеременную("host", "http://porter/api/postman/mail") +
//
// Основной код сценария
//
// Сценарий предустанавливает адрес получателя из данных пользователя или оставляет поле пустым
если("{useUserEmail} == true").то(
установитьПеременную("_email", "{userEmail}")
)+
// Сценарий собирает форму для сбора данных у пользователя - адрес и комментарий к письму
добавитьПолеВФормуОператора(
форма = "Отправка текста переписки на электронную почт",
переменная = "formName",
название = "",
значение = "Сценарий отправит электронное письмо с текстом переписки на указанный адрес. Все файлы в переписке будут приложены к письму.",
тип = "Нередактируемый текст",
описание = "",
обязательное = false
) +
добавитьПолеВФормуОператора(
форма = "Отправка текста переписки на электронную почт",
переменная = "email",
значение = "{_email}",
название = "Укажите адрес email",
тип = "Однострочный редактируемый текст",
обязательное = true
) +
добавитьПолеВФормуОператора(
форма = "Отправка текста переписки на электронную почт",
переменная = "subject",
значение = "{subject}",
название = "Укажите тему писма",
тип = "Однострочный редактируемый текст",
обязательное = true
) +
добавитьПолеВФормуОператора(
форма = "Отправка текста переписки на электронную почт",
переменная = "comment",
значение = "",
название = "Комментарий к письму",
тип = "Многострочный редактируемый текст",
обязательное = false
) +
//
// Сценарий отображает форму для опроса оператора
показатьФормуОператору(имя = "Отправка текста переписки на электронную почт") +
//
// Сценарий проверяет файлы в переписке и формирует ссылки для отправки файлов
выполнитьJs("""
try {
var parsedExtFiles = JSON.parse(externalFiles);
} catch(e) {
var parsedExtFiles = [];
}
var numOfFiles = parsedExtFiles.length;
var filesMessage = '';
var filesUrls = [];
var sentFilesNum = 0;
if (numOfFiles > 0) {
for (var f = 0; f < numOfFiles; f++) {
if (parseInt(JSON.parse(parsedExtFiles[f])["size"]) < parseInt(maximumFileSize)) {
filesUrls.push( 'http://bot-platform-back:8090/api/files/' + JSON.parse(parsedExtFiles[f])['id'] );
sentFilesNum += 1;
} else {
filesMessage = filesMessage + (JSON.parse(parsedExtFiles[f])['name']) + ', ';
}
}
}
if (filesMessage != '') {
filesMessage = 'При вложении были пропущены файлы ' + filesMessage.slice(0,filesMessage.length-2) + ' из-за ограничения по размеру вложений ' + maximumFileSize + ' байт';
}
if (sentFilesNum > 0) {
filesMessage = 'К письму были приложены файлы - ' + sentFilesNum.toString() + ' шт. ' + filesMessage;
} else {
filesMessage = 'К письму нет вложенных файлов. ' + filesMessage;
}
var exit = {'filesMessage': filesMessage, 'filesUrls': filesUrls};
exit;
""") +
//
// Сценарий сообщает оператору о вложенных и пропущенных файлах
комментарий("{filesMessage}") +
//
// Сценарий получает историю сообщений и формирует запрос на отправку письма
выполнитьJs("""
var rawText = '';
var msgTypes = ['Question', 'AnswerOperator', 'AnswerChatterbox','AnswerOperatorWithBot','AnswerOperator', 'AnswerBot'];
var labelMap = {
'Question': 'Пользователь:',
'AnswerOperator': 'Оператор:',
'AnswerBot': 'Бот:',
'AnswerChatterbox': 'Бот:',
'AnswerOperatorWithBot': 'Оператор:'
}
if (conversation.channelUser.fullName) {
if (conversation.channelUser.email) {
var line_1 = '<div>Переписка с пользователем <b>' + conversation.channelUser.fullName + '</b> (' + conversation.channelUser.email + ')</div>';
} else {
var line_1 = '<div>Переписка с пользователем <b>' + conversation.channelUser.fullName + '</b> (адрес EMAIL не зарегистрирован)</div>';
}
} else {
if (conversation.channelUser.email) {
var line_1 = '<div>Переписка с пользователем ' + conversation.channelUser.email + ' (ФИО не указано)</div>';
} else {
var line_1 = '<div>Переписка с неизвестным пользователем</div>'
}
}
if (conversation.messages.length > 0) {
var first_event = conversation.messages[0];
var line_2 = '<div>Дата начала диалога ' + first_event.ts.slice(8,10) + '.' + first_event.ts.slice(5,7) + '.' + first_event.ts.slice(0,4);
line_2 = line_2 + ' ' + first_event.ts.slice(11,13) + ':' + first_event.ts.slice(14,16) + '</div><br>';
} else {
var line_2 = '<div>Дата начала диалога не указана</div><br>';
}
if (comment == '' || comment == 'NaN') {
var line_3 = '<div>Оператор не оставил комментарий к переписке.</div>';
} else {
var line_3 = '<div><b>Комментарий оператора к переписке:</b> ' + comment + '</div>';
}
line_3 = line_3 + '<div>' + filesMessage + '</div><br>';
var messages = conversation.messages.filter(function (str) {return msgTypes.indexOf(str.tpe) > -1;});
for (var i = 0; i < messages.length; i++) {
var message = messages[i];
var label = labelMap[message.tpe] || '';
if (label) {
if (formated_text != 'true') {
clean_txt = message.txt.replace(/<a[^>]*href="([^"]+)"[^>]*>(?:.*?<\/a>)?/g, '$1').replace(/<\/?[^>]+(>|$)/g, "").replace(/(\r\n|\n|\r)/gm, '\n');
rawText = rawText + '\n' + message.ts.slice(11,16) + ' ' + label + '\n' + clean_txt;
} else {
clean_txt = message.txt.replace(/(\r\n|\n|\r)/gm, '');
rawText = rawText + '<div>' + message.ts.slice(11,16) + ' ' + label + '</div><div>' + clean_txt + '</div>';
}
}
}
if (rawText == '') {
var line_4 = '<div><b>Содержание переписки недоступно.</b></div>'
} else {
var line_4 = '<div><b>Содержание переписки</b></div>';
}
if (formated_text == 'true') {
var final_text = '<html><head></head><body>' + line_1 + line_2 + line_3 + line_4 + rawText + '</body></html>';
} else {
var final_text = line_1 + '\n' + line_2 + '\n' + line_3 + '\n\n' + line_4;
final_text = final_text.replace(/<\/?[^>]+(>|$)/g, "") + '\n' + rawText;
}
var request = {
from: from_email,
to: email,
subject: subject,
body: final_text,
files: JSON.parse(filesUrls)
}
var exit = {'request': JSON.stringify(request)};
exit;
""")+
//
// Сценарий отправляет запрос на формирование письма
вызвать.внешнийСервис("{host}", "POST").сЗаголовками(("Content-Type","application/json")).сТеломСообщения("{request}").сохранитьРезультатКакСтроку("answer")+
//
// Если сервис по отправке писем ответил ошибкой сценарий сообщает об этом пользователю и завершает работу
если("{http_code} > 202").то(
//если запрос завершен с ошибкой сценарий помещает в диалог соответствующий комментарий и завершает свою работу
комментарий("При отправке письма возникла ошибка {http_code} - {answer}")+
завершить
)+
//
// Если сервис по отправке писем успешно отправляет письмо то сценарий сообщает об отправке и завершает свою работу
комментарий("Письмо с перепиской отправлено на адрес {email}") +
завершить |