UNPKG

recime-bot-runtime

Version:

This runtime is intended to run inside a micro-service container with platform specific integration and module interpreter.

167 lines (166 loc) 7.4 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var handlebars_1 = require("handlebars"); var recime_keyvalue_store_1 = require("recime-keyvalue-store"); var recime_bot_extension_1 = require("recime-bot-extension"); var request_1 = require("./request"); var vars_1 = require("./vars"); var date_validator_1 = require("./validators/date-validator"); var number_validator_1 = require("./validators/number-validator"); var string_validator_1 = require("./validators/string-validator"); var nlp_1 = require("./nlp"); var Responder = /** @class */ (function () { function Responder(context) { this.__ = recime_bot_extension_1.default[context.platform]; this.context = context; } Responder.prototype.respond = function () { var _this = this; var db = recime_keyvalue_store_1.default.init(this.context.bot.id); var __ = this.__; return db.get(this.context.args.sender).then(function (values) { var vars = new vars_1.Vars(_this.context.args.sender, JSON.parse(values) || {}); var data = vars.get('user-input'); _this.processEvent(_this.context.args); if (data && data.response && _this.context.args.text) { var message = data.response[data.index]; var content = message.content; vars.set('system_message_id', message.id); var validator_1; switch (content.dataType) { case 'string': validator_1 = new string_validator_1.StringValidator(_this); break; case 'number': validator_1 = new number_validator_1.NumberValidator(_this); break; case 'date': validator_1 = new date_validator_1.DateValidator(_this); } return new Promise(function (resolve) { validator_1.validate(__, vars, _this.context.args, data) .then(resolve) .catch(function (message) { nlp_1.Nlp.response(_this.context, { text: _this.context.args.text }).then(function (r) { console.log('user-input', r.intent); if (r.intent && r.intent.toLowerCase() !== 'default') { return nlp_1.Nlp.getIntents(_this.context).then(function (intents) { var i = intents.find(function (i) { return i.name.toLowerCase() === r.intent; }); vars.unset('user-input'); vars.unset('system_message_id'); return _this.processResponse({ response: i.response, nlp: r.response }, vars).then(resolve); }); } resolve(message); }); }); }); } // clear up dirty user input. vars.unset('user-input'); return _this.processRequest(vars); }); }; Responder.prototype.processEvent = function (args) { // convert postback to user input. if (args.event && args.event.name) { var match = args.event.name.match(/^reply-.*/ig); if (match) { args.text = match[0].replace(/^reply-/ig, ""); } else { // regular event; quick_reply; delete args['text']; } } }; Responder.prototype.processRequest = function (vars) { var _this = this; return nlp_1.Nlp.request({ bot: this.context.bot, // args can be different (e.g. go to) args: this.context.args }).then(function (result) { console.log('nlp response ', JSON.stringify(result)); return _this.processResponse(result, vars); }).catch(function (error) { return _this.__.text(error.message); }); }; Responder.prototype.processResponse = function (r, vars) { var _this = this; return this.__.profile(this.context.args).then(function (user) { if (!r.index) { vars.set("nlp", r.nlp); } vars.set("args", _this.context.args); var req = new request_1.Request(_this, { vars: vars, context: _this.context, user: user, nlp: vars.get("nlp") || {} }); return req.send(_this.__, r.response).then(function (result) { if (_this.context.bot.config.PLATFORM === 'telegram') { if (Array.isArray(result)) { // ensure it's a flat array. result = result.reduce(function (a, b) { return a.concat(b); }, []); } } // remember if (_this.context.args.campaign) { Object.assign(vars.values, _this.context.args.campaign); } var content = JSON.stringify(result); var match = content.match(/{{([a-zA-Z0-9\s]+)}}/ig); // remove empty spaces if (match && match.length) { for (var _i = 0, match_1 = match; _i < match_1.length; _i++) { var item = match_1[_i]; content = content.replace(item, item.replace(/[\s+]/ig, "_")); } } var template = handlebars_1.default.compile(content); var jsonEscape = function (str) { return str.replace(/\n/g, "\\n").replace(/\r/g, "\\r").replace(/\t/g, "\\t"); }; var sender = { sender: _this.context.args.sender }; var entities = _this.processEntities(r.nlp); // track sender. var jsonStr = template(Object.assign({}, vars.values, user, sender, entities)); var response = JSON.parse(jsonEscape(jsonStr)); // remove temp vars. vars.unset('nlp'); vars.unset('args'); vars.unset('system_message_id'); var db = recime_keyvalue_store_1.default.init(_this.context.bot.id); return db.set(_this.context.args.sender, JSON.stringify(vars.values)) .then(function () { return response; }); }).catch(function (error) { console.error(error); return _this.__.text(error.message); }); }); }; Responder.prototype.processEntities = function (nlp) { if (nlp && nlp.entities) { var obj_1 = {}; nlp.entities.forEach(function (e) { obj_1[e.entity] = e; }); return obj_1; } return {}; }; return Responder; }()); exports.Responder = Responder;