diff --git a/examples/typescript_bot.ts b/examples/typescript_bot.ts new file mode 100644 index 000000000..222584935 --- /dev/null +++ b/examples/typescript_bot.ts @@ -0,0 +1,214 @@ +/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ______ ______ ______ __ __ __ ______ + /\ == \ /\ __ \ /\__ _\ /\ \/ / /\ \ /\__ _\ + \ \ __< \ \ \/\ \ \/_/\ \/ \ \ _"-. \ \ \ \/_/\ \/ + \ \_____\ \ \_____\ \ \_\ \ \_\ \_\ \ \_\ \ \_\ + \/_____/ \/_____/ \/_/ \/_/\/_/ \/_/ \/_/ + + +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= 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 " + + 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 @! + +# 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(); + } + } + ]); + }); +});