この記事は Hubot Advent Calendar 2014 の17日目です.
Hubotで「どのコマンドにも一致しないときは雑談」というのをやりたかったので,実装してみました.
5日目の「Hubotでdocomo「雑談対話」APIを使う - “敬称”をHubotコマンドに | 半月記」をベースにしています.
コマンド一覧を取得
robot.helpCommands()
でコマンドの一覧を取得できます.
ただしCommands:
コメントから生成されてるので,説明なども含まれており,整形する必要があります.
また,全てのscriptでCommands:
を書いておかないと,漏れが発生してしまいます.
cmds = []
for help in robot.helpCommands()
cmd = help.split(' ')[1]
cmds.push cmd if cmds.indexOf(cmd) is -1
これで,cmds
に重複なくコマンドの一覧を格納できます.
Hubocoでcmds
を出力した結果は,こんな感じ.
[ 'anime',
'date',
'hello',
'help',
'member',
'omikuzi',
'semi',
'thesis',
'time',
'version' ]
「どのコマンドにも一致しない」判定
実際にscriptを書く場合は,先程のcmds
を使って以下のように書きます.
robot.respond /(.+)$/i, (msg) ->
cmd = msg.match[1].split(' ')[0]
return unless cmds.indexOf(cmd) is -1
# どのコマンドにも一致しない場合の処理
cmds取得の効率化
cmds
の取得処理をrobot.respond
の下に書くと,チャットする度に実行されてしまいます.
そこで,module.exports
の下に書き,起動時に1回だけ実行するようにします.
ここで注意することは,このscriptを最後に読み込む,ということです.
読み込み途中で実行すると,そこまでのコマンドしか格納されません.
ファイル名をz_hogehoge.coffee
などにして,最後に読み込まれるようにします.
雑談script
「どのコマンドにも一致しない場合は雑談する」scriptです.
docomoの雑談対話APIを使用しています.
参考記事に追加で,place
やnickname
を指定するようにしました.
まとめ
Hubotで「どのコマンドにも一致しない」処理の書き方でした.
今回は雑談をさせていますが,他にも色々出来るんじゃないかなと思います.