25
26

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-12-17

この記事は 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で「どのコマンドにも一致しない」処理の書き方でした.
今回は雑談をさせていますが,他にも色々出来るんじゃないかなと思います.

25
26
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
25
26

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?