recime-bot-runtime
Version:
This runtime is intended to run inside a micro-service container with platform specific integration and module interpreter.
231 lines (230 loc) • 12 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var handlebars_1 = require("handlebars");
var code_block_1 = require("./code-block");
var sequence_1 = require("./sequence");
var Request = /** @class */ (function () {
function Request(responder, options) {
this.responder = responder;
this.options = options;
}
Request.prototype.normalizeButton = function (__, content) {
if (content.buttons) {
return content.buttons.map(function (button) {
switch (button.type) {
case 'reply': {
return __.replyButton(button.title || button.reply, button.reply, button);
}
case 'phone_number': {
button.payload = button.payload.replace(/[\s()-]+/ig, '');
return button;
}
case 'element_share': {
return __.shareButton(button.content);
}
default: {
return button;
}
}
});
}
return void 0;
};
Request.prototype.send = function (__, res) {
var _this = this;
var next = false;
if (res && res.length) {
var msgId_1 = this.options.vars.get('system_message_id');
var response = res.map(function (message, index) { return function () {
if (msgId_1 && !next) {
next = msgId_1 === message.id;
return Promise.resolve();
}
switch (message.type) {
case 'text': {
if (message.content && message.content.text.trim()) {
return Promise.resolve(__.text(message.content.text, _this.normalizeButton(__, message.content)));
}
return Promise.resolve();
}
case 'viber-sticker': {
return Promise.resolve(__.sticker(_this.processStickerIds(message.content)));
}
case 'image':
case 'audio':
case 'video':
case 'file': {
return Promise.resolve(__[message.type](message.content.url, _this.normalizeButton(__, message.content), message.content.assetId, message.content.thumbnail));
}
case 'button-template': {
return Promise.resolve(__.buttonTemplate(message.content.text, _this.normalizeButton(__, message.content)));
}
case 'card-template':
case 'wechat-article':
case 'generic-template': {
return Promise.resolve(__.genericTemplate(message.content.elements.map(function (e) {
return __.genericItem(e.title, e.digest || e.subtitle, e.imageUrl, e.contentSourceUrl || e.actionUrl, _this.normalizeButton(__, e), e.assetId, e.content, e.author);
})));
}
case 'wechat-article': {
return Promise.resolve(__.news(message.content.elements.map(function (e) {
return __.article(e.title, e.digest, e.imageUrl, e.contentSourceUrl, e.content, e.author);
})));
}
case 'code':
case 'json-api': {
try {
var block = new code_block_1.CodeBlock(message);
return block.execute(_this, {
__: __,
context: _this.options.context
}).catch(function (ex) {
return Promise.resolve(__.text(ex.message));
});
}
catch (ex) {
return Promise.resolve(__.text(ex.message));
}
}
case 'set-variable': {
if (message.content && message.content.name) {
var key = message.content.name.replace(/[{}\s]+/ig, '');
var template = handlebars_1.default.compile(message.content.value);
var value = template(_this.options.context.args);
return _this.options.vars.post(key, value);
}
return Promise.resolve();
}
case 'go-to': {
_this.options.vars.unset('system_message_id');
var getValue = function (key) {
key = key.replace(/[{}\s]+/ig, '');
var properties = key.match(/[a-zA-Z0-9_]+/ig);
if (properties) {
var value;
properties.forEach(function (prop) {
value = value ? value[prop] : (Object.assign({}, _this.options.vars.values, _this.responder.processEntities(_this.options.nlp)))[prop];
});
return value;
}
return _this.options.vars.get(key.replace(/[{}\s]+/ig, ''));
};
if (message.content && message.content.intent) {
var match = true;
if (message.content.conditions) {
for (var _i = 0, _a = message.content.conditions; _i < _a.length; _i++) {
var condition = _a[_i];
var result = true;
var value = getValue(condition.variable);
switch (condition.comparer) {
case 'equal':
result = value && condition.value.search(new RegExp(value, 'ig')) === 0;
break;
case 'notEqual':
result = value && condition.value.search(new RegExp(value, 'ig')) === -1;
break;
case 'lessThanOrEqual': {
var num = Number(value);
result = num && num <= condition.value;
break;
}
case 'greaterThanOrEqual': {
var num = Number(value);
result = num && num >= condition.value;
break;
}
}
if (condition.operator
&& condition.operator.match(/or/ig))
match = match || result;
else
match = match && result;
}
}
if (match) {
msgId_1 = message.id;
next = false;
if (_this.responder.context.processedIntents.filter(function (x) { return x === message.content.intent; }).length === 0) {
_this.responder.context.processedIntents.push(message.content.intent);
var args = JSON.parse(JSON.stringify(_this.options.context.args));
args.event = {
name: message.content.intent
};
if (_this.options.context.args.event.name !== message.content.intent) {
_this.responder.context.args = args;
return _this.responder.processRequest(_this.options.vars);
}
return Promise.resolve(__.text("Unreachable flow detected!"));
}
else {
return Promise.resolve(__.text("Recursive flow detected. Please double check your flow and ensure that you are not using \"go-to\" to create a infinite loop."));
}
}
}
return Promise.resolve();
}
case 'user-input': {
msgId_1 = message.id;
next = false;
_this.options.vars
.set(message.type, {
index: index,
response: res
});
return Promise.resolve(_this.break());
}
case 'typing': {
return Promise.resolve(__.typing(message.content.duration));
}
case 'subscribe-sequence': {
var sequence = new sequence_1.Sequence(_this.options.context);
return sequence.subscribe(message.content.sequence).then(function (body) { return Promise.resolve(); });
}
case 'unsubscribe-sequence': {
var sequence = new sequence_1.Sequence(_this.options.context);
return sequence.unsubscribe(message.content.sequence).then(function (body) { return Promise.resolve(); });
}
default: {
var messageType = message.type.replace(/-/ig, ' ');
messageType = messageType.charAt(0).toUpperCase() + messageType.slice(1);
return Promise.resolve(__.text(messageType + " is not enabled for your bot, please send us an email at hello@recime.io to upgrade your bot"));
}
}
}; });
var userInput_1 = false;
return response.reduce(function (a, b) {
return a.then(function (messages) { return b().then(function (message) {
if (message && !userInput_1) {
if (message === _this.break()) {
userInput_1 = true;
}
else {
if (Array.isArray(message)) {
messages.push.apply(messages, message);
}
else {
messages.push(message);
}
}
}
return messages;
}); });
}, Promise.resolve([]));
}
else {
return Promise.resolve(__.text("Sorry I didn't get you."));
}
};
Request.prototype.break = function () {
return "BREAK";
};
Request.prototype.processStickerIds = function (content) {
var ids = content.ids;
if (ids) {
return ids.replace(/[\s]+/ig, "").split(',');
}
return [content.id];
};
return Request;
}());
exports.Request = Request;