Slack + Hubot으로 bot에 빈 립에 반응하는 방법

Hubot에서 작성한 bot에 하늘 립(@ 첨부의 이름만의 투고, 이른바 공문자·공행에 해당하는 것일까?)에 반응시키는 방법을 조사했으므로 비망록으로서 써 둡니다.

결론


  • robot.respond //, (res) ->에서 bot에 대해 응답 된 모든 메시지를 결정합니다
  • 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에 대한 발언을 얻을 수 있습니다.

    아래와 같은 ↓




    여기서 간인 것이 정규 표현을 // 로 하는 것입니다.
    처음에는 다음과 같이 ^\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

    좋은 웹페이지 즐겨찾기