UNPKG

recime-bot-runtime

Version:

This runtime is intended to run inside a micro-service container with platform specific integration and module interpreter.

202 lines (201 loc) 8.88 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 channel_1 = require("./channel"); var logger_1 = require("./logger"); var request = require("request"); // bot-framework { type: 'conversationUpdate', // id: '8QyCyDKfLGA', // timestamp: '2018-02-24T19:44:52.061453Z', // serviceUrl : body.ser: 'https://webchat.botframework.com/', // channelId: 'webchat', // from: { id: 'a701a0b1b43b4dd180f9568be35d8877' }, // conversation: { id: 'a701a0b1b43b4dd180f9568be35d8877' }, // recipient: // { id: 'CoveredCalifornia@CDjy6ApT8qk', // name: 'CoveredCalifornia' }, // membersAdded: [ { id: 'ARe2TU6wUf5', name: 'You' } ] } var BOT_FRAMEWORK = 'bot-framework'; var FACEBOOK = 'facebook'; var BotFramework = /** @class */ (function (_super) { __extends(BotFramework, _super); function BotFramework(bot) { return _super.call(this, { bot: bot, log: new logger_1.BotFrameworkLogger(bot) }) || this; } BotFramework.prototype.execute = function (body, parameters, handler) { var _this = this; return this.token().then(function (auth) { _this.context.log.incoming(body); return new Promise(function (resolve, reject) { var types = ['conversationUpdate', 'message', 'contactRelationUpdate']; if (types.indexOf(body.type) >= 0) { switch (body.type) { case 'conversationUpdate': { if ((body.membersAdded && body.membersAdded.length > 0)) { if (body.membersAdded.find(function (member) { return member.id !== body.recipient.id; })) { return resolve(); } } break; } case 'contactRelationUpdate': { if (!(body.channelId === 'skype' && body.action === 'add')) { return resolve(); } break; } default: { // todo: } } var supportedChannelData_1 = ['facebook']; var input_1 = (function () { if (supportedChannelData_1.find(function (channel) { return channel === body.channelId; })) { return { channel: body.channelId, data: body.channelData, isNative: false, }; } else { return { channel: BOT_FRAMEWORK, data: body, isNative: true }; } ; })(); handler(_this.context.bot, input_1.data, input_1.channel, function (messages) { messages = messages.length ? messages : [messages]; var response = messages.map(function (message) { return function () { var payload = { id: body.id, serviceUrl: body.serviceUrl, conversation: body.conversation, from: body.recipient, recipient: body.from, message: input_1.isNative ? message : null, channelData: !input_1.isNative ? message : null }; return _this.sendMessage(auth.access_token, payload); }; }); return _this.sendTyping(auth.access_token, { id: body.id, serviceUrl: body.serviceUrl, conversation: body.conversation, from: body.recipient, recipient: body.from }).then(function () { return response .reduce(function (a, b) { return a.then(function () { return b(); }); }, Promise.resolve()) .then(function () { resolve(); }); }); }, function (err) { console.error(err); return reject(err); }); return; } }); }).catch(function (err) { console.error(err); return Promise.reject(err); }); }; BotFramework.prototype.sendTyping = function (accessToken, payload) { var _this = this; return new Promise(function (resolve, reject) { var options = { uri: payload.serviceUrl + "/v3/conversations/" + payload.conversation.id + "/activities/" + payload.id, json: { type: 'typing', from: payload.from, recipient: payload.recipient, }, headers: { authorization: "Bearer " + accessToken }, method: 'POST' }; request(options, function (err, response, body) { _this.context.log.outgoing(options.json, body); if (err) { return reject(err); } resolve(body); }); }); }; BotFramework.prototype.sendMessage = function (accessToken, payload) { var _this = this; return new Promise(function (resolve, reject) { var options = { uri: payload.serviceUrl + "/v3/conversations/" + payload.conversation.id + "/activities/" + payload.id, json: { type: 'message', from: payload.from, recipient: payload.recipient, text: payload.message && payload.message.text, attachmentLayout: payload.message && payload.message.attachmentLayout, attachments: payload.message && payload.message.attachments, channelData: payload.channelData }, headers: { authorization: "Bearer " + accessToken }, method: 'POST' }; request(options, function (err, response, body) { _this.context.log.outgoing(options.json, body); if (err) { return reject(err); } resolve(body); }); }); }; BotFramework.prototype.token = function () { var _this = this; return new Promise(function (resolve, reject) { var options = { uri: 'https://login.microsoftonline.com/botframework.com/oauth2/v2.0/token', formData: { client_id: process.env.RECIME_MICROSOFT_APP_ID || _this.context.bot.config.RECIME_MICROSOFT_APP_ID, client_secret: process.env.RECIME_MICROSOFT_APP_PASSWORD || _this.context.bot.config.RECIME_MICROSOFT_APP_PASSWORD, grant_type: 'client_credentials', scope: 'https://api.botframework.com/.default' }, json: true, method: 'POST' }; request(options, function (err, response, body) { if (err) { return reject(err); } resolve(body); }); }); }; return BotFramework; }(channel_1.Channel)); exports.BotFramework = BotFramework;