概要
Slackの各種APIによる発言時には、username
やemoji
を指定することで好きな名前やアイコンで発言することが出来ます。
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のオートコンプリートには現れません。
関連
-
robot.respondでmsg.matchを使う場合は単一でもキーワードを()で囲まなければならない - Qiita
hear
もrespond
もおなじよどっちもおなじよ
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
robot
やmsg
を直接操作する方法も出来そうだが、用意されたメソッドを使ってみました。