UNPKG

mangrove-botkit

Version:

Building blocks for Building Bots

213 lines (157 loc) 6.32 kB
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ______ ______ ______ __ __ __ ______ /\ == \ /\ __ \ /\__ _\ /\ \/ / /\ \ /\__ _\ \ \ __< \ \ \/\ \ \/_/\ \/ \ \ _"-. \ \ \ \/_/\ \/ \ \_____\ \ \_____\ \ \_\ \ \_\ \_\ \ \_\ \ \_\ \/_____/ \/_____/ \/_/ \/_/\/_/ \/_/ \/_/ This is a sample Microsoft Bot Framework bot built with Botkit. This bot demonstrates many of the core features of Botkit: * Connect to the Microsoft Bot Framework Service * Receive messages based on "spoken" patterns * Reply to messages * Use the conversation system to ask questions * Use the built in storage system to store and retrieve information for a user. # RUN THE BOT: Follow the instructions in the "Getting Started" section of the readme-botframework.md file to register your bot. Run your bot from the command line: app_id=<MY APP ID> app_password=<MY APP PASSWORD> node botframework_bot.js [--lt [--ltsubdomain LOCALTUNNEL_SUBDOMAIN]] Use the --lt option to make your bot available on the web through localtunnel.me. # USE THE BOT: Find your bot inside Skype to send it a direct message. Say: "Hello" The bot will reply "Hello!" Say: "who are you?" The bot will tell you its name, where it running, and for how long. Say: "Call me <nickname>" Tell the bot your nickname. Now you are friends. Say: "who am I?" The bot will tell you your nickname, if it knows one for you. Say: "shutdown" The bot will ask if you are sure, and then shut itself down. Make sure to invite your bot into other channels using /invite @<my bot>! # EXTEND THE BOT: Botkit has many features for building cool and useful bots! Read all about it here: -> http://howdy.ai/botkit ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ var Botkit = require('../lib/Botkit.js'); var os = require('os'); var commandLineArgs = require('command-line-args'); var localtunnel = require('localtunnel'); const ops = commandLineArgs([ {name: 'lt', alias: 'l', args: 1, description: 'Use localtunnel.me to make your bot available on the web.', type: Boolean, defaultValue: false}, {name: 'ltsubdomain', alias: 's', args: 1, description: 'Custom subdomain for the localtunnel.me URL. This option can only be used together with --lt.', type: String, defaultValue: null}, ]); if(ops.lt === false && ops.ltsubdomain !== null) { console.log("error: --ltsubdomain can only be used together with --lt."); process.exit(); } var controller = Botkit.botframeworkbot({ debug: true }); var bot = controller.spawn({ appId: process.env.app_id, appPassword: process.env.app_password }); controller.setupWebserver(process.env.port || 3000, function(err, webserver) { controller.createWebhookEndpoints(webserver, bot, function() { console.log('ONLINE!'); if(ops.lt) { var tunnel = localtunnel(process.env.port || 3000, {subdomain: ops.ltsubdomain}, function(err, tunnel) { if (err) { console.log(err); process.exit(); } console.log("Your bot is available on the web at the following URL: " + tunnel.url + '/botframework/receive'); }); tunnel.on('close', function() { console.log("Your bot is no longer available on the web at the localtunnnel.me URL."); process.exit(); }); } }); }); controller.hears(['hello', 'hi'], 'message_received', function(bot, message) { controller.storage.users.get(message.user, function(err, user) { if (user && user.name) { bot.reply(message, 'Hello ' + user.name + '!!'); } else { bot.reply(message, 'Hello.', function(err) { console.error(err); }); } }); }); controller.hears(['call me (.*)'], 'message_received', function(bot, message) { var matches = message.text.match(/call me (.*)/i); var name = matches[1]; controller.storage.users.get(message.user, function(err, user) { if (!user) { user = { id: message.user, }; } user.name = name; controller.storage.users.save(user, function(err, id) { bot.reply(message, 'Got it. I will call you ' + user.name + ' from now on.'); }); }); }); controller.hears(['what is my name', 'who am i'], 'message_received', function(bot, message) { controller.storage.users.get(message.user, function(err, user) { if (user && user.name) { bot.reply(message,'Your name is ' + user.name); } else { bot.reply(message,'I don\'t know yet!'); } }); }); controller.hears(['shutdown'],'message_received',function(bot, message) { bot.startConversation(message,function(err, convo) { convo.ask('Are you sure you want me to shutdown?',[ { pattern: bot.utterances.yes, callback: function(response, convo) { convo.say('Bye!'); convo.next(); setTimeout(function() { process.exit(); },3000); } }, { pattern: bot.utterances.no, default: true, callback: function(response, convo) { convo.say('*Phew!*'); convo.next(); } } ]); }); }); controller.hears(['uptime','identify yourself','who are you','what is your name'],'message_received',function(bot, message) { var hostname = os.hostname(); var uptime = formatUptime(process.uptime()); bot.reply(message,'I am a bot! I have been running for ' + uptime + ' on ' + hostname + '.'); }); function formatUptime(uptime) { var unit = 'second'; if (uptime > 60) { uptime = uptime / 60; unit = 'minute'; } if (uptime > 60) { uptime = uptime / 60; unit = 'hour'; } if (uptime != 1) { unit = unit + 's'; } uptime = uptime + ' ' + unit; return uptime; }