UNPKG

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
"use strict"; 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;