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