diff --git a/lib/alexa/platform.js b/lib/alexa/platform.js new file mode 100644 index 0000000..0b3c7c9 --- /dev/null +++ b/lib/alexa/platform.js @@ -0,0 +1,32 @@ +'use strict'; + +const setup = require('./setup'); +const reply = require('./reply'); +const parse = require('./parse'); +const AlexaTemplate = require('alexa-message-builder'); + +class AlexaPlatform { + constructor(options) { + this.options = options || {}; + this.export = { + AlexaTemplate: AlexaTemplate + }; + } + + setup(api, bot, logError, optionalParser, optionalResponder) { + const setupFunction = setup.bind(this); + return setupFunction(api, bot, logError, optionalParser, optionalResponder); + } + + reply(botResponse, botName) { + const replyFunction = reply.bind(this); + return replyFunction(botResponse, botName).bind(this); + } + + parse(messageObject) { + const parseFunction = parse.bind(this); + return parseFunction(messageObject).bind(this); + } +} + +module.exports = AlexaPlatform; diff --git a/lib/bot-builder.js b/lib/bot-builder.js index 97a44c4..4adf1fc 100644 --- a/lib/bot-builder.js +++ b/lib/bot-builder.js @@ -1,28 +1,47 @@ 'use strict'; const ApiBuilder = require('claudia-api-builder'); -const fbSetup = require('./facebook/setup'); -const slackSetup = require('./slack/setup'); -const telegramSetup = require('./telegram/setup'); -const skypeSetup = require('./skype/setup'); -const twilioSetup = require('./twilio/setup'); -const kikSetup = require('./kik/setup'); -const groupmeSetup = require('./groupme/setup'); -const lineSetup = require('./line/setup'); -const viberSetup = require('./viber/setup'); -const alexaSetup = require('./alexa/setup'); -const fbTemplate = require('./facebook/format-message'); -const slackTemplate = require('./slack/format-message'); -const telegramTemplate = require('./telegram/format-message'); -const viberTemplate = require('./viber/format-message'); -const skypeTemplate = require('./skype/format-message'); -const AlexaTemplate = require('alexa-message-builder'); -const slackDelayedReply = require('./slack/delayed-reply'); +const AlexaPlatform = require('./alexa/platform'); +const FacebookPlatform = require('./facebook/platform'); +const GroupmePlatform = require('./groupme/platform'); +const KikPlatform = require('./kik/platform'); +const LinePlatform = require('./line/platform'); +const SkypePlatform = require('./skype/platform'); +const SlackPlatform = require('./slack/platform'); +const TelegramPlatform = require('./telegram/platform'); +const TwilioPlatform = require('./twilio/platform'); +const ViberPlatform = require('./viber/platform'); + +const platforms = { + alexa: new AlexaPlatform(), + facebook: new FacebookPlatform(), + groupme: new GroupmePlatform(), + kik: new KikPlatform(), + line: new LinePlatform(), + skype: new SkypePlatform(), + slackSlashCommand: new SlackPlatform(), + telegram: new TelegramPlatform(), + twilio: new TwilioPlatform(), + viber: new ViberPlatform() +}; let logError = function (err) { console.error(err); }; +function enablePlatforms(platformProviders, api, messageHandlerPromise, logError) { + platformProviders.forEach(platformProvider => { + let platform = platformProvider; + if (typeof platformProvider === 'string') { + platform = platforms[platformProvider]; + } + platform.setup(api, messageHandlerPromise, logError); + Object.keys(platform.export).forEach(exportItem => { + module.exports[exportItem] = platform.export[exportItem]; + }); + }); +} + module.exports = function botBuilder(messageHandler, options, optionalLogError) { logError = optionalLogError || logError; @@ -33,48 +52,22 @@ module.exports = function botBuilder(messageHandler, options, optionalLogError) api.get('/', () => 'Ok'); - let isEnabled = function isEnabled(platform) { - return !options || !options.platforms || options.platforms.indexOf(platform) > -1; - }; - - if (isEnabled('facebook')) { - fbSetup(api, messageHandlerPromise, logError); - } - if (isEnabled('slackSlashCommand')) { - slackSetup(api, messageHandlerPromise, logError); - } - if (isEnabled('telegram')) { - telegramSetup(api, messageHandlerPromise, logError); - } - if (isEnabled('skype')) { - skypeSetup(api, messageHandlerPromise, logError); - } - if (isEnabled('twilio')) { - twilioSetup(api, messageHandlerPromise, logError); - } - if (isEnabled('kik')) { - kikSetup(api, messageHandlerPromise, logError); - } - if (isEnabled('groupme')) { - groupmeSetup(api, messageHandlerPromise, logError); - } - if (isEnabled('line')) { - lineSetup(api, messageHandlerPromise, logError); - } - if (isEnabled('viber')) { - viberSetup(api, messageHandlerPromise, logError); - } - if (isEnabled('alexa')) { - alexaSetup(api, messageHandlerPromise, logError); + if (options && Array.isArray(options.platforms)) { + enablePlatforms(options.platforms, api, messageHandlerPromise, logError); + } else { + enablePlatforms(Object.keys(platforms), api, messageHandlerPromise, logError); } return api; }; -module.exports.fbTemplate = fbTemplate; -module.exports.slackTemplate = slackTemplate; -module.exports.telegramTemplate = telegramTemplate; -module.exports.viberTemplate = viberTemplate; -module.exports.skypeTemplate = skypeTemplate; -module.exports.AlexaTemplate = AlexaTemplate; -module.exports.slackDelayedReply = slackDelayedReply; +module.exports.AlexaPlatform = AlexaPlatform; +module.exports.FacebookPlatform = FacebookPlatform; +module.exports.GroupmePlatform = GroupmePlatform; +module.exports.KikPlatform = KikPlatform; +module.exports.LinePlatform = LinePlatform; +module.exports.SkypePlatform = SkypePlatform; +module.exports.SlackPlatform = SlackPlatform; +module.exports.TelegramPlatform = TelegramPlatform; +module.exports.TwilioPlatform = TwilioPlatform; +module.exports.ViberPlatform = ViberPlatform; diff --git a/lib/facebook/platform.js b/lib/facebook/platform.js new file mode 100644 index 0000000..5e6813b --- /dev/null +++ b/lib/facebook/platform.js @@ -0,0 +1,44 @@ +'use strict'; + +const setup = require('./setup'); +const reply = require('./reply'); +const parse = require('./parse'); +const template = require('./format-message'); + +class FacebookPlatform { + constructor(options) { + this.options = options || {}; + + this.export = { + fbReply: this.reply, + fbTemplate: this.template + }; + } + + setup(api, bot, logError, optionalParser, optionalResponder) { + const setupFunction = setup.bind(this); + return setupFunction(api, bot, logError, optionalParser, optionalResponder); + } + + reply(recipient, message, fbAccessToken) { + const replyFunction = reply.bind(this); + return replyFunction(recipient, message, fbAccessToken); + } + + parse(messageObject) { + const parseFunction = parse.bind(this); + return parseFunction(messageObject); + } + + postDeploy() { + if (typeof this.options.persistentMenu === 'function') { + this.options.persistentMenu(); + } + } + + template() { + return template; + } +} + +module.exports = FacebookPlatform; diff --git a/lib/groupme/platform.js b/lib/groupme/platform.js new file mode 100644 index 0000000..99a916d --- /dev/null +++ b/lib/groupme/platform.js @@ -0,0 +1,32 @@ +'use strict'; + +const setup = require('./setup'); +const reply = require('./reply'); +const parse = require('./parse'); + +class GroupmePlatform { + constructor(options) { + this.options = options || {}; + + this.export = { + groupmeReply: this.reply + }; + } + + setup(api, bot, logError, optionalParser, optionalResponder) { + const setupFunction = setup.bind(this); + return setupFunction(api, bot, logError, optionalParser, optionalResponder); + } + + reply(message, botId) { + const replyFunction = reply.bind(this); + return replyFunction(message, botId); + } + + parse(messageObject) { + const parseFunction = parse.bind(this); + return parseFunction(messageObject); + } +} + +module.exports = GroupmePlatform; diff --git a/lib/kik/platform.js b/lib/kik/platform.js new file mode 100644 index 0000000..7434665 --- /dev/null +++ b/lib/kik/platform.js @@ -0,0 +1,32 @@ +'use strict'; + +const setup = require('./setup'); +const reply = require('./reply'); +const parse = require('./parse'); + +class KikPlatform { + constructor(options) { + this.options = options || {}; + + this.export = { + kikReply: this.reply + }; + } + + setup(api, bot, logError, optionalParser, optionalResponder) { + const setupFunction = setup.bind(this); + return setupFunction(api, bot, logError, optionalParser, optionalResponder); + } + + reply(messageObject, message, username, kikApiKey) { + const replyFunction = reply.bind(this); + return replyFunction(messageObject, message, username, kikApiKey); + } + + parse(messageObject) { + const parseFunction = parse.bind(this); + return parseFunction(messageObject); + } +} + +module.exports = KikPlatform; diff --git a/lib/line/platform.js b/lib/line/platform.js new file mode 100644 index 0000000..439dab2 --- /dev/null +++ b/lib/line/platform.js @@ -0,0 +1,32 @@ +'use strict'; + +const setup = require('./setup'); +const reply = require('./reply'); +const parse = require('./parse'); + +class LinePlatform { + constructor(options) { + this.options = options || {}; + + this.export = { + lineReply: this.reply + }; + } + + setup(api, bot, logError, optionalParser, optionalResponder) { + const setupFunction = setup.bind(this); + return setupFunction(api, bot, logError, optionalParser, optionalResponder); + } + + reply(replyToken, message, lineChannelAccessToken) { + const replyFunction = reply.bind(this); + return replyFunction(replyToken, message, lineChannelAccessToken); + } + + parse(messageObject) { + const parseFunction = parse.bind(this); + return parseFunction(messageObject); + } +} + +module.exports = LinePlatform; diff --git a/lib/skype/platform.js b/lib/skype/platform.js new file mode 100644 index 0000000..cf81ddb --- /dev/null +++ b/lib/skype/platform.js @@ -0,0 +1,38 @@ +'use strict'; + +const setup = require('./setup'); +const reply = require('./reply'); +const parse = require('./parse'); +const template = require('./format-message'); + +class SkypePlatform { + constructor(options) { + this.options = options || {}; + + this.export = { + skypeReply: this.reply, + skypeTemplate: this.template + }; + } + + setup(api, bot, logError, optionalParser, optionalResponder) { + const setupFunction = setup.bind(this); + return setupFunction(api, bot, logError, optionalParser, optionalResponder); + } + + reply(conversationId, message, contextId, authToken) { + const replyFunction = reply.bind(this); + return replyFunction(conversationId, message, contextId, authToken); + } + + parse(messageObject, contextId) { + const parseFunction = parse.bind(this); + return parseFunction(messageObject, contextId); + } + + template() { + return template; + } +} + +module.exports = SkypePlatform; diff --git a/lib/slack/platform.js b/lib/slack/platform.js new file mode 100644 index 0000000..1bd9267 --- /dev/null +++ b/lib/slack/platform.js @@ -0,0 +1,40 @@ +'use strict'; + +const setup = require('./setup'); +const reply = require('./reply'); +const parse = require('./parse'); +const SlackTemplate = require('./format-message'); +const delayedReply = require('./delayed-reply'); + +class SlackPlatform { + constructor(options) { + this.options = options || {}; + + this.export = { + SlackTemplate: SlackTemplate, + delayedReply: this.delayedReply + }; + } + + setup(api, bot, logError, optionalParser, optionalResponder) { + const setupFunction = setup.bind(this); + return setupFunction(api, bot, logError, optionalParser, optionalResponder); + } + + reply(botResponse) { + const replyFunction = reply.bind(this); + return replyFunction(botResponse); + } + + parse(messageObject) { + const parseFunction = parse.bind(this); + return parseFunction(messageObject); + } + + delayedReply(message, response) { + const delayedReplyFunction = delayedReply.bind(this); + return delayedReplyFunction(message, response); + } +} + +module.exports = SlackPlatform; diff --git a/lib/telegram/platform.js b/lib/telegram/platform.js new file mode 100644 index 0000000..1f1841a --- /dev/null +++ b/lib/telegram/platform.js @@ -0,0 +1,38 @@ +'use strict'; + +const setup = require('./setup'); +const reply = require('./reply'); +const parse = require('./parse'); +const template = require('./format-message'); + +class TelegramPlatform { + constructor(options) { + this.options = options || {}; + + this.export = { + telegramReply: this.reply, + telegramTemplate: this.template + }; + } + + setup(api, bot, logError, optionalParser, optionalResponder) { + const setupFunction = setup.bind(this); + return setupFunction(api, bot, logError, optionalParser, optionalResponder); + } + + reply(messageObject, message, tlAccessToken) { + const replyFunction = reply.bind(this); + return replyFunction(messageObject, message, tlAccessToken); + } + + parse(messageObject) { + const parseFunction = parse.bind(this); + return parseFunction(messageObject); + } + + template() { + return template; + } +} + +module.exports = TelegramPlatform; diff --git a/lib/twilio/platform.js b/lib/twilio/platform.js new file mode 100644 index 0000000..5ad3862 --- /dev/null +++ b/lib/twilio/platform.js @@ -0,0 +1,32 @@ +'use strict'; + +const setup = require('./setup'); +const reply = require('./reply'); +const parse = require('./parse'); + +class TwilioPlatform { + constructor(options) { + this.options = options || {}; + + this.export = { + twilioReply: this.reply + }; + } + + setup(api, bot, logError, optionalParser, optionalResponder) { + const setupFunction = setup.bind(this); + return setupFunction(api, bot, logError, optionalParser, optionalResponder); + } + + reply(twilioAccountSid, twilioAuthToken, twilioSendingNumber, toNumber, message) { + const replyFunction = reply.bind(this); + return replyFunction(twilioAccountSid, twilioAuthToken, twilioSendingNumber, toNumber, message); + } + + parse(messageObject) { + const parseFunction = parse.bind(this); + return parseFunction(messageObject); + } +} + +module.exports = TwilioPlatform; diff --git a/lib/viber/platform.js b/lib/viber/platform.js new file mode 100644 index 0000000..cb0c23a --- /dev/null +++ b/lib/viber/platform.js @@ -0,0 +1,37 @@ +'use strict'; + +const setup = require('./setup'); +const reply = require('./reply'); +const parse = require('./parse'); +const template = require('./format-message'); + +class ViberPlatform { + constructor(options) { + this.options = options || {}; + + this.export = { + viberReply: this.reply, + viberTemplate: this.template + }; + } + + setup(api, bot, logError, optionalParser, optionalResponder) { + const setupFunction = setup.bind(this); + return setupFunction(api, bot, logError, optionalParser, optionalResponder); + } + + reply(receiver, authToken, messageObj) { + return reply(receiver, authToken, messageObj); + } + + parse(messageObject) { + const parseFunction = parse.bind(this); + return parseFunction(messageObject); + } + + template() { + return template; + } +} + +module.exports = ViberPlatform;