chatbot-constructor
Version:
A chatbot constructor/builder that can help you develop chatbots in no time either using javascript and nodejs or without programming using excel sheet or JSON format. And it can also easily integrate with AI services like LUIS, Watson, Lex, Octane.AI, Wi
194 lines (156 loc) • 6.2 kB
JavaScript
var Botkit = require(__dirname + '/CoreBot.js');
var builder = require('botbuilder');
var express = require('express');
var bodyParser = require('body-parser');
function BotFrameworkBot(configuration) {
// Create a core botkit bot
var bf_botkit = Botkit(configuration || {});
// customize the bot definition, which will be used when new connections
// spawn!
bf_botkit.defineBot(function(botkit, config) {
var bot = {
botkit: botkit,
config: config || {},
utterances: botkit.utterances,
};
bot.startConversation = function(message, cb) {
botkit.startConversation(this, message, cb);
};
bot.send = function(message, cb) {
function done(err) {
if (cb) {
cb(err);
}
}
if (!message || !message.address) {
if (cb) {
cb(new Error('Outgoing message requires a valid address...'));
}
return;
}
// Copy message minus user & channel fields
var bf_message = {};
for (var key in message) {
switch (key) {
case 'user':
case 'channel':
// ignore
break;
default:
bf_message[key] = message[key];
break;
}
}
if (!bf_message.type) {
bf_message.type = 'message';
}
// Ensure the message address has a valid conversation id.
if (!bf_message.address.conversation) {
bot.connector.startConversation(bf_message.address, function(err, adr) {
if (!err) {
// Send message through connector
bf_message.address = adr;
bot.connector.send([bf_message], done);
} else {
done(err);
}
});
} else {
// Send message through connector
bot.connector.send([bf_message], done);
}
};
bot.reply = function(src, resp, cb) {
var msg = {};
if (typeof(resp) == 'string') {
msg.text = resp;
} else {
msg = resp;
}
msg.user = src.user;
msg.channel = src.channel;
msg.address = src.address;
bot.say(msg, cb);
};
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++) {
if (
botkit.tasks[t].convos[c].isActive() &&
botkit.tasks[t].convos[c].source_message.user == message.user &&
botkit.tasks[t].convos[c].source_message.channel == message.channel
) {
botkit.debug('FOUND EXISTING CONVO!');
cb(botkit.tasks[t].convos[c]);
return;
}
}
}
cb();
};
// Create connector
bot.connector = new builder.ChatConnector(config);
return bot;
});
// set up a web route for receiving outgoing webhooks and/or slash commands
bf_botkit.createWebhookEndpoints = function(webserver, bot, cb) {
// Listen for incoming events
bf_botkit.log(
'** Serving webhook endpoints for the Microsoft Bot Framework at: ' +
'http://' + bf_botkit.config.hostname + ':' +
bf_botkit.config.port + '/botframework/receive');
webserver.post('/botframework/receive', bot.connector.listen());
// Receive events from chat connector
bot.connector.onEvent(function(events, done) {
for (var i = 0; i < events.length; i++) {
// Break out user & channel fields from event
// - These fields are used as keys for tracking conversations and storage.
// - Prefixing with channelId to ensure that users & channels for different
// platforms are unique.
var bf_event = events[i];
var prefix = bf_event.address.channelId + ':';
bf_event.user = prefix + bf_event.address.user.id;
bf_event.channel = prefix + bf_event.address.conversation.id;
// Dispatch event
if (bf_event.type === 'message') {
bf_botkit.receiveMessage(bot, bf_event);
} else {
bf_botkit.trigger(bf_event.type, [bot, bf_event]);
}
}
if (done) {
done(null);
}
});
if (cb) {
cb();
}
bf_botkit.startTicking();
return bf_botkit;
};
bf_botkit.setupWebserver = function(port, cb) {
if (!port) {
throw new Error('Cannot start webserver without a port');
}
if (isNaN(port)) {
throw new Error('Specified port is not a valid number');
}
bf_botkit.config.port = port;
bf_botkit.webserver = express();
bf_botkit.webserver.use(bodyParser.json());
bf_botkit.webserver.use(bodyParser.urlencoded({ extended: true }));
bf_botkit.webserver.use(express.static(__dirname + '/public'));
var server = bf_botkit.webserver.listen(
bf_botkit.config.port,
bf_botkit.config.hostname,
function() {
bf_botkit.log('** Starting webserver on port ' +
bf_botkit.config.port);
if (cb) { cb(null, bf_botkit.webserver); }
});
return bf_botkit;
};
return bf_botkit;
};
module.exports = BotFrameworkBot;