背景
私は仲間内だけのSlackワークスペースや自分のtimesに「あとでよむ」という言葉と一緒に記事のURLを貼るような使い方をすることがときどきあります。
「あとでよむ」といいつつもしばらくしたら忘れかねないのでリマインドしてくれるやつがほしいなーと思っていて、Slack botの勉強を兼ねて作ってみました。
作ったもの
「あとでよむ」などの特定のワードが入ったメッセージがあると起動します
(のemojiを付けさせることで動作したことがわかるようにしています)
1時間後にリマインドのメッセージを送ります
(内部的にはイベント検知時に予約投稿しています)
「読んだ!」ボタンを押すと「お疲れ様でした!」と返します
「また1時間後にリマインド」ボタンを押すと再度1時間後にリマインドします
中身の概要
Slack Events API を使うとSlackでなにか動きがあるたびに通知してくれるので、これを利用しています。POSTメソッドを受け取るAPIを自分で用意してURLをSlackに登録することでイベントの情報を受け取っています。
emojiによるリアクションはreactions.addメソッドを、リマインドはchat.scheduleMessageメソッドを使用して実現しています。
メッセージ上のボタンに対するユーザーの操作に応じてAPIにPOSTリクエストが送られてくるため、API側でリクエストボディを見て対応する処理を行います(参考:Creating interactive messages)
具体的には、
- 「読んだ!」ボタンが押されたらchat.updateでメッセージを書き換える
- 「また1時間後にリマインド」ボタンが押されたらchat.updateした上でもう一度chat.scheduleMessageでリマインドを設定する
としています。
中身の詳細
serverless frameworkを使ってAWS Lambda + API Gatewayの構成でAPIを作成しています
詳細はリポジトリをご覧ください
現状の課題
リマインドメッセージは全員に見えるものなので、リマインドを設定した人以外の人にボタンが押される可能性があります…
とりあえず一旦そのままで性善説を信じて運用しています(/remindがbotから設定できるといいんですが)