1 | "use strict";
|
2 | var __extends = (this && this.__extends) || (function () {
|
3 | var extendStatics = Object.setPrototypeOf ||
|
4 | ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
5 | function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
|
6 | return function (d, b) {
|
7 | extendStatics(d, b);
|
8 | function __() { this.constructor = d; }
|
9 | d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
10 | };
|
11 | })();
|
12 | Object.defineProperty(exports, "__esModule", { value: true });
|
13 | var request = require("request");
|
14 | var channel_1 = require("./channel");
|
15 | var logger_1 = require("./logger");
|
16 | var MaxDuration = 20;
|
17 | var Facebook = (function (_super) {
|
18 | __extends(Facebook, _super);
|
19 | function Facebook(bot) {
|
20 | return _super.call(this, { bot: bot, log: new logger_1.FacebookLogger(bot) }) || this;
|
21 | }
|
22 | Facebook.prototype.sendSenderAction = function (sender, name) {
|
23 | var _this = this;
|
24 | return new Promise(function (resolve) {
|
25 | var options = {
|
26 | uri: 'https://graph.facebook.com/v2.11/me/messages',
|
27 | qs: {
|
28 | access_token: process.env.RECIME_FACEBOOK_ACCESS_TOKEN || _this.context.bot.config.RECIME_FACEBOOK_ACCESS_TOKEN
|
29 | },
|
30 | method: 'POST',
|
31 | json: {
|
32 | messaging_type: "RESPONSE",
|
33 | recipient: {
|
34 | id: sender
|
35 | },
|
36 | "sender_action": name
|
37 | }
|
38 | };
|
39 | request(options, function (err, response, body) {
|
40 | resolve();
|
41 | });
|
42 | });
|
43 | };
|
44 | Facebook.prototype.execute = function (body, parameters, handler) {
|
45 | var _this = this;
|
46 | return new Promise(function (resolve, reject) {
|
47 | _this.context.log.incoming(body);
|
48 | body.entry.forEach(function (pageEntry) {
|
49 | var params = {
|
50 | pageEntry: pageEntry,
|
51 | parameters: parameters,
|
52 | handler: handler
|
53 | };
|
54 | _this.process(params).then(function (data) {
|
55 | resolve(data);
|
56 | }, function (err) {
|
57 | reject(err);
|
58 | });
|
59 | });
|
60 | });
|
61 | };
|
62 | Facebook.prototype.handleRequest = function (ev, parameters, cb) {
|
63 | var _this = this;
|
64 | var sender = ev.sender.id;
|
65 | return new Promise(function (resolve, reject) {
|
66 | var send = function (messages) {
|
67 | var body = {
|
68 | sender: sender,
|
69 | messages: messages
|
70 | };
|
71 | _this.send(body).then(function () {
|
72 | resolve(messages);
|
73 | }, function (err) {
|
74 | reject(err);
|
75 | });
|
76 | };
|
77 | cb(_this.context.bot, ev, 'facebook', function (messages) {
|
78 | send(messages);
|
79 | }, function (err) {
|
80 | console.error(err);
|
81 | resolve();
|
82 | });
|
83 | });
|
84 | };
|
85 | Facebook.prototype.send = function (body) {
|
86 | var _this = this;
|
87 | return new Promise(function (resolve, reject) {
|
88 | var response = body.messages.map(function (message) { return function () {
|
89 | return _this.postMessage({
|
90 | sender: body.sender,
|
91 | payload: message,
|
92 | tag: body.tag
|
93 | });
|
94 | }; });
|
95 | return response
|
96 | .reduce(function (a, b) {
|
97 | return a.then(function () {
|
98 | return b();
|
99 | });
|
100 | }, Promise.resolve())
|
101 | .then(function () {
|
102 | resolve();
|
103 | });
|
104 | });
|
105 | };
|
106 | Facebook.prototype.postMessage = function (body) {
|
107 | var _this = this;
|
108 | return new Promise(function (resolve, reject) {
|
109 | var payload = body.payload;
|
110 | var isTyping = function (payload) {
|
111 | return payload && payload.type === 'typing';
|
112 | };
|
113 | var options = {
|
114 | uri: 'https://graph.facebook.com/v2.11/me/messages',
|
115 | qs: {
|
116 | access_token: process.env.RECIME_FACEBOOK_ACCESS_TOKEN || _this.context.bot.config.RECIME_FACEBOOK_ACCESS_TOKEN
|
117 | },
|
118 | method: 'POST',
|
119 | json: {
|
120 | messaging_type: body.tag ? 'MESSAGE_TAG' : 'RESPONSE',
|
121 | recipient: {
|
122 | id: body.sender
|
123 | },
|
124 | tag: body.tag
|
125 | }
|
126 | };
|
127 |
|
128 | if (isTyping(payload)) {
|
129 | options.json['sender_action'] = 'typing_on';
|
130 | }
|
131 | else {
|
132 | options.json['message'] = payload;
|
133 | }
|
134 | request(options, function (err, response, result) {
|
135 | if (!err && response.statusCode === 200) {
|
136 | if (isTyping(payload)) {
|
137 | var duration = parseInt(payload.duration);
|
138 | setTimeout(function () {
|
139 | _this.sendSenderAction(body.sender, 'typing_off').then(resolve);
|
140 | }, (duration === MaxDuration ? duration - 1 : duration) * 1000);
|
141 | }
|
142 | else {
|
143 | _this.context.log.outgoing(options, response.body);
|
144 | resolve();
|
145 | }
|
146 | }
|
147 | else {
|
148 | console.error({
|
149 | fb: JSON.stringify(result.error),
|
150 | message: response.statusMessage,
|
151 | code: response.statusCode
|
152 | });
|
153 | resolve();
|
154 | }
|
155 | });
|
156 | });
|
157 | };
|
158 | Facebook.prototype.process = function (options) {
|
159 | var _this = this;
|
160 | return new Promise(function (resolve, reject) {
|
161 | var pageEntry = options.pageEntry;
|
162 | var pageID = pageEntry.id;
|
163 | var parameters = options.parameters;
|
164 | console.log('page entry:', pageEntry);
|
165 | (pageEntry.messaging || pageEntry.standby).forEach(function (ev) {
|
166 | if (ev.message && !ev.message.is_echo) {
|
167 | _this.handleRequest(ev, parameters, options.handler)
|
168 | .then(resolve)
|
169 | .catch(reject);
|
170 | }
|
171 | else if (ev.postback && ev.postback.payload) {
|
172 | _this.handleRequest(ev, parameters, options.handler)
|
173 | .then(resolve)
|
174 | .catch(reject);
|
175 | }
|
176 | else if (ev.referral) {
|
177 | var ref = ev.referral.ref;
|
178 | if (ref && Object.keys(ref || {}).length > 0) {
|
179 | _this.handleRequest(ev, parameters, options.handler)
|
180 | .then(resolve)
|
181 | .catch(reject);
|
182 | }
|
183 | else {
|
184 | resolve();
|
185 | }
|
186 | }
|
187 | else if (ev.read) {
|
188 | _this.sendSenderAction(ev.sender.id, 'mark_seen').then(resolve);
|
189 | }
|
190 | else {
|
191 | resolve();
|
192 | }
|
193 | });
|
194 | });
|
195 | };
|
196 | Facebook.prototype.verifyToken = function (query) {
|
197 | var _this = this;
|
198 | return new Promise(function (resolve, reject) {
|
199 | var token = query['hub.verify_token'];
|
200 | if (_this.context.bot.id === token) {
|
201 | resolve(query["hub.challenge"]);
|
202 | }
|
203 | else {
|
204 | reject(403);
|
205 | }
|
206 | });
|
207 | };
|
208 | return Facebook;
|
209 | }(channel_1.Channel));
|
210 | exports.Facebook = Facebook;
|