mangrove-botkit
Version:
Building blocks for Building Bots
184 lines (124 loc) • 4.79 kB
JavaScript
var path = require('path');
var os = require('os');
var Botkit = require('./CoreBot');
var express = require('express');
var bodyParser = require('body-parser');
var twilio = require('twilio');
function TwilioSMS(configuration) {
var twilioSMS = Botkit(configuration || {});
if (!configuration) {
throw Error('Specify your \'account_sid\', \'auth_token\', and ' +
'\'twilio_number\' as properties of the \'configuration\' object');
}
if (configuration && !configuration.account_sid) {
throw Error('Specify an \'account_sid\' in your configuration object');
}
if (configuration && !configuration.auth_token) {
throw Error('Specify an \'auth_token\'');
}
if (configuration && !configuration.twilio_number) {
throw Error('Specify a \'twilio_number\'');
}
twilioSMS.defineBot(function(botkit, config) {
var bot = {
type: 'twiliosms',
botkit: botkit,
config: config || {},
utterances: botkit.utterances
};
bot.startConversation = function(message, cb) {
botkit.startConversation(bot, message, cb);
};
bot.createConversation = function(message, cb) {
botkit.createConversation(bot, message, cb);
};
bot.send = function(sms, cb) {
var client = new twilio.RestClient(
configuration.account_sid,
configuration.auth_token
);
client.messages.create(sms, function(err, message) {
if (err) {
cb(err);
} else {
cb(null, message);
}
});
};
bot.reply = function(src, resp, cb) {
var msg = {};
if (typeof resp === 'string') {
msg.text = resp;
} else {
msg = resp;
}
msg.channel = src.channel;
if (typeof cb === 'function') {
bot.say(msg, cb);
} else {
bot.say(msg, function() {});
}
};
bot.findConversation = function(message, cb) {
botkit.debug('CUSTOM FIND CONVO', message.user, message.channel);
for (var t = 0; t < botkit.tasks.length; t++) {
for (var c = 0; c < botkit.tasks[t].convos.length; c++) {
var convo = botkit.tasks[t].convos[c];
var matchesConvo = (
convo.source_message.channel === message.channel ||
convo.source_message.user === message.user
);
if (convo.isActive() && matchesConvo) {
botkit.debug('FOUND EXISTING CONVO!');
cb(botkit.tasks[t].convos[c]);
return;
}
}
}
cb();
};
return bot;
});
twilioSMS.handleWebhookPayload = function(req, res, bot) {
twilioSMS.log('=> Got a message hook');
var payload = req.body;
twilioSMS.ingest(bot, payload, res);
};
twilioSMS.middleware.normalize.use(function(bot, message, next) {
message.text = message.Body;
message.user = message.From;
message.channel = message.From;
message.from = message.From;
message.to = message.To;
message.timestamp = Date.now();
message.sid = message.MessageSid;
next();
});
twilioSMS.middleware.format.use(function(bot, message, platform_message, next) {
platform_message.body = message.text;
platform_message.from = configuration.twilio_number;
platform_message.to = message.channel;
if (message.hasOwnProperty('mediaUrl')) {
platform_message.mediaUrl = message.mediaUrl;
}
next();
});
// set up a web route for receiving outgoing webhooks
twilioSMS.createWebhookEndpoints = function(webserver, bot, cb) {
twilioSMS.log('** Serving webhook endpoints for Twilio Programmable SMS' +
' at: ' + os.hostname() + ':' + twilioSMS.config.port + '/sms/receive');
var endpoint = twilioSMS.config.endpoint || '/sms/receive';
webserver.post(endpoint, function(req, res) {
twilioSMS.handleWebhookPayload(req, res, bot);
// Send empty TwiML response to Twilio
var twiml = new twilio.TwimlResponse();
res.type('text/xml');
res.send(twiml.toString());
});
if (cb) cb();
return twilioSMS;
};
twilioSMS.startTicking();
return twilioSMS;
}
module.exports = TwilioSMS;