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