Hubotで作成したbotに空リプ(@付きの名前だけの投稿、いわゆる空文字・空行に当たるのかな?)に反応させる方法を調べたので備忘録として書いておきます。
結論
-
robot.respond //, (res) ->
でbotに対してrespondされたメッセージ全てを判定 -
if ///^#{botName}$///.test(res.message.text)
で @ + bot名 + : + 半角スペースを判定- つまりこれが空リプ判定
module.exports = (robot) ->
robot.respond //, (res) ->
# いわゆる空リプ対応
# 以下は環境変数からbot名を取得しようとした名残です
# ローカルで試す場合はこっち
#botName = process.env.HUBOT_SLACK_BOTNAME
# 本番
#botName = "@" + process.env.HUBOT_SLACK_BOTNAME + ": "
# mobasol-chanというのがbot名です
botName = "@mobasol-chan:" # 本当は固定値でなく設定値からとりたいがうまくいかないため
if ///^#{botName}$///.test(res.message.text)
if err
res.send err
if data
res.send "空リプ送りましたね?"
以上。
解説
一応解説をしておきます。
robot.respond //, (res) -> について
robot.respond //, (res) ->
botに対する発言を取得できます。
ここで肝なのが正規表現を //
にすることです。
最初は以下のように ^\s*$
として空行判定を入れて試していたのですがうまくいきませんでした。
module.exports = (robot) ->
robot.respond /^\s*$/, (res) ->
res.message.textについて
次に res.message.text
ですがこれは発言内容が入ってきます。
つまり "@mobasol-chan: help" とslackでbotに話しかければ "@mobasol-chan: help" が入り、
"@mobasol-chan: " とbotに話しかければ "@mobasol-chan: " が入ってきます。
補足
ソースコメントに書いたのですが、ローカルで動かす時とSlack上で動かす時とで空リプのメッセージ形式が違うので注意が必要です。
ローカルで動かした場合の空リプは "mobasol-chan" となりSlack上の判定とずれてしまいます。
(Slack上の場合、bot名に @ と : を追加しています)
HUBOT_SLACK_BOTNAME=mobasol-chan bin/hubot
mobasol-chan>
mobasol-chan> mobasol-chan
補足2
yo hubot
コマンドにてhubtoを作成するとbin/hubotに固定のbot名が入るかと思います。
それではbot名の判定が固定値になってしまうので以下のように環境変数から設定するように変えています。
(ただ結局こちらの方法を取っていないのででやらなくてもairReply.coffeeは動く)
diff --git a/bin/hubot b/bin/hubot
index d8e1137..47a7db8 100755
--- a/bin/hubot
+++ b/bin/hubot
@@ -5,4 +5,4 @@ set -e
npm install
export PATH="node_modules/.bin:node_modules/hubot/node_modules/.bin:$PATH"
-exec node_modules/.bin/hubot --name "mobasol-chan" "$@"
+exec node_modules/.bin/hubot --name $HUBOT_SLACK_BOTNAME "$@"
if ///^#{botName}$///.test(res.message.text)について
正規表現を //
にしているのでbotに対する全ての発言をハンドリングしてしまっています。
"@mobasol-chan: " のみ場合を空リプと言えるので 、res.message.text
が "@mobasol-chan: " と一致するかを調べます。
バックスラッシュ三つの構文は【CoffeeScript】正規表現リテラル内で変数を展開するを参考にさせてもらいました。
(文字リテラルの変数展開)
出来ていないこと
本当は正解例にも書いたように HUBOT_SLACK_BOTNAME
からbot名を取得したかったのですが、Slackで動かすとHUBOT_SLACK_BOTNAMEがundefinedになってしまったので断念(原因は調査してないです)