Information Technology
LINEの仕様との格闘 タイムアウトとセッション
From 2019/9/24 Tue. to 2019/9/29 Sun.
合宿での集中作業によりデータベースの構築が完了した我々は、ようやくLINEBotとの会話部分の検討に着手することができ、会話の流れに関する課題と向き合うこととなった。勢いづいて平日にも作業をする。
今回のアプリでは、LINEのBOTと友達になり、メンバーが参加しているグループに招待する。各メンバーか支払った金額を、金額の入力を判別するための文字列と一緒にLINEのメッセージとして順番に入力した後、プログラム側で計算し、割り勘した結果をBOTが通知してくる。この一連の処理が終わるまでの間は、それぞれのメンバーとBOTの間での会話は完結していても、全体としては金額の情報をLINEのユーザー側とプログラムのあるサーバーの間で継続して保持している必要がある。すべて済んだ上でデータベースへの書き込みを実施するためだ。
通常のWebアプリでは、このような仕組みは「セッション」によって実現されているが、今回利用するLINEBotのAPIの仕組みを通してそのようなことが実現できるかどうかが重要なポイントとなった。
これを検証するため、簡単なサンプルを作った。BOTとLINEで会話しながら、複数回金額を入力し、金額をセッションに保持しつつ指定回数に達したらBOTが返すメッセージを変えるような実装にした。メッセージが指定回数後に変わるようであれば、セッションに金額を保持しておけるということになる。こうなってくるとLINEBotのAPIやFlaskのドキュメントのサンプルコードを読みながら、試験的に実装して試すしかない。これは成功した。
一方で誰かが会話を開始したものの、一定時間他の人が金額を入力しないなどした場合に、セッションを消去したうえでメッセージで一定時間経過したことをメンバーに通知し、会話をシステム側で終了させるような「タイムアウト」させる機能も必要となりそうだった。これには二つ課題があり、複数の利用者の時間の情報をサーバーで並行して持てるかどうかという点と、セッションを初期化させつつ、メンバーにタイムアウトを通知させ方法があるのかという点が課題となった。この機能はかなり長く検討したが、最終的には実装を見送ることにした。
「ユーザー登録」も必要だ。今回の割り勘BOTでは、BOTをお友達として旅行しているメンバーのいるグループに招待する。BOTはグループに参加した段階ではグループ名やメンバー名を持っていないので、プログラムでこれらの情報を処理するためにLINE側から取得し、heroku上のデータベースに登録させる仕組みが必要である。
いよいよ開発プロジェクト”らしく”細かい課題やタスクが発生してやることが増えてきたことから、プロダクト・バックログを管理していたTrelloに加えて、新しいプロジェクト管理ツールを導入することにした。「backlog」という課題・タスク管理アプリの導入である。我々は業務で利用していたRedimineに操作や見た目が近いという理由でこれを選定した。
今のところ、起票されたチケットは「不定期にsession情報が想定と異なる挙動をする」「支払金額の入力方法」「timeout設定ができない」「ユーザー・グループ登録機能の実装」など。
会話の流れに関する課題をブレイクダウンしたことで、これ以降は金額入力の画面UIと割り勘の精算計算ロジックの開発に集中できるような、一つの山場を超えた感じがあった。