UNPKG

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
"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;