読者です 読者をやめる 読者になる 読者になる

Hubot で robot.brain を使ってステートフルに会話する

Hubot

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

f:id:kakku22:20160217202420p:plain

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.

関連記事