Help us understand the problem. What is going on with this article?

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

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

khsk
週一ぐらいでなにか書いていました。 いろいろお休み中。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした