Hubot

Hubotで「どのコマンドにも一致しない」ときの処理

More than 3 years have passed since last update.

この記事は 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に重複なくコマンドの一覧を格納できます.

Hubococmdsを出力した結果は,こんな感じ.

[ '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を使用しています.

参考記事に追加で,placenicknameを指定するようにしました.


まとめ

Hubotで「どのコマンドにも一致しない」処理の書き方でした.

今回は雑談をさせていますが,他にも色々出来るんじゃないかなと思います.