recime-bot-runtime
Version:
This runtime is intended to run inside a micro-service container with platform specific integration and module interpreter.
223 lines (222 loc) • 8.33 kB
JavaScript
;
var __extends = (this && this.__extends) || (function () {
var extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
return function (d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
var request = require("request");
var channel_1 = require("./channel");
var logger_1 = require("./logger");
var MaxDuration = 20;
var Facebook = /** @class */ (function (_super) {
__extends(Facebook, _super);
function Facebook(bot) {
return _super.call(this, { bot: bot, log: new logger_1.FacebookLogger(bot) }) || this;
}
Facebook.prototype.sendSenderAction = function (sender, name) {
var _this = this;
return new Promise(function (resolve) {
var options = {
uri: 'https://graph.facebook.com/v2.11/me/messages',
qs: {
access_token: process.env.RECIME_FACEBOOK_ACCESS_TOKEN || _this.context.bot.config.RECIME_FACEBOOK_ACCESS_TOKEN
},
method: 'POST',
json: {
messaging_type: "RESPONSE",
recipient: {
id: sender
},
"sender_action": name
}
};
request(options, function (err, response, body) {
resolve();
});
});
};
Facebook.prototype.execute = function (body, parameters, handler) {
var _this = this;
return new Promise(function (resolve, reject) {
_this.context.log.incoming(body);
body.entry.forEach(function (pageEntry) {
var params = {
pageEntry: pageEntry,
parameters: parameters,
handler: handler
};
_this.process(params).then(function (data) {
resolve(data);
}, function (err) {
reject(err);
});
});
});
};
Facebook.prototype.handleRequest = function (ev, parameters, cb) {
var _this = this;
var senderID = ev.sender.id;
return new Promise(function (resolve, reject) {
var send = function (data) {
var options = {
sender: senderID,
data: data
};
_this.sendMessage(options).then(function () {
resolve(data);
}, function (err) {
reject(err);
});
};
cb(_this.context.bot, ev, 'facebook', function (data) {
send(data);
}, function (err) {
console.error(err);
resolve();
});
});
};
Facebook.prototype.sendMessage = function (body) {
var _this = this;
return new Promise(function (resolve, reject) {
if (Array.isArray(body.data)) {
var response = body.data.map(function (message) { return function () {
return _this.sendEachMessage({
sender: body.sender,
payload: message
});
}; });
return response
.reduce(function (a, b) {
return a.then(function () {
return b();
});
}, Promise.resolve())
.then(function () {
resolve();
});
}
else {
_this.sendEachMessage({
sender: body.sender,
payload: body.data
}).then(function () {
resolve();
}, function (err) {
console.error(err);
resolve();
});
}
});
};
Facebook.prototype.sendEachMessage = function (body) {
var _this = this;
return new Promise(function (resolve) {
var payload = body.payload;
var isTyping = function (payload) {
return payload && payload.type === 'typing';
};
var options = {
uri: 'https://graph.facebook.com/v2.11/me/messages',
qs: {
access_token: process.env.RECIME_FACEBOOK_ACCESS_TOKEN || _this.context.bot.config.RECIME_FACEBOOK_ACCESS_TOKEN
},
method: 'POST',
json: {
messaging_type: body.tag ? 'MESSAGE_TAG' : 'RESPONSE',
recipient: {
id: body.sender
},
tag: body.tag
}
};
// typing_on
if (isTyping(payload)) {
options.json['sender_action'] = 'typing_on';
}
else {
options.json['message'] = payload;
}
request(options, function (err, response, result) {
if (!err && response.statusCode === 200) {
if (isTyping(payload)) {
var duration = parseInt(payload.duration);
setTimeout(function () {
_this.sendSenderAction(body.sender, 'typing_off').then(resolve);
}, (duration === MaxDuration ? duration - 1 : duration) * 1000);
}
else {
_this.context.log.outgoing(options, response.body);
resolve();
}
}
else {
console.error({
fb: JSON.stringify(result.error),
message: response.statusMessage,
code: response.statusCode
});
resolve();
}
});
});
};
Facebook.prototype.process = function (options) {
var _this = this;
return new Promise(function (resolve, reject) {
var pageEntry = options.pageEntry;
var pageID = pageEntry.id;
var parameters = options.parameters;
console.log('page entry:', pageEntry);
pageEntry.messaging.forEach(function (ev) {
if (ev.message && !ev.message.is_echo) {
_this.handleRequest(ev, parameters, options.handler)
.then(resolve)
.catch(reject);
}
else if (ev.postback) {
_this.handleRequest(ev, parameters, options.handler)
.then(resolve)
.catch(reject);
}
else if (ev.referral) {
var ref = ev.referral.ref;
if (ref && Object.keys(ref || {}).length > 0) {
_this.handleRequest(ev, parameters, options.handler)
.then(resolve)
.catch(reject);
}
else {
resolve();
}
}
else if (ev.read) {
_this.sendSenderAction(ev.sender.id, 'mark_seen').then(resolve);
}
else {
resolve();
}
});
});
};
Facebook.prototype.verifyToken = function (query) {
var _this = this;
return new Promise(function (resolve, reject) {
var token = query['hub.verify_token'];
if (_this.context.bot.id === token) {
resolve(query["hub.challenge"]);
}
else {
reject(403);
}
});
};
return Facebook;
}(channel_1.Channel));
exports.Facebook = Facebook;