ハングアウトに人が来たことをSlackに通知する

# TL;DR

- ハングアウトに人が来たらSlackに通知する拡張機能を作った
- Google Appsアカウントだとハマりどころが多いので注意が必要
- 認証情報などはオフィスネットワークからのみアクセスできる空間に設置する

# 背景

Incrementsではリモートワークを導入しています。リモートワークには働く場所を各自が自由に選べるプラスの面がある一方で、偶発的な雑談が生まれにくいなどのマイナス面もあります。

そこでIncrementsではオフィスを常時映し出す "Officeハングアウト" を設置し、皆が集まる仮想的なホールとして運用しているのですが、運用し始めてみて分かってきた問題点がいくつかありました:

- マシンパワーやバッテリーなどの観点から皆が繋ぎっぱなしにすることはできないので、人が集まっていたり盛り上がってる時だけ繋ぎたい。しかしわざわざハングアウトの参加者が「今盛り上がっているから来てくれ〜」などとその都度アナウンスすることもできないし面倒。
- 繋ぐ側からしても、今そこに人がいるのか分からない。誰もいないハングアウトに参加してもしょうがない。いるなら参加しようかなという気持ちになる。

そんな訳で、ハングアウトの参加者が増減したらそれをSlackに通知することにしました。

# hangouts-slack-notifier

[ハングアウトのAPI](https://developers.google.com/+/hangouts/)を調べたところ、参加者が増減した時に発生するイベントがあるらしいので、それにフックしてSlackに通知を送る拡張機能を作りました。

- https://github.com/increments/hangouts-slack-notifier

ハングアウトに人が出入りすると、こんな感じでSlackに通知が飛びます。

![image](https://qiita-image-store.s3.amazonaws.com/0/153/07094d4c-e067-ea73-5261-33212fb037df.png)

以下、実装時にハマったことなどつらつらと書きます。

## Google Appsアカウントで作ると拡張機能を起動できない

作った拡張機能は Google　Developers Console に登録するんですが、なぜか Google Apps アカウントに紐付けると起動時に OAuth 認証時にドメインが合わないと言われて先に進めません。一般の Google アカウントで登録すると起動できます。これにハマってかなり時間を無駄にしました :tired_face: 

Google アカウントで拡張機能を登録することで起動できるようになったんですが、しかし、この拡張機能そのものは Google Apps アカウントで利用したいです。というのも、 Office ハングアウトには Increments の公式アカウント的なアカウントで参加しているので。

ハングアウトの拡張機能には全体公開せずに許可したアカウントだけが使えるようにすることができるらしいのですが、なんかうまくいかず、結局拡張機能を全体公開状態にして使うことにしました。

## 認証情報をどうもたせるか

拡張機能を全体公開にする・しないに関わらず、拡張機能そのものは Google のサーバからアクセスできる場所におかなければなりません。そのため、 Slack への認証情報をアプリの中にどうやって持たせるかが問題になってきます。 Google と自分だけから見えるように拡張機能を用意するのは面倒くさいので、そのまま認証情報を拡張機能に埋め込んでしまうと誰でも見えることになってしまって危険です。

ハングアウトのAPIドキュメントに書いてありますが、拡張機能はハングアウトに参加しているブラウザ上で `iframe` として実行されます。なので、拡張機能の本体は Google からアクセス可能でなければなりませんが、その拡張機能から読み込むファイルはそのブラウザから到達できさえすればいいです。なので、 Increments のオフィスからだけアクセスできる空間に認証情報をもった JSON ファイルを設置して、拡張機能からはその JSON ファイルを取ってこさせるようにしました。

この認証情報を取得する部分を柔軟にして、例えば拡張機能を起動後にユーザにトークンを直接入力してもらうようにすることも考えたのですが、社内で使うのに不便過ぎるということで、 Increments 用の JSON ファイルの URL が拡張機能に直書きしました。なのでこの拡張機能は Increments 専用になっています。

## アプリを起動させる

ハングアウトを起動すると、画面左にアプリ選択バーみたいなのが出てきますが、「公開されているアプリ一覧から目的のものを検索して実行」みたいなことが何故かできません。

が、ハングアウトには「最近使ったアプリ」を表示する機能はあるので、今回作った拡張機能を一回手動で起動させることで履歴に保存し、次からはそれを使うようにしています。

目的のハングアウトを起動させるには[ハングアウトボタン](https://developers.google.com/+/hangouts/button)というのを用意する必要があります。詳しい使い方はドキュメントを読んで欲しいですが、今回は GitHub pages を使ってボタンを用意しました。色々面倒くさい

http://increments.github.io/hangouts-slack-notifier/

## LOCAL_APPとして起動できない

ハングアウトボタンを使うと指定された拡張機能が入ったハングアウトを起動できますが、毎回新しい URL になってしまいます。これでは皆がフラっとやってくる場所にすることができません。

細かい話になりますが、ハングアウトボタン経由で起動するときは、そのボタンを押した人のハングアウトでだけ起動する LOCAL_APP として拡張機能を実行できますが、今回 Increments でやってるみたいな使い方だと強制的に ROOM_APP になってしまうようです。（使い方を間違ってるだけの可能性もある）

これで何が困るかというと、10人ハングアウトに参加すると、10人全員の手元で拡張機能が動くので、それぞれの拡張機能がそれぞれに Slack に通知を送ろうとしてしまのです。

オフィスにいるのが1人だけで、他の人は全員オフィス外だった場合は、 Slack の認証情報を持っているのが1人だけなのでいいのですが、場合によってはオフィスに2人いたりして、その場合 Slack にメッセージが多重送信されてしまうことになります。

この問題を解決するために、拡張機能を実行したら表示されるボタンをクリックした人の手元からだけ Slack に通知を飛ばすようにしました。ココらへんも完全自動化したかったんですが、綺麗かつ正確に制御することが難しく、こういう形で妥協しました...

## 通知の内容

最初は「人が入ってきた」「出て行った」ということだけを通知するようにしてみたのですが、結局今誰がいるのかが分かりづらいということになって、差分に加えて今ハングアウトに参加している人の一覧を表示することにしました。この辺の通知内容はもっと工夫の余地があるなーと思っています。

![image](https://qiita-image-store.s3.amazonaws.com/0/153/73e92133-e57a-2d78-50c8-9103d5fa62ec.png)

# おわりに

いろいろハマりどころは多いですが、ハングアウトで同じようなことをしている組織がもしあったら、試してみてください。

# 参考

- [Google+ Hangouts API   |  Google Developers](https://developers.google.com/+/hangouts/)
- [GitHub - increments/hangouts-slack-notifier: Hangouts Slack Notifier for Increments Office](https://github.com/increments/hangouts-slack-notifier)
- [JavaScriptを使ってSlackのチャンネルに投稿してみる - Qiita](http://qiita.com/HelloPeople/items/98e6271f627c3b9a5e12)