botkitで作るイベント駆動bot
TRANSCRIPT
自己紹介
堀内 晨彦 (Akihiko Horiuchi)
Emacs, Ruby, GolangHubot, Sensu, Ansible, Itamae
@hico_horiuchi http://bit.ly/hiconyan
NTT Comの ベアメタルクラウドチーム でサービス開発やデプロイ自動化などをやってます
2
Hubot×ChatOps勉強会第1回 2014/11/22
場 所:大阪大学 中之島センター
参加者:34人
第2回 2015/08/22
場 所:兵庫勤労市民センター
参加者:6人
第3回 ついに東京で開催できました
3
これまで作ったBothico-horiuchi/huboco
あなたの研究生活をサポートするHubot Hubotでボット開発はじめてみた
hico-horiuchi/kaobashi工学部祭実行委員会をサポートするHubotHubotでSlackのChannelとTrelloのBoardを連携
hico-horiuchi/emojinerI am a slack custom emoji craftsman.新しく追加されたEmojiを教えてくれるボットを作った
4
Botkitの紹介howdyai/botkit
2015年12月に発表された Botフレームワーク スタートアップのHowdy社が開発 Slack、Messanger、Twilioなどに対応
Botkit will also provide a simplified way for newdevelopers to get into programming for Slack bybuilding off the impressive collection of toolsavailable in it.— The Slack Platform launch
“
“
6
HubotとBotkitの比較 hello、hiに挨拶を返すサンプル
# Hubotrobot.respond /hello|hi/i, (message) -> message.reply 'Hello.'
// Botkitcontroller.hears(['hello', 'hi'], ['direct_message', 'direct_mention', 'mention'], function(bot, message) { bot.reply(message, 'Hello.'); });
CoffeeScriptで書けないしコードの量も増えてる気がする…でも、便利な機能がたくさんあるんです
7
対話(Conversation)controller.hears(['pizzatime'], 'message_received', function(bot, message) { var askFlavor = function(err, convo) { convo.ask('What flavor of pizza do you want?', function(response, convo) { convo.say('Awesome.'); askSize(response, convo); convo.next(); } ); }; var askSize = function(response, convo) { convo.ask('What size do you want?', function(response, convo) { convo.say('Ok.') askWhereDeliver(response, convo); convo.next(); } ); }; var askWhereDeliver = function(response, convo) { convo.ask('So where do you want it delivered?', function(response, convo) { convo.say('Ok! Good bye.'); convo.next(); } ); }; bot.startConversation(message, askFlavor);}); 8
Slack Web APIをたたく GJにAdd Reactionするサンプル
controller.hears(['gj', 'GJ'], ['ambient'], function(bot, message) { bot.api.reactions.add({ timestamp: message.ts, channel: message.channel, name: '+1', } });
bot.api で簡単にSlackのAPIをたたける
Using the Slack Web API HubotでSlackのEmoji Reactionを付ける
9
これまでのBotユーザーの発言に反応してアクションする
「プルリクが出たよ〜」「テスト通ったよ〜」「プルリク、マージしとく?」「LGTMだね、マージよろ〜」「おけ、ついでにデプロイしとく?」「いいね、デプロイよろ〜」「おけ、デプロイしといた!」
みなさんの ChatOps はどんな感じですか?
11
イベント駆動BotSlackの API Event に反応してアクションする
API Events | Slack Real Time Messaging API | Slack
イベント 説明channel_created 新しいチャンネルが作られたchannel_joined ユーザーがチャンネルに参加したemoji_changed 新しい絵文字が登録されたfile_created 新しいファイルがアップロードされたpin_added メッセージがピンされたteam_join 新しいユーザーが参加した
12
RTMでEventを受け取る HubotでもBotkitで簡単に実装できるよ
# Hubotrobot.adapter.client?.on? 'raw_message', (message) -> if message.type is 'channel_joined' # message contains data sent by slack # in this case: # https://api.slack.com/events/channel_joined
// Botkitcontroller.on('channel_joined', function(bot, message) { // message contains data sent by slack // in this case: // https://api.slack.com/events/channel_joined});
notify "reaction_added" event for slack.com Slack-Specific Events
13
イベント駆動のサンプル新しいチャンネルが作られたら参加する
(全てのチャンネルにBotが居て欲しいとき)
controller.on('channel_created', function(bot, message) { bot.api.channels.join({ name: message.channel });});
ユーザーがチャンネルに参加したらメッセージを送る(ウェルカムメッセージなどを送りたいとき)
controller.on('channel_joined', function(bot, message) { bot.say('Welcome!');});
14
イベント駆動のサンプル新しい絵文字が登録されたら教えてくれる
(新しい絵文字はどんどん使いたいですよね)
controller.on('emoji_changed', function(bot, message) { if (message.subtype == 'added') { bot.say('New emoji ' + message.names[0] + 'is added!'); }});
新しいユーザーが参加したら案内を出す(アイコンやプロフィールを設定して貰いたいですよね)
controller.on('team_join', function(bot, message) { bot.say(message.user.name + 'Please set your icon and profile.')});
15