Ruby on Railsで作る初めてのHipChatアドオン

この投稿は[Atlassian Advent Calendar 2015](http://qiita.com/advent-calendar/2015/atlassian)の15日目です。

こんにちは、アトラシアンツールでリモートワークしながらRuby on RailsやiOSアプリケーションの開発をしている[エアーズ](http://www.airs.co.jp/)の @mackato です。

ことしの10月にHipChatアプリのアドオン開発を可能にする次世代APIとしてHipChat Connectが発表されました。

参考: [HipChat Connect ベータ版発表 － チャットが生まれ変わる！](http://japan.blogs.atlassian.com/2015/10/announcing-hipchat-connect/)

REST APIやwebhookを使って外部のWebアプリケーションと連携できる他、iframeなどを使ってUIを拡張する仕組みもあり色んなことができそうです。Railsでも開発できそうだったので試しに作ってみました。

作ってみたのはこんなアドオンです。
<img width="988" alt="hiprails.png" src="https://qiita-image-store.s3.amazonaws.com/0/8631/9d88458e-1d84-74d6-d30e-0cb26b2d4c27.png">

ハンズオンの記事を書こうと思ったんですが、長くなってしまいそうなので概要だけ説明します。ソースコードをGitHubに置いておくので良かったら試してみてください。
https://github.com/airs/hiprails

## アドオン（HipRails）の機能

今回作ったのはHipRailsという名前のアドオンです。主に3つの機能があります。

1. <code>/hip</code>というスラッシュコマンドの入力を受け付けます（webhookを使用）。
2. 1のコマンドを受けつける度にユーザーのhip数をカウントアップして通知します（REST APIを使用）。
3. ウィンドウ右側のパネルエリアにルームの総hip数を表示します（HipChat Glancesを使用）。

## アドオンを利用する前に

アドオンを利用するにはいくつか前提条件があります。

まず、HipChat Connectを有効にしないといけません。これにはHipChatの管理者権限が必要です。下記のURLにアクセスしてHipChat Connectが有効になっているか確認してください（YOUR_TEAM_NAMEの部分はお使いの環境にあわせて書き換えてください）。

https://YOUR_TEAM_NAME.hipchat.com/admin/preferences
![enable_hipchat_connect.png](https://qiita-image-store.s3.amazonaws.com/0/8631/fff57b66-5c13-8054-dfdc-2d82a3ea1eea.png)

また、ユーザー環境として、現在HipChat ConnectをサポートしているのはBeta版の4.0とWeb版のHipChatとなっています。MacやWindowsのネイティブアプリで試したい方は下記からダウンロードしてください。
https://airs.hipchat.com/connect/beta

### ngrokのインストール

アドオンはHipChatサーバーからアクセスできないとインストールできないため、開発環境でもLANの外側からアクセスができるようにngrokというツールを使います。ngrokのウェブサイトからダウンロードするか、Macユーザーであればhomebrewでもインストールできます。
https://ngrok.com/

```
brew install ngrok
```

ngrokがインストールできたら早速起動します。今回はRailsアプリケーションをポート3000番で動かすので、ローカルポート:3000を指定して起動します。

```
ngrok 3000
```

起動すると、下記のように表示されるのでForwardingと書かれたURLを控えておきます。
![ngrok.png](https://qiita-image-store.s3.amazonaws.com/0/8631/3b295896-fd7c-d541-4afb-56db33642488.png)

## Railsアプリケーションのセットアップ

アドオン本体はシンプルなRailsアプリケーションです。下記の手順でセットアップしてください。

```
git clone git@github.com:airs/hiprails.git
cd hiprails
bundle install --path vendor/bundle
bundle exec rake db:create
bundle exec rake db:migrate
bundle exec rails s
```

先ほど控えておいた ngrok のURLにアクセスしてエラーなく画面が表示されればセットアップは完了です。

## アドオンのインストール

HipChatのWeb管理画面からアドオンをインストールします。global（全てのRoom）か特定のRoomを指定してインストールすることができます。お試し用のRoomを作っておくのがオススメです。

HipChatの各ルームの画面右下にある [Configure Integrations]のリンクからインストール画面を表示することができます。インストール画面が表示されたら画面左下の [Install an integration from a descriptor URL] のリンクをクリックします。

![integrations.png](https://qiita-image-store.s3.amazonaws.com/0/8631/1515e742-e708-ff67-c487-c360a7dc972a.png)

Install private integrationと書かれたダイアログが表示されるので、Integration URLに先ほど控えておいた ngrok のURLを入力して [Install] 。

![install_integration.png](https://qiita-image-store.s3.amazonaws.com/0/8631/e6efe7c4-34c3-66b5-760d-f0d39c98699b.png)

次の画面でRoomを指定して[Continue]。

![install_integration2.png](https://qiita-image-store.s3.amazonaws.com/0/8631/95e12e42-3124-a0d1-393f-05feb1afa53a.png)

最後の画面でアドオンのスコープを確認して[Install]でインストール完了です！

![install_integration3.png](https://qiita-image-store.s3.amazonaws.com/0/8631/53ebfd49-f74d-4acd-a409-4fafd932a72b.png)

インストールが完了するとインストールしたRoomにアドオンから通知が飛んでいると思います（通知の内容がやっつけですみません）。エラーになった場合は[Add Integration]ボタンからもう一度インストールしてみてください。ときどきインストールに失敗するようです。

インストールが完了したら早速 <code>/hip</code> とつぶやいてみてください。単純ですが、チャットエリアと連動してアップデートするHipChat Glancesはなかなか面白いですね。

## まとめ

アトラシアンのnodeで書かれたチュートリアルを見て、これならRailsでも簡単にできると思って作り始めたのですが、HipChat ConnectをカバーしているライブラリはNode.jsとPythonしかなくて辛かった。

よっぽどRailsが得意とか好きとか既存のRailsアプリを使いたいとか以外はNode.jsでやるのがいいと思います。

あと、HipChat Viewsでサイドバネルにいろいろ表示したかったんだけどCORSの問題かうまく表示できなかった。ネイティブアプリだとデバッグ方法がなくてさっぱり原因が判らないので何とかしたいです。全て英語ですがドキュメントも充実しているので、これからもうちょっと調べてみたいと思います。

### 参考

* [HipChat developer documentation](https://ecosystem.atlassian.net/wiki/display/HIPDEV/HipChat+developer+documentation)
* [API Documentation version2](https://www.hipchat.com/docs/apiv2)
* [Building your first add-on in Node.js](https://ecosystem.atlassian.net/wiki/display/HIPDEV/Building+your+first+add-on+in+Node.js)<br>Node.jsのチュートリアル。これのテンプレートの中身を見るのがいまのところ一番手っ取り早いと思います。