UNPKG

recime-bot-runtime

Version:

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

266 lines (265 loc) 10.6 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 = { 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.text = result.text; message.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.event = { name: "start" }; delete message["text"]; } else { switch (body.channelId) { case "facebook": { if (body.channelData && body.channelData.postback) { message.event = { name: normalizePayload(body.channelData.postback.payload) }; delete message["text"]; } break; } default: { var regExp = new RegExp(this.botId + "-", "ig"); // text if (message.text && message.text.match(regExp)) { message.event = { name: message.text.replace(regExp, "") }; delete message["text"]; } } } } break; } case "facebook": { console.log('message', body.message); var parseRef = function (body) { return query.parse(((body.referral || (body.postback || {}).referral) || {}).ref); }; // process ref. var ref = parseRef(body); if (Object.keys(ref).length > 0) { message.event = { name: ref.utm_term || ref.intent || 'start', }; message.campaign = ref; } else if (body.postback) { message.event = { name: body.postback.payload, }; } if (body.message && body.message.attachments) { message.attachments = body.message.attachments; switch (message.attachments[0].type) { case "location": { if (message.attachments[0].payload) { var location_1 = message.attachments[0].payload.coordinates; message.location = { lat: location_1.lat, long: location_1.long }; // set it as event. message.event = { name: message.attachments[0].type }; } break; } default: { message.event = { name: "default" }; } } } else if (body.message && body.message.quick_reply) { var quick_reply = body.message.quick_reply; message.event = { name: quick_reply.payload }; } break; } case "viber": { console.log('event', body.event); console.log('body', JSON.stringify(body)); if (body.event !== "message") { message.event = { name: body.event.replace(/^conversation_started$/gi, "start") }; } // location. if (body.message && body.message.location) { var location_2 = body.message.location; message.location = { lat: location_2.lat, long: location_2.lon }; message.event = { name: "location" }; } // hack for user if (body.user) { message.sender = body.user.id; } var regExp = new RegExp(this.botId + "-", "ig"); if (message.text && message.text.match(regExp)) { message.event = { name: message.text.replace(regExp, "") }; delete message['text']; } console.log('viber message', JSON.stringify(message)); break; } case "telegram": { var regExp = new RegExp("/[A-Za-z0-9]+", "ig"); // text if (message.text) { if (message.text.match(regExp)) { message.event = { name: message.text.replace(/\//gi, "") }; } } else if (body.message && body.message.chat.type === 'group') { message.event = { name: 'start' }; } // process location. if (body.message && body.message.location) { message.location = { lat: body.message.location.latitude, long: body.message.location.longitude }; message.event = { name: "location" }; } if (body.data) { message.event = { name: body.data }; // store as string message.sender = body.from.id; } message.sender = new Number(message.sender).toString(); break; } case "slack": { message.event = { name: body.event.type }; break; } case "wechat": { if (body.Event && body.Event === "subscribe") { message.event = { name: "start" }; } else if (body.MsgType === "event" && body.EventKey) { message.event = { name: body.EventKey }; } break; } case "kik": { break; } } return message; } 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;