Hubot で robot.brain
を使ったデータの永続化を試してみようと思って簡単なスクリプトを書いてみた.今まで「ステートレス」だった Hubot との会話を「ステートフル」にすることができて,上手く活用できれば ChatOps の幅が広がるなーと感じた.
go_to_lunch.coffee
サンプルで go_to_lunch.coffee
を書いてみた.
- hubot go to lunch join : ランチに参加する
- hubot go to lunch list : 参加者一覧を表示する
- hubot go to lunch clear : 参加者一覧をクリアする
機能はシンプルで,ランチに行くメンバーを募るスクリプトになっている.この参加者一覧を robot.brain
に保持している.
# Description: # Go to lunch! # # Commands: # hubot go to lunch list - List members # hubot go to lunch join :name - Join lunch # hubot go to lunch clear - Clear lunch event # # Author: # kakakakakku <https://github.com/kakakakakku> module.exports = (robot) -> key = 'lunch' robot.respond /go to lunch list$/, (msg) -> members = getMembers() if members.length is 0 msg.send members.toString() return msg.send 'No member exist.' robot.respond /go to lunch join (\S+)$/, (msg) -> member = msg.match[1] members = getMembers() if member in members msg.send 'You are already joined.' return if members.length is 0 tmpMembers = members else tmpMembers = [] tmpMembers.push member robot.brain.set key, tmpMembers msg.send tmpMembers.toString() robot.respond /go to lunch clear$/, (msg) -> robot.brain.set key, [] msg.send 'Lunch is closed.' getMembers = -> robot.brain.get(key) ? []
データを永続化する
robot.brain.set
で Key と Value を指定して永続化する.Value に制限はなく String も Array も扱える.今回は Key を lunch
に Value を参加者名の配列にしている.
robot.brain.set key, value
データを取得する場合は robot.brain.get
に Key を指定する.非常に簡単に使える.
robot.brain.get(key)
雰囲気
全て自作自演なのは気にしないで!w
Redis を確認する Tips
Redis には hubot:storage
という Key で JSON が格納されていて,その中で _private
というオブジェクトに robot.brain
のデータが永続化されている.うまく動かないときなど,困ったら直接 Redis のデータを見てデバッグすると良さそう.
ローカル環境
ローカルの場合は普通に Redis に接続する.
➜ ~ redis-cli get hubot:storage | jq . { (中略) "_private": { "lunch": [ "kakakakakku", "bob", "alice" ] } }
Heroku
Heroku の場合は Redis To Go の URL から接続することができる.例として Redis To Go のドキュメントに書いてあるサンプル URL に接続する場合,以下のようになる.
➜ ~ redis-cli -a 44ec0bc04dd4a5afe77a649acee7a8f3 -h drum.redistogo.com -p 9092 get hubot:storage | jq . { (中略) "_private": { "lunch": [ "kakakakakku", "bob", "alice" ] } }
ドキュメント
公式ドキュメントだと Persistence のセクションに書かれている.
Hubot has an in-memory key-value store exposed as robot.brain that can be used to store and retrieve data by scripts.