この記事は 「Slack Advent Calendar 2018」 の21日目の記事です。
はじめに
皆さん、Slackは活用していますでしょうか。
私の所属している会社では毎日(平日)Slackでの会話が盛り上がっていてお前らいつ仕事してるんだ?と感じる程です。
また独自の文化やBotもどんどん社員が勝手に導入してカオスな空間になっています。
話変わって、独自の文化という文脈で弊社では全社員が編集権限を持つGoogle CalendarのCalendarに他の人も自由に参加してほしい予定を作り参加してもらうと言う文化(?)があります。
勉強会だったり、またちょっとした社内の催しがカレンダーに追加されたら、そのゲストに自分を追加して…みたいな運用が行われています。
しかしこの自分をゲストに追加するという作業が地味にひと手間であったり、オペレーションミスでイベントを削除してしまったり、ゲストから他の人を除外してしまったりという事故が起こったりします。
こういったオペレーションミスを起こさないために必要なのはユーザーに対して一定の操作規制をかけるのが手っ取り早いです。
しかし外部サービスのUIを変えたり、各ユーザの操作権限を制御するなんてことは出来ません。
ということで、社内でコミュニケーションツールとして、またある種のインフラとして活用されているSlackのBotにその操作を行わせることで解消できるのではないかと考えたため、Google Calendarを操作するBotを作ってみました。
制作から完成まで
当初Google CalendarのUI上で行っていた、自分をゲストに加える操作をそのまま形にしようと実装を行いました。
SlackのOutgoing Webhooksを使ったもので、イメージとしては
コマンド名 add カレンダーのイベントURL
を対象のイベントに参加したい人が叩いてもらう運用です。
しかしこの方法では対象のイベントのURLを参加する各個人が知る必要があり、それを知っているのであればGoogle Calendarでミスが生じるかもしれなくても操作するほうが、タイプ数も少なくて済むという本当に使われるのか?みたいな状態になっていました。
そのため更にユーザの負担を減らし、楽にイベントに参加申請をする方法を模索しました。
そこで目をつけたのがMessage Attachmentsと、そのActionをハンドルすることでした。
Message AttachmentsはSlackのメッセージをカスタマイズする機能で、装飾を行ったり、メッセージに対してボタンを付与したりすることが出来る機能です。
この機能を使いイベントを作った人にSlackでコマンドを叩いてもらって、そのコマンドに反応したBotが送信したMessageのボタンからイベントに参加申請するというフローを作りました。
この様にユーザに行わせる操作を限定することで、特定の目的を果たすことが容易になりました。
またこれを普段から使っていて馴染みのあるツールに導入するということで、様々なハードルが下がるのではないかと考えられます。
技術に関すること
今回はAzure FunctionsとC#を使用しました。
この技術の選定理由としては、
- Google CalendarやSlackなど複数のAPIの結果を組み合わせて使う場合、SQLの様にテーブルをガッチャンコする感じでListの操作が出来るLINQがあると便利だなと思った
- Azure Application Insightsのログ機能が優秀で、エラーで落ちた場合どのリクエストが走ってどこで落ちたのかがわかりやすい
という点があったからです。 (本音を言うとC#が大好きだし会社でC#はやらせられないかなーとか思ったから)
もちろん今回行ったことはC#に限らず、様々な言語でSlackやGoogleの提供しているAPIのライブラリが提供されているため好きな言語で、また好きなホスティング環境で実施することが出来ます。
参考までに今回使用したコード(の一部)を公開いたします。
https://github.com/yamachu/calman
READMEなど一切なく、またボタンを押して参加する機能が社内リポジトリのコードにしか無くて不完全なところもありますが、参考にしてみてください。
おわりに
SlackはBotを作って遊んでみる、というのが本当に簡単にできるプラットフォームであるので、是非とも活用していってほしいです。