UNPKG

recime-bot-runtime

Version:

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

245 lines (244 loc) 9.62 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var objectMapper = require("object-mapper"); var query = require("querystring"); var MessageConverter = /** @class */ (function () { function MessageConverter(platform) { this.platform = platform; } MessageConverter.prototype.convert = function (body) { var platforms = [ "telegram", "twilio", "wechat", "slack", "facebook", "viber", "kik", "bot-framework" ]; if (platforms.indexOf(this.platform) >= 0) { var mapped = { 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" }, 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]); mapped.text = result.text; mapped.sender = result.sender; var normalizePayload = function (payload) { var regExp = new RegExp(process.env.UID + "-", "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")) { mapped.event = { name: "start" }; delete mapped["text"]; } else { switch (body.channelId) { case "facebook": { if (body.channelData && body.channelData.postback) { mapped.event = { name: normalizePayload(body.channelData.postback.payload) }; delete mapped["text"]; } break; } default: { var regExp = new RegExp(process.env.UID + "-", "ig"); // text if (mapped.text && mapped.text.match(regExp)) { mapped.event = { name: mapped.text.replace(regExp, "") }; delete mapped["text"]; } } } } break; } case "facebook": { var parseRef = function (body) { return query.parse(((body.referral || (body.postback || {}).referral) || {}).ref); }; if (body.postback) { mapped.event = { name: body.postback.payload, }; } // process ref. var ref = parseRef(body); if (Object.keys(ref).length > 0) { mapped.event = { name: ref.intent || 'start', }; mapped.campaign = ref; } if (body.message && body.message.attachments) { mapped.attachments = body.message.attachments; switch (mapped.attachments[0].type) { case "location": { if (mapped.attachments[0].payload) { var location_1 = mapped.attachments[0].payload.coordinates; mapped.location = { lat: location_1.lat, long: location_1.long }; // set it as event. mapped.event = { name: mapped.attachments[0].type }; } break; } default: { mapped.event = { name: "default" }; } } } else if (body.message && body.message.quick_reply) { var quick_reply = body.message.quick_reply; mapped.event = { name: quick_reply.payload }; } break; } case "viber": { if (body.event !== "message") { mapped.event = { name: body.event.replace(/^conversation_started$/gi, "start") }; } // location. if (body.message && body.message.location) { var location_2 = body.message.location; mapped.location = { lat: location_2.lat, long: location_2.lon }; mapped.event = { name: "location" }; } // hack for user if (body.user) { mapped.sender = body.user.id; } var regExp = new RegExp(process.env.UID + "-", "ig"); if (mapped.text && mapped.text.match(regExp)) { mapped.event = { name: mapped.text.replace(regExp, "") }; } break; } case "telegram": { var regExp = new RegExp("/[A-Za-z0-9]+", "ig"); // text if (mapped.text && mapped.text.match(regExp)) { mapped.event = { name: mapped.text.replace(/\//gi, "") }; } // process location. if (body.message && body.message.location) { mapped.location = { lat: body.message.location.latitude, long: body.message.location.longitude }; mapped.event = { name: "location" }; } if (body.data) { mapped.event = { name: body.data }; mapped.sender = body.from.id; } break; } case "slack": { mapped.event = { name: body.event.type }; break; } case "wechat": { if (body.Event && body.Event === "subscribe") { mapped.event = { name: "start" }; } else if (body.MsgType === "event" && body.EventKey) { mapped.event = { name: body.EventKey }; } break; } case "kik": { break; } } return mapped; } var empty = new Object(); body.event = body.event || empty; body.meta = body.meta || empty; body.timestamp = new Date().getTime(); return body; }; return MessageConverter; }()); exports.MessageConverter = MessageConverter;