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
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 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;