LoginSignup
2

More than 5 years have passed since last update.

Slack + Hubotでbotへの空リプに反応させる方法

Last updated at Posted at 2016-06-05

Hubotで作成したbotに空リプ(@付きの名前だけの投稿、いわゆる空文字・空行に当たるのかな?)に反応させる方法を調べたので備忘録として書いておきます。

結論

  • robot.respond //, (res) -> でbotに対してrespondされたメッセージ全てを判定
  • if ///^#{botName}$///.test(res.message.text)@ + bot名 + : + 半角スペースを判定
    • つまりこれが空リプ判定
airReply.coffee
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に対する発言を取得できます。

下記みたいの↓
スクリーンショット 2016-06-05 10.00.36.png

スクリーンショット 2016-06-05 10.04.09.png

ここで肝なのが正規表現を // にすることです。
最初は以下のように ^\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になってしまったので断念(原因は調査してないです)

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
2