UNPKG

9.62 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3var objectMapper = require("object-mapper");
4var query = require("querystring");
5var MessageConverter = /** @class */ (function () {
6 function MessageConverter(platform) {
7 this.platform = platform;
8 }
9 MessageConverter.prototype.convert = function (body) {
10 var platforms = [
11 "telegram",
12 "twilio",
13 "wechat",
14 "slack",
15 "facebook",
16 "viber",
17 "kik",
18 "bot-framework"
19 ];
20 if (platforms.indexOf(this.platform) >= 0) {
21 var mapped = {
22 rawBody: body,
23 timestamp: new Date().getTime(),
24 event: {}
25 };
26 var metadata = {
27 "bot-framework": {
28 "conversation.id": "sender",
29 text: "text"
30 },
31 facebook: {
32 "sender.id": "sender",
33 "message.text": "text",
34 "messsage.nlp": "nlp"
35 },
36 telegram: {
37 "message.from.id": "sender",
38 "message.text": "text"
39 },
40 twilio: {
41 Body: "text",
42 From: "sender"
43 },
44 wechat: {
45 FromUserName: "sender",
46 Content: "text"
47 },
48 slack: {
49 "event.user": "sender",
50 "event.text": "text"
51 },
52 viber: {
53 "sender.id": "sender",
54 "message.text": "text",
55 event: "event.name"
56 },
57 kik: {
58 from: "sender",
59 body: "text"
60 }
61 };
62 var result = objectMapper(body, metadata[this.platform]);
63 mapped.text = result.text;
64 mapped.sender = result.sender;
65 var normalizePayload = function (payload) {
66 var regExp = new RegExp(process.env.UID + "-", "ig");
67 // text
68 if (payload.match(regExp)) {
69 return payload.replace(regExp, "");
70 }
71 return payload;
72 };
73 switch (this.platform) {
74 case "bot-framework": {
75 if (body.type === "conversationUpdate" ||
76 (body.type === "contactRelationUpdate" && body.action === "add")) {
77 mapped.event = {
78 name: "start"
79 };
80 delete mapped["text"];
81 }
82 else {
83 switch (body.channelId) {
84 case "facebook": {
85 if (body.channelData && body.channelData.postback) {
86 mapped.event = {
87 name: normalizePayload(body.channelData.postback.payload)
88 };
89 delete mapped["text"];
90 }
91 break;
92 }
93 default: {
94 var regExp = new RegExp(process.env.UID + "-", "ig");
95 // text
96 if (mapped.text && mapped.text.match(regExp)) {
97 mapped.event = {
98 name: mapped.text.replace(regExp, "")
99 };
100 delete mapped["text"];
101 }
102 }
103 }
104 }
105 break;
106 }
107 case "facebook": {
108 var parseRef = function (body) {
109 return query.parse(((body.referral || (body.postback || {}).referral) || {}).ref);
110 };
111 if (body.postback) {
112 mapped.event = {
113 name: body.postback.payload,
114 };
115 }
116 // process ref.
117 var ref = parseRef(body);
118 if (Object.keys(ref).length > 0) {
119 mapped.event = {
120 name: ref.intent || 'start',
121 };
122 mapped.campaign = ref;
123 }
124 if (body.message && body.message.attachments) {
125 mapped.attachments = body.message.attachments;
126 switch (mapped.attachments[0].type) {
127 case "location": {
128 if (mapped.attachments[0].payload) {
129 var location_1 = mapped.attachments[0].payload.coordinates;
130 mapped.location = {
131 lat: location_1.lat,
132 long: location_1.long
133 };
134 // set it as event.
135 mapped.event = {
136 name: mapped.attachments[0].type
137 };
138 }
139 break;
140 }
141 default: {
142 mapped.event = {
143 name: "default"
144 };
145 }
146 }
147 }
148 else if (body.message && body.message.quick_reply) {
149 var quick_reply = body.message.quick_reply;
150 mapped.event = {
151 name: quick_reply.payload
152 };
153 }
154 break;
155 }
156 case "viber": {
157 if (body.event !== "message") {
158 mapped.event = {
159 name: body.event.replace(/^conversation_started$/gi, "start")
160 };
161 }
162 // location.
163 if (body.message && body.message.location) {
164 var location_2 = body.message.location;
165 mapped.location = {
166 lat: location_2.lat,
167 long: location_2.lon
168 };
169 mapped.event = {
170 name: "location"
171 };
172 }
173 // hack for user
174 if (body.user) {
175 mapped.sender = body.user.id;
176 }
177 var regExp = new RegExp(process.env.UID + "-", "ig");
178 if (mapped.text && mapped.text.match(regExp)) {
179 mapped.event = {
180 name: mapped.text.replace(regExp, "")
181 };
182 }
183 break;
184 }
185 case "telegram": {
186 var regExp = new RegExp("/[A-Za-z0-9]+", "ig");
187 // text
188 if (mapped.text && mapped.text.match(regExp)) {
189 mapped.event = {
190 name: mapped.text.replace(/\//gi, "")
191 };
192 }
193 // process location.
194 if (body.message && body.message.location) {
195 mapped.location = {
196 lat: body.message.location.latitude,
197 long: body.message.location.longitude
198 };
199 mapped.event = {
200 name: "location"
201 };
202 }
203 if (body.data) {
204 mapped.event = {
205 name: body.data
206 };
207 mapped.sender = body.from.id;
208 }
209 break;
210 }
211 case "slack": {
212 mapped.event = {
213 name: body.event.type
214 };
215 break;
216 }
217 case "wechat": {
218 if (body.Event && body.Event === "subscribe") {
219 mapped.event = {
220 name: "start"
221 };
222 }
223 else if (body.MsgType === "event" && body.EventKey) {
224 mapped.event = {
225 name: body.EventKey
226 };
227 }
228 break;
229 }
230 case "kik": {
231 break;
232 }
233 }
234 return mapped;
235 }
236 var empty = new Object();
237 body.event = body.event || empty;
238 body.meta = body.meta || empty;
239 body.timestamp = new Date().getTime();
240 return body;
241 };
242 return MessageConverter;
243}());
244exports.MessageConverter = MessageConverter;