投稿に至った背景
今回私が作成したものはSlack APIを活用したBotで、メッセージにつけたリアクションに応じてリマインダーを作成し、予約の時間になるとDMにリマインドを送信してくれるものです。
初めてjavascriptとGASを触って作成したものなので記念とアウトプット用に書いてみることにしました。
搭載した機能
- chat.ScheduledMessage Methodを用いた予約投稿の作成機能
- chat.deleteScheduledMessage Methodを用いた予約取り消し機能
- user.info Method, conversations.history Methodを用いたリマインド文の装飾
- Google スプレッドシートを活用したログ管理とログの削除機能
- 重複予約を防ぐ機能
実装の概略
- SlackのEvent APIを叩く
以下のドキュメントを参照に、Event APIを叩くことでSlack側からリアクション追加時に送られてくる情報を取得する。 - リアクションが追加された時に、chat.ScheduledMessage Methodを叩く
- リアクションが削除された時に、chat.deleteScheduledMessage Methodを叩く
→一旦この時点で、これらの機能が動いているかを確認する - 重複予約を防ぐ機能を追加
- user.info Method, conversations.history Methodを用いてリマインドの文章を単純な文書ではなく、元メッセージを表示、リンクを踏むと元メッセージに飛ぶようにする
実装の上で何が障壁だったか
最初のうちはかなり調子が良くとんとん拍子で進んでいました。まずまずやろうとしていることが単純でそこまで難しくもないのでそんなに時間はかからないと思っていました。
しかし、リマインダーを削除する機能を実装する際、泥沼にハマってしまいました....
原因を突き止めるためにかなりの時間を費やしてデバッグを行いました。
そもそもどのように動くのか
まず初めに、このリマインダーの削除が行われる機能の仕組みについて軽く。
詳しくは以下のドキュメントを読んでいただくとよくわかると思います。↓
chat.scheduledmessage(リマインド予約)のリファレンス
chat.deletescheduledmessage(リマインド削除)のリファレンス
さて、機能の説明です。予約の機能があれば削除の機能もあるだろうということで、SlackのAPIはとても便利ですね。
これら二つを実装すればもう今回作ろうとしているものの6割は終了です。
リマインダーの予約をした時、つまり特定のリアクションを追加した時に、リマインド予約APIはscheduled_message_idという一意の値を返します。リアクション削除APIに、この時生成されたscheduled_message_idを渡すと、同じ値を持つ予約を削除する仕組みです。
つまり、予約の時scheduled_message_idを取得&保存しておき、削除の時にそれを検索して削除APIに渡してやればそれだけで機能は完成です。
私は今回、イベントが起こったSlackのchannel, time_stump, user(リアクションをつけた人)を使ってkeyを作成→{key:scheduled_message_id}の形で保存し、検索。という手順で進めました。
バグの発生
これらの機能を実装し、Slack上でデプロイし、1分, 2分, 3分後にリマインダーが来るかをテストしたところしっかりと動きました。しかし、同様にして3分のリマインダーを削除したところ本来リマインドは2通のはずが3通届く事態が発生しました。
APIのリファレンスには予約が1分以内のものは消せないとあったのでちゃんとそこを考慮した3分だったのになぜ.....
考えられること
このバグが起きてしまう原因はいくつか考えられました。
- scheduled_message_idが取得できていない
- 検索に用いた一意のkeyが一致しておらず、idの取得できていない
- リアクションを追加した時に重複してリアクションがついてしまっている
- 単にAPIの不調
主にこんなあたりだろうと目星をつけ、色々と試行錯誤を繰り返しました。
- Google スプレッドシートにscheduled_message_id, keyを記録し、確認
- APIのレスポンスを記録し確認
- 何回予約の実行がされているかを確認
- chat.scheduledmessage.list Methodを用いてSlack上で予約の投稿が何件溜まっているのか確認
結果はどれも正常でした....
GAS上の手動実行でリマインドを予約した時と削除した時に何件予約が溜まっているのかを確認してもちゃんと予約の件数は減っていたのです.....
結論
なんでこんなのが起こるのかはわからなかったが、解決法を見つけた!!
何でこんなことが起こるのかわからずGeminiと対話すること長時間、同様の事例が報告されていないかどうかを聞いてみました。
するとこんな記事が!!
内容は、私と同様ログは正常なのになんかリマインドが送信される...といった悩みに対するアンサーでした。
どうやら、2021年にリマインド削除のAPIが5分以内にリマインド予約されたものは削除ができないと報告されていたらしいです。
私はテストの結果が早く欲しくてリマインドの時間を1〜3分の短い時間でずっと試行錯誤していたので、試しに10分でやってみると....
成功!!!!!
自分でも何でこんな簡単なことを早く試してみなかったのかと疑問ですが、これは早くモノを完成させたいという焦りとAIに何でも聞けてしまう現代で、テンプレ返信を脳死で捌いていた結果だと思います....反省
やはり、急がば回れは正しいと、そしてプログラミングを始めて半年も経っていないのに何でもかんでも高速で作ろうとしてしまっていた自分の未熟さを痛感する出来事でした。
最後に
勉強することが尽きないプログラミング、最初のうちにこのようなしっかりと調査し、仮説を立て、実行するという経験をできたことは良かったのかなと思います。
(バグの原因はあんまりよくわかってないですが....)