UNPKG

12.9 kBJavaScriptView Raw
1'use strict';
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports.Bot = exports.wait = exports.Buttons = exports.Elements = undefined;
7
8var _extends2 = require('babel-runtime/helpers/extends');
9
10var _extends3 = _interopRequireDefault(_extends2);
11
12var _assign = require('babel-runtime/core-js/object/assign');
13
14var _assign2 = _interopRequireDefault(_assign);
15
16var _stringify = require('babel-runtime/core-js/json/stringify');
17
18var _stringify2 = _interopRequireDefault(_stringify);
19
20var _getPrototypeOf = require('babel-runtime/core-js/object/get-prototype-of');
21
22var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf);
23
24var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
25
26var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
27
28var _createClass2 = require('babel-runtime/helpers/createClass');
29
30var _createClass3 = _interopRequireDefault(_createClass2);
31
32var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn');
33
34var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
35
36var _inherits2 = require('babel-runtime/helpers/inherits');
37
38var _inherits3 = _interopRequireDefault(_inherits2);
39
40var _regenerator = require('babel-runtime/regenerator');
41
42var _regenerator2 = _interopRequireDefault(_regenerator);
43
44var _promise = require('babel-runtime/core-js/promise');
45
46var _promise2 = _interopRequireDefault(_promise);
47
48var _bluebird = require('bluebird');
49
50var wait = exports.wait = function () {
51 var ref = (0, _bluebird.coroutine)(_regenerator2.default.mark(function _callee(time) {
52 return _regenerator2.default.wrap(function _callee$(_context) {
53 while (1) {
54 switch (_context.prev = _context.next) {
55 case 0:
56 return _context.abrupt('return', new _promise2.default(function (resolve) {
57 return setTimeout(function () {
58 return resolve();
59 }, time);
60 }));
61
62 case 1:
63 case 'end':
64 return _context.stop();
65 }
66 }
67 }, _callee, this);
68 }));
69 return function wait(_x) {
70 return ref.apply(this, arguments);
71 };
72}();
73
74var _events = require('events');
75
76var _events2 = _interopRequireDefault(_events);
77
78var _bodyParser = require('body-parser');
79
80var _bodyParser2 = _interopRequireDefault(_bodyParser);
81
82var _express = require('express');
83
84var _Elements = require('./Elements.js');
85
86var _Elements2 = _interopRequireDefault(_Elements);
87
88var _Buttons = require('./Buttons.js');
89
90var _Buttons2 = _interopRequireDefault(_Buttons);
91
92var _fetch = require('./libs/fetch.js');
93
94var _fetch2 = _interopRequireDefault(_fetch);
95
96var _lodash = require('lodash');
97
98var _lodash2 = _interopRequireDefault(_lodash);
99
100function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
101
102exports.Elements = _Elements2.default;
103exports.Buttons = _Buttons2.default;
104
105
106var userCache = {};
107
108var Bot = function (_EventEmitter) {
109 (0, _inherits3.default)(Bot, _EventEmitter);
110
111 function Bot(token, verification) {
112 var debug = arguments.length <= 2 || arguments[2] === undefined ? false : arguments[2];
113 (0, _classCallCheck3.default)(this, Bot);
114
115 var _this = (0, _possibleConstructorReturn3.default)(this, (0, _getPrototypeOf2.default)(Bot).call(this));
116
117 _this._token = token;
118 _this._debug = debug;
119 _this._verification = verification;
120 return _this;
121 }
122
123 (0, _createClass3.default)(Bot, [{
124 key: 'send',
125 value: function () {
126 var ref = (0, _bluebird.coroutine)(_regenerator2.default.mark(function _callee2(to, message) {
127 var text, err;
128 return _regenerator2.default.wrap(function _callee2$(_context2) {
129 while (1) {
130 switch (_context2.prev = _context2.next) {
131 case 0:
132 if (this._debug) {
133 console.log({ recipient: { id: to }, message: message ? message.toJSON() : message });
134 }
135
136 _context2.prev = 1;
137 _context2.next = 4;
138 return (0, _fetch2.default)('https://graph.facebook.com/v2.6/me/messages', {
139 method: 'post',
140 query: { access_token: this._token },
141 body: { recipient: { id: to }, message: message }
142 });
143
144 case 4:
145 _context2.next = 15;
146 break;
147
148 case 6:
149 _context2.prev = 6;
150 _context2.t0 = _context2['catch'](1);
151
152 if (!_context2.t0.text) {
153 _context2.next = 14;
154 break;
155 }
156
157 text = _context2.t0.text;
158
159 try {
160 err = JSON.parse(_context2.t0.text).error;
161
162 text = (err.type || 'Unknown') + ': ' + (err.message || 'No message');
163 } catch (ee) {
164 // ignore
165 }
166
167 throw Error(text);
168
169 case 14:
170 throw _context2.t0;
171
172 case 15:
173 case 'end':
174 return _context2.stop();
175 }
176 }
177 }, _callee2, this, [[1, 6]]);
178 }));
179
180 function send(_x3, _x4) {
181 return ref.apply(this, arguments);
182 }
183
184 return send;
185 }()
186 }, {
187 key: 'fetchUser',
188 value: function () {
189 var ref = (0, _bluebird.coroutine)(_regenerator2.default.mark(function _callee3(id) {
190 var fields = arguments.length <= 1 || arguments[1] === undefined ? 'first_name,last_name,profile_pic' : arguments[1];
191 var cache = arguments.length <= 2 || arguments[2] === undefined ? false : arguments[2];
192
193 var key, props, _ref, body;
194
195 return _regenerator2.default.wrap(function _callee3$(_context3) {
196 while (1) {
197 switch (_context3.prev = _context3.next) {
198 case 0:
199 key = id + fields;
200 props = void 0;
201
202 if (!(cache && userCache[key])) {
203 _context3.next = 7;
204 break;
205 }
206
207 props = userCache[key];
208 props.fromCache = true;
209 _context3.next = 14;
210 break;
211
212 case 7:
213 _context3.next = 9;
214 return (0, _fetch2.default)('https://graph.facebook.com/v2.6/' + id, {
215 query: { access_token: this._token, fields: fields }, json: true
216 });
217
218 case 9:
219 _ref = _context3.sent;
220 body = _ref.body;
221
222
223 props = body;
224 props.fromCache = false;
225
226 if (cache) {
227 userCache[key] = props;
228 }
229
230 case 14:
231 return _context3.abrupt('return', props);
232
233 case 15:
234 case 'end':
235 return _context3.stop();
236 }
237 }
238 }, _callee3, this);
239 }));
240
241 function fetchUser(_x5, _x6, _x7) {
242 return ref.apply(this, arguments);
243 }
244
245 return fetchUser;
246 }()
247 }, {
248 key: 'handleMessage',
249 value: function () {
250 var ref = (0, _bluebird.coroutine)(_regenerator2.default.mark(function _callee5(input) {
251 var _this2 = this;
252
253 var body, message, postback, attachments, location;
254 return _regenerator2.default.wrap(function _callee5$(_context5) {
255 while (1) {
256 switch (_context5.prev = _context5.next) {
257 case 0:
258 body = JSON.parse((0, _stringify2.default)(input));
259 message = body.entry[0].messaging[0];
260
261 (0, _assign2.default)(message, message.message);
262 delete message.message;
263
264 message.raw = input;
265
266 message.sender.fetch = function () {
267 var ref = (0, _bluebird.coroutine)(_regenerator2.default.mark(function _callee4(fields, cache) {
268 var props;
269 return _regenerator2.default.wrap(function _callee4$(_context4) {
270 while (1) {
271 switch (_context4.prev = _context4.next) {
272 case 0:
273 _context4.next = 2;
274 return _this2.fetchUser(message.sender.id, fields, cache);
275
276 case 2:
277 props = _context4.sent;
278
279 (0, _assign2.default)(message.sender, props);
280 return _context4.abrupt('return', message.sender);
281
282 case 5:
283 case 'end':
284 return _context4.stop();
285 }
286 }
287 }, _callee4, _this2);
288 }));
289 return function (_x11, _x12) {
290 return ref.apply(this, arguments);
291 };
292 }();
293
294 if (!message.postback) {
295 _context5.next = 11;
296 break;
297 }
298
299 postback = {};
300
301
302 try {
303 postback = JSON.parse(message.postback.payload);
304 } catch (e) {
305 // ignore
306 }
307
308 if (postback.hasOwnProperty('data')) {
309 message.postback = postback;
310 message.data = postback.data;
311 message.event = postback.event;
312
313 this.emit('postback', message.event, message, message.data);
314
315 if (postback.hasOwnProperty('event')) {
316 this.emit(message.event, message, message.data);
317 }
318 } else {
319 this.emit('invalid-postback', message, message.postback);
320 }
321
322 return _context5.abrupt('return');
323
324 case 11:
325 if (!message.delivery) {
326 _context5.next = 17;
327 break;
328 }
329
330 (0, _assign2.default)(message, message.delivery);
331 message.delivered = message.delivery.mids;
332
333 delete message.delivery;
334
335 this.emit('delivery', message, message.delivered);
336 return _context5.abrupt('return');
337
338 case 17:
339 if (!message.optin) {
340 _context5.next = 22;
341 break;
342 }
343
344 message.param = message.optin.ref || true;
345 message.optin = message.param;
346 this.emit('optin', message, message.optin);
347 return _context5.abrupt('return');
348
349 case 22:
350 attachments = _lodash2.default.groupBy(message.attachments, 'type');
351
352
353 if (attachments.image) {
354 message.images = attachments.image.map(function (a) {
355 return a.payload.url;
356 });
357 }
358
359 if (attachments.video) {
360 message.videos = attachments.video.map(function (a) {
361 return a.payload.url;
362 });
363 }
364
365 if (attachments.audio) {
366 message.audio = attachments.audio.map(function (a) {
367 return a.payload.url;
368 })[0];
369 }
370
371 if (attachments.location) {
372 location = attachments.location[0];
373
374 message.location = (0, _extends3.default)({}, location, location.payload.coordinates);
375 delete message.location.payload;
376 }
377
378 message.object = body.object;
379
380 delete message.attachments;
381
382 this.emit('message', message);
383
384 case 30:
385 case 'end':
386 return _context5.stop();
387 }
388 }
389 }, _callee5, this);
390 }));
391
392 function handleMessage(_x10) {
393 return ref.apply(this, arguments);
394 }
395
396 return handleMessage;
397 }()
398 }, {
399 key: 'router',
400 value: function router() {
401 var _this3 = this;
402
403 var router = new _express.Router();
404
405 router.use(_bodyParser2.default.json());
406
407 router.get('/', function (req, res) {
408 if (req.query['hub.verify_token'] === _this3._verification) {
409 res.send(req.query['hub.challenge']);
410 } else {
411 res.send('Error, wrong validation token');
412 }
413 });
414
415 router.post('/', function (req, res) {
416 _this3.handleMessage(req.body);
417 res.send().status(200);
418 });
419
420 return router;
421 }
422 }]);
423 return Bot;
424}(_events2.default);
425
426Bot.Buttons = _Buttons2.default;
427Bot.Elements = _Elements2.default;
428Bot.wait = wait;
429exports.Bot = Bot;
430exports.default = Bot;
431//# sourceMappingURL=Bot.js.map