5
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

updated at

SlackでHubotを使い回し別人(BOT)として発言する

概要

Slackの各種APIによる発言時には、usernameemojiを指定することで好きな名前やアイコンで発言することが出来ます。

HubotのSlack連携にもデフォルトのHubot設定を上書きして発言するメソッドがあります。
それを使えば一つのHubot連携でいろんなキャラが発言を拾い、返答している風を装えます。
複数のHubotを立てて管理するのも大変なので、
一つのHubotで機能ごとにキャラ分けしたりしています。

今現在どんな風にしてるのかをメモ的に残す。

追記
この記事はslackhq/hubot-slackのv3時代をもとに記述しています

ファイルの置き場所

どこでもいいのですが、
hubot\scripts\*.coffee
に書くと自動的に読み込んでくれるので、機能やキャラごとに分けたりしてます。

キャラの関数化

カスタムメッセージは
robot.adapter.customMessage {}
の形式で送ります。
アイコンは事前に絵文字登録しておきます(icon_urlで画像URLでもOKだったはずですが)

module.exports = (robot) ->
    robot.hear /ほげほげ/i, (msg) ->
        robot.adapter.customMessage {username:'キャラクター', icon_emoji:':character:', text:'メッセージ', message:msg}

msgオブジェクトは発言先の部屋などに使います。

毎回オブジェクトを書くのは苦痛なので、text以外を固定にする関数を作ると体感楽に。


character = (msg, text) ->
    {username:'キャラクター', icon_emoji:':character:', text:text, message:msg}

module.exports = (robot) ->
    robot.hear /ほげほげ/i, (msg) ->
        robot.adapter.customMessage character(msg, 'メッセージ')

character()内で発言するのは副作用っぽいのでやめました。
robot.adapter.customMessageが長いのがネック。

robot.adapter.customMessageのデメリット

shellでのデバッグができません。(ちゃんとアダプターなどを指定しないデフォルト実行の場合)
Slack用設定はHerokuの方にしか設定していないため、手元ではshellでの動作になっています。
毎回アダプターエラーが出ますがshellで動きます。
なのでrobot.adapter.customMessageが無い状態です。
正規表現にマッチしてrobot.adapter.customMessageに到達するとエラー。
到達しなければ普通のsendなどの部分は引き続きshellでも動作を見れます。

robot.respond風味に


character = (msg, text) ->
    {username:'キャラクター', icon_emoji:':character:', text:text, message:msg}

module.exports = (robot) ->
    robot.hear /^\s*@?character\s*ほげほげ/i, (msg) ->
        robot.adapter.customMessage character(msg, 'メッセージ')

@characterはユーザーとして存在しないので、robot.hearしか使えないのですが、正規表現につけることであたかもメンションに応える感じにします。
当然Slackのオートコンプリートには現れません。

関連

cronで発言するときは

cronモジュールを使う場合はmsgオブジェクトがありません。
msgはどのチャンネルで発言するかに使用していたので、
ソースコードを見ながらオブジェクトを模倣します。

余談ですが、msg.random []で使えた配列からランダムに取得する関数は
random = require('hubot').Response::random
msgがなくても使えます。

cron   = require('cron').CronJob

character = (msg, text) ->
    {username:'キャラクター', icon_emoji:':character:', text:text, message:msg}

module.exports = (robot) ->
    new cron('0 30 9 * * 1-5'
        , () ->
            robot.adapter.customMessage character({room: 'random'}, 'メッセージ')
        , null
        , true
    )

こんなものを読むよりコードを読もう

hubot-slack/slack.coffee at v3.4.1 · slackhq/hubot-slack


robotmsgを直接操作する方法も出来そうだが、用意されたメソッドを使ってみました。

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
5
Help us understand the problem. What are the problem?