UNPKG

botkit

Version:

Building blocks for Building Bots

215 lines (164 loc) 6.88 kB
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ______ ______ ______ __ __ __ ______ /\ == \ /\ __ \ /\__ _\ /\ \/ / /\ \ /\__ _\ \ \ __< \ \ \/\ \ \/_/\ \/ \ \ _"-. \ \ \ \/_/\ \/ \ \_____\ \ \_____\ \ \_\ \ \_\ \_\ \ \_\ \ \_\ \/_____/ \/_____/ \/_/ \/_/\/_/ \/_/ \/_/ This is a sample Slack bot built with Botkit and Typescript. # RUN THE BOT: Get a Bot token from Slack: -> http://my.slack.com/services/new/bot Compile typescript to javascript: tsc typescript_bot.ts Run your bot from the command line: token=<MY TOKEN> node typescript_bot.js # USE THE BOT: Find your bot inside Slack 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 is 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 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ declare let process: { env: { token: string; }; exit(status?: number); }; import Botkit = require('../lib/botkit'); if (!process.env.token) { console.log('Error: Specify token in environment'); process.exit(1); } const controller = Botkit.slackbot({ debug: true, }); const bot = controller.spawn({ token: process.env.token }).startRTM(); controller.hears(['hello', 'hi'], 'direct_message,direct_mention,mention', function(bot, message) { bot.api.reactions.add({ timestamp: message.ts, channel: message.channel, name: 'robot_face', }, function(err, res) { if (err) { bot.botkit.log('Failed to add emoji reaction :(', err); } }); controller.storage.users.get(message.user, function(err, user) { if (user && user.name) { bot.reply(message, 'Hello ' + user.name + '!!'); } else { bot.reply(message, 'Hello.'); } }); }); controller.hears(['call me (.*)', 'my name is (.*)'], 'direct_message,direct_mention,mention', function(bot, message) { var name = message.match[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'], 'direct_message,direct_mention,mention', 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.startConversation(message, function(err, convo) { if (!err) { convo.say('I do not know your name yet!'); convo.ask('What should I call you?', function(response, convo) { convo.ask('You want me to call you `' + response.text + '`?', [ { pattern: 'yes', callback: function(response, convo) { // since no further messages are queued after this, // the conversation will end naturally with status == 'completed' convo.next(); } }, { pattern: 'no', callback: function(response, convo) { // stop the conversation. this will cause it to end with status == 'stopped' convo.stop(); } }, { default: true, callback: function(response, convo) { convo.repeat(); convo.next(); } } ]); convo.next(); }, {'key': 'nickname'}); // store the results in a field called nickname convo.on('end', function(convo) { if (convo.status == 'completed') { bot.reply(message, 'OK! I will update my dossier...'); controller.storage.users.get(message.user, function(err, user) { if (!user) { user = { id: message.user, }; } user.name = convo.extractResponse('nickname'); controller.storage.users.save(user, function(err, id) { bot.reply(message, 'Got it. I will call you ' + user.name + ' from now on.'); }); }); } else { // this happens if the conversation ended prematurely for some reason bot.reply(message, 'OK, nevermind!'); } }); } }); } }); }); controller.hears(['shutdown'], 'direct_message,direct_mention,mention', 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(); } } ]); }); });