こんにちは。
テックリードのTerukiです。
Oh my teethではSlackをフル活用して日々の業務を行っているのですが、そこで実装しているリマインダーについて紹介します。
Slackのリマインダー
Slackにはもともとリマインダーの機能がありますが、今回はそれらの機能ではできないチャンネルに投稿されたメッセージすべてに対してリマインドしてくれるようなものを作ってみます。
例えば、#todo-somethingチャンネルのようなタスクがひたすら投稿されるチャンネルがあった場合、リマインド機能がないとほぼ確実に漏れが発生します。
Slackの公式リマインダーはメッセージに対して自分でリマインダーを設定しますが、毎日100件など対応するものがある場合はとても非現実的です。
実装
例えば、18時になったら未対応のTodoに対してリマインドをしてもらうとします。
未対応かどうかの判定は特定の絵文字がメッセージについているかどうかで行います。
この機能はSlackの「conversations.history」APIで実現できます。
このAPIは最大1000件のチャンネルのメッセージを取得できます。
レスポンスの中に何のリアクションが付いているが載っているのでここを見れば判定できるというわけです。
リアクションがなければ「chat.postMessage」にthread_tsとreply_broadcastを追加して呼び出せばOKです。
thread_tsに指定するべき値は「conversations.history」のレスポンスに載っています。
何も考えずにループでchat.postMessageを実行するとリマインド量によっては、ほぼ確実にレートリミットに引っかかってしまうので1ループごとに500ミリ秒程度遅延させるのが良いと思います。
重要なリマインドの場合はリマインドメッセージに特定のグループをメンションさせることもできますが、量が多いと毎日定時にグループに入っている人のアクティビティを破壊してしまうので使い所は要検討です。
おわりに
Oh my teethはこのリマインダーをC#で実装しています。
コード自体が業務システムと結びつきすぎているためコードは公開できないのですが、やっていることは紹介しているAPIにHttpClientでアクセスしているだけです。
個人的な考えですが、Slackに限らず公式のSDKがない時は下手にサードパーティや非公式OSSを利用せずに自分たちで直接HTTPリクエストを実行するようなコードを書くのが良いと思っています。
依存関係を増やさなくて済みますし、HttpClientにリトライ機能を実装しようとしてもライブラリに隠蔽されていると実装できなくなってしまいます。
リマインド量が多くSlackアプリを自作できる方は試してみてはいかがでしょうか。
Oh my teethについて
Oh my teethでは未来の歯科体験を創るために日々活動しています。
Techチームではより良いユーザー体験を提供するべく、Webフロントエンドからバックエンド、スマホアプリに機械学習モデルなど、さまざまなプロダクトを開発しています。
一緒に未来の歯科体験を創りませんか?興味がある方は是非こちらを確認してください。
カジュアル面談も可能なので気軽に応募してみてください!
