BotKitで作る
イベント駆動Bot
@hico_horiuchi
自己紹介
堀内 晨彦 (Akihiko Horiuchi)
Emacs, Ruby, Golang
Hubot, 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
これまで作ったBot
hico-horiuchi/huboco
あなたの研究生活をサポートするHubot
Hubotでボット開発はじめてみた
hico-horiuchi/kaobashi
工学部祭実行委員会をサポートするHubot
HubotでSlackのChannelとTrelloのBoardを連携
hico-horiuchi/emojiner
I am a slack custom emoji craftsman.
新しく追加されたEmojiを教えてくれるボットを作った
4
Botkitとは?
-
Botkitの紹介
howdyai/botkit
2015年12月に発表された Botフレームワーク
スタートアップのHowdy社が開発
Slack、Messanger、Twilioなどに対応
Botkit will also provide a simplified way for new
developers to get into programming for Slack by
building off the impressive collection of tools
available in it.
— The Slack Platform launch
“
“
6
HubotとBotkitの比較
hello、hiに挨拶を返すサンプル
# Hubot
robot.respond /hello|hi/i, (message) ->
message.reply 'Hello.'
// Botkit
controller.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とは?
-
これまでのBot
ユーザーの発言に反応してアクションする
「プルリクが出たよ〜」
「テスト通ったよ〜」
「プルリク、マージしとく?」
「LGTMだね、マージよろ〜」
「おけ、ついでにデプロイしとく?」
「いいね、デプロイよろ〜」
「おけ、デプロイしといた!」
みなさんの ChatOps はどんな感じですか?
11
イベント駆動Bot
Slackの 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で簡単に実装できるよ
# Hubot
robot.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
// Botkit
controller.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
イベント駆動どうですか?
ChatOpsの幅が広がると思うので
ぜひ試してみて下さい!
-
ありがとうございました
-

BotKitで作るイベント駆動Bot