Edited at

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

More than 1 year has passed since last update.


概要

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を直接操作する方法も出来そうだが、用意されたメソッドを使ってみました。