UNPKG

7.95 kBJavaScriptView Raw
1"use strict";
2var __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})();
12Object.defineProperty(exports, "__esModule", { value: true });
13var request = require("request");
14var channel_1 = require("./channel");
15var logger_1 = require("./logger");
16var MaxDuration = 20;
17var Facebook = /** @class */ (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 // typing_on
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));
210exports.Facebook = Facebook;