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