初期から提供されていたWebAPIでは「Bot経由の発言を検知して、別のBotを実行」みたいなことができなかったんですが、昨年末に提供開始されたReal Time Messaging APIを使うとそれらも含めて色々出来るようになりました。
これのなにが便利かというと、
1. 開発者がチャンネルで `@hubot app build` とアプリのビルドを実行する
2. アプリBotがビルドを実行後、ビルド完了をチャンネルに通知する
3. Hubotがその通知を受け取り、デプロイBotをチャット経由で実行する
4. デプロイBotがデプロイ完了をチャットに通知する
5. Hubotがその通知を受け取り、 `@channel` を付けてデプロイ完了した旨を通知する
みたいなことができるようになります。
また、副次効果として複数のBot間のパイプラインを構築することでそれぞれのBotが疎結合で役割が明確になり、コードの見通しも良くなります。
で、それを使ってHubot側をどう設定しているかっていうのを紹介するエントリです。
以下の例では 「テストが落ちた通知を受け取ってcommitterにmentionを付けて通知する」 というものを実装します。
前提
- Slack上でHubotを動かしている
- hubot-slackのアダプタを v3.0.0以上 を使用している
- v2→v3のアップグレードはこちらを参考
コード例
module.exports = (robot) ->
robot.adapter.client?.on? 'raw_message', (msg) ->
return if msg.type isnt 'message' || msg.subtype isnt 'bot_message'
return unless msg.attachments
match = msg.attachments[0].fallback.match(/Failed: (.+?)'s build/)
return if match is null
commit_user = match[1]
channel = robot.adapter.client.getChannelByID msg.channel
# プライベートチャンネルは取得出来ないためundefinedが返される
return if channel is undefined
text = "@#{commit_user} テストが落ちたよー!"
robot.send {room: "##{channel.name}"}, text
こんな感じで新規のスクリプトを追加すれば動きます。
通常のOutgoing Webhookの場合は msg.text
、Attachment形式の場合は msg.attachments
内に期待するテキストが入ってくるので、それらを正規表現でマッチさせて判定した後に任意のアクションを実行します。
通知を受け取るチャンネルには事前にhubotをinviteしておく必要があります。
また、Slackの仕様上プライベートグループはチャンネルID→チャンネル名の逆引きができないので、Hubotがプライベートグループ内に居たとしても動かないので注意が必要です。