UNPKG

recime-bot-runtime

Version:

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

267 lines (266 loc) 10.7 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var objectMapper = require("object-mapper"); var query = require("querystring"); var MessageProcessor = /** @class */ (function () { function MessageProcessor(botId, platform) { this.botId = botId; this.platform = platform; } MessageProcessor.prototype.convert = function (body) { var _this = this; var platforms = [ "telegram", "twilio", "wechat", "sendbird", "slack", "facebook", "viber", "kik", "bot-framework" ]; if (platforms.indexOf(this.platform) >= 0) { var message_1 = { rawBody: body, timestamp: new Date().getTime(), event: {} }; var metadata = { "bot-framework": { "conversation.id": "sender", text: "text" }, facebook: { "sender.id": "sender", "message.text": "text", "messsage.nlp": "nlp" }, telegram: { "message.from.id": "sender", "message.text": "text" }, twilio: { Body: "text", From: "sender" }, wechat: { FromUserName: "sender", Content: "text" }, sendbird: { "sender.user_id": "sender", "message.text": "text" }, slack: { "event.user": "sender", "event.text": "text" }, viber: { "sender.id": "sender", "message.text": "text", event: "event.name" }, kik: { from: "sender", body: "text" } }; var result = objectMapper(body, metadata[this.platform]); message_1.text = result.text; message_1.sender = result.sender; var normalizePayload = function (payload) { var regExp = new RegExp(_this.botId + "-", "ig"); // text if (payload.match(regExp)) { return payload.replace(regExp, ""); } return payload; }; switch (this.platform) { case "bot-framework": { if (body.type === "conversationUpdate" || (body.type === "contactRelationUpdate" && body.action === "add")) { message_1.event = { name: "start" }; delete message_1["text"]; } else { switch (body.channelId) { case "facebook": { if (body.channelData && body.channelData.postback) { message_1.event = { name: normalizePayload(body.channelData.postback.payload) }; delete message_1["text"]; } break; } default: { var regExp = new RegExp(this.botId + "-", "ig"); // text if (message_1.text && message_1.text.match(regExp)) { message_1.event = { name: message_1.text.replace(regExp, "") }; delete message_1["text"]; } } } } break; } case "facebook": { if (body.referral) { message_1.event = { name: body.referral.ref || 'start', }; } else if (body.postback) { message_1.event = { name: body.postback.payload, }; } if (body.message && body.message.attachments) { message_1.attachments = body.message.attachments; switch (message_1.attachments[0].type) { case "location": { if (message_1.attachments[0].payload) { var location_1 = message_1.attachments[0].payload.coordinates; message_1.location = { lat: location_1.lat, long: location_1.long }; // set it as event. message_1.event = { name: message_1.attachments[0].type }; } break; } default: { message_1.event = { name: "default" }; } } } else if (body.message && body.message.quick_reply) { var quick_reply = body.message.quick_reply; message_1.event = { name: quick_reply.payload }; } break; } case "viber": { var parseContext = function (context) { if (context) { var qs = query.parse(body.context); if (typeof qs === 'object' && qs.block) { message_1.campaign = qs; return qs.block; } } return context; }; if (body.event !== "message") { message_1.event = { name: parseContext(body.context) || body.event.replace(/^conversation_started$/gi, "start") }; } // location. if (body.message && body.message.location) { var location_2 = body.message.location; message_1.location = { lat: location_2.lat, long: location_2.lon }; message_1.event = { name: "location" }; } // hack for user if (body.user) { message_1.sender = body.user.id; } var regExp = new RegExp(this.botId + "-", "ig"); if (message_1.text && message_1.text.match(regExp)) { message_1.event = { name: message_1.text.replace(regExp, "") }; delete message_1['text']; } console.log('viber message', JSON.stringify(message_1)); break; } case "telegram": { var regExp = new RegExp("/[A-Za-z0-9]+", "ig"); // text if (message_1.text) { if (message_1.text.match(regExp)) { message_1.event = { name: message_1.text.replace(/\//gi, "") }; } } else if (body.message && body.message.chat.type === 'group') { message_1.event = { name: 'start' }; } // process location. if (body.message && body.message.location) { message_1.location = { lat: body.message.location.latitude, long: body.message.location.longitude }; message_1.event = { name: "location" }; } if (body.data) { message_1.event = { name: body.data }; // store as string message_1.sender = body.from.id; } message_1.sender = new Number(message_1.sender).toString(); break; } case "slack": { message_1.event = { name: body.event.type }; break; } case "wechat": { if (body.Event && body.Event === "subscribe") { message_1.event = { name: "start" }; } else if (body.MsgType === "event" && body.EventKey) { message_1.event = { name: body.EventKey }; } break; } case "kik": { break; } } return message_1; } var empty = new Object(); body.event = body.event || empty; body.meta = body.meta || empty; body.timestamp = new Date().getTime(); return body; }; return MessageProcessor; }()); exports.MessageProcessor = MessageProcessor;