2014-10-26

hubotのchatterアダプタを作ってみた。

Web+DB PRESSとか読んでてhubotを使ったChatOps的なところが非常に興味深かったので

chatterで出来ないかなーと思ってadapterを探したものの

用途にマッチしたものが無かったので自分で作ってみました。(npmデビュー作w)

↓↓↓

tzmfreedom/hubot-chatter

hubotとは

hubotとはgithub社が開発したボットのフレームワークで

外部サービス/インターフェースと連携可能なadapterと呼ばれるプラガブルなモジュールと

ボットの動作を規定するスクリプトによって様々なボットを簡単に開発することができます。

 

hubotに関してはこちらが詳しいので、ご参考ください↓

第1回 Hubotとは何か:GitHub社謹製! bot開発・実行フレームワーク「Hubot」|gihyo.jp … 技術評論社

チャットボットでチーム開発効率化入門(1):GitHub製フレームワークHubotの概要とインストール、チャットアプリと連携する基本的な使い方 (12) - @IT

 

で、今回はこのhubotのadapterを作り方とhubot-chatterの使い方を簡単に紹介します。

作り方の参考サイトはこちらが詳しいです↓

hubot adapterの作り方 - おみブロZ

adapterの作成方法

hubotのadapterの作成方法ですが上記リンクの通り

現時点(2014/10/26)では作成方法のドキュメント等がありません。

READMEの記載通り、ソースコードを読んで作っていく必要があります。

 

とはいえ、作り方は超簡単でsrcディレクトリ内にcoffeescriptでアダプタを書いてあげればOKです。

ざっくり書くとこんな感じ↓

{Robot, Adapter, TextMessage, Response} = require 'hubot'

# アダプターを継承
class HogeAdapter extends Adapter
  run: ->
    #ここで外部からデータを受け取ってscriptにデータを渡す。
  send: (envelope, strings...) =>
    #scriptからのレスポンスはここで受け取って、処理を行う。
  reply: (envelope, strings...) ->

exports.use = (robot) ->
  new HogeAdapter robot

hubotを起動すると指定したadapterのrunメソッドが実行されるので、

ここで外部からのデータを受け取ってscriptにデータを渡す処理を行います。

 

具体的には以下のようにMessage型のインスタンスをAdapterのreceiveメソッドに渡せばOK。

message = new TextMessage userId, messageBody, messageId
@receive message

adapterのreceiveメソッドに渡されるとscriptで書いたrobot.hearやrobot.respondが処理を受け取って

正規表現にマッチしたら指定したコールバック関数を実行する、という流れになります。

 

sendとreplyはhubotの実行スクリプトからのレスポンスを受け取ったときの処理になります。

hubot-chatterではここでFeedItemやFeedCommentを投稿しています。

 

ちなみにテストを書くときはhubotのbrain.coffeeでsetIntervalのループが動いている為に

setIntervalを止めるまではテストが終了しない状況になるので

適宜、setIntervalのintervalObjectを明示的に止める必要があります。

clearInterval robot.brain.saveInterval

hubotのテストコードの書き方はこちらを参考にしました→idobata/hubot-idobata

hubot-chatter

インストールはhubotのルートディレクトリでnpm installすればOK

npm install hubot-chatter

 

SOQLポーリングの場合は以下のように環境変数をセットして、アダプターを指定してhubotを起動するだけ。

export HUBOT_SFDC_USERNAME=test@example.com
export HUBOT_SFDC_PASSWORD=hogefuga
bin/hubot -a chatter

 

実際の動作は…

hubot pingと打つと

hubot-chatter-ping

hubot君がPONGと返してくれます。

hubot-chatter-pong

 

あと、FeedItemに対する投稿に対してデフォルトではFeedCommentで返すようにしています。

ユーザのフィードではなくてグループやレコードフィードに対する投稿にも対応してます。

hubot-chatter-group

 

hubot-chatterではSOQLのポーリングかStreamingAPIのどちらかを選択できます。

ChatterのオブジェクトをStreamingAPIで直接扱えないのでStreamingAPIを使う場合は

別途トリガを書く必要がありますが、SOQLのポーリングだとトリガやPushTopicの設定が不要なので

手軽にhubotでchatterを利用することが出来ます。

 

その半面、ポーリングする度にAPI消費するのでAPIコール数の上限を考慮する必要があります。

また、内部で発行しているSOQLの仕様上、NTPで実行サーバの時刻を正確にしておかないと

SOQLでうまく取得できないとかそういう問題もあったり…。

 

ということで、ガッツリ使いたい場合は即時応答でAPIコール数の消費が少ない

StreamingAPIのパターンをオススメします。

 

バグや使い方の質問がありましたらissueとかでご連絡いただけると泣いて喜びます!

npm公開の方法

今回初のnpmパッケージ公開だったので、備忘も兼ねて書いちゃいます。

手順はこんな感じ↓

  1. package.jsonにパッケージ情報を記載

  2. npm publishでパッケージ公開

 

npm publishで初回はユーザ名/パスワードを聞かれて、登録していない場合はプロンプトで登録できちゃいます。

クレデンシャルはディスクにキャッシュされるっぽいので

二回目以降はpackage.jsonのversionを上げてpublishすればOKです。

 

あとは毎日npmのサイトでどれくらいダウンロードされているか見て一喜一憂するだけ!

 

このエントリーをはてなブックマークに追加