留学から帰ってから、現地にいる友達とビデオチャットする時間を設定するのが厄介になってしまった。「○○時は空いてる?」って一言聞くためにも、世界の時間一覧アプリを開けて当該時刻までスクロールして、対応する相手の時間を探して打ち込まなければならない…っていう一連の手間がめんどい。しかも私は「今ここは○○時やから、あっちは○○時かな」って計算できるほど頭がよくない。Daylight saving timeとか考えだしたら死ぬ。
だからそういうのを自動でしてくれるbotが欲しいと思った。
作ったbotはここにある↓
https://github.com/shio-yaamaa/timezone-line-bot
目標
私はAsia/Tokyo 18:00からできるよー
とか打ったらbotが
私は Asia/Tokyo 18:00 America/Los_Angeles 2:00 からできるよー
みたいな感じに変換してしゃべってほしい。シンプルな「JST」ではなく「Asia/Tokyo」とするのは、略称だと一意に決まらないことがあるみたいだから。それに、友達のいるところだと季節によってPSTになったりPDTになったりして頭おかしくなりそうだし。
けど毎回「Asia/Tokyo」とか書くなんてめんどくさすぎるので、チャットメンバーが「Asia/Tokyoのことは"jst"と呼ぶ」とでも決めておいて、
私はjst18:00からできるよー
でbotに反応してもらいたい。
できるようにすること
現在時刻
「今そっち何時?」「○○時だよ」って会話も頻発するので、
timezone now
って言ったら登録されてるタイムゾーン全ての現在時刻を表示するようにする。
全てのタイムゾーン
「Asia/Tokyo」みたいなやつ全部覚えてないので、timezone all
って言ったら全てのタイムゾーンのリストを返すようにする。ただし、全部のタイムゾーンは数が多すぎるので、一覧ページへのリンクのみ返す。
タイムゾーンの登録
timezone add Asia/Tokyo as jst
みたいな感じにする。いちいち「timezone」って打つのめんどくさいけど、「add」だけで反応するようにしたら要らんときまで反応してきそう。
as
の後は、そのタイムゾーンのエイリアスで、適当に指定できる。
消すときは、timezone delete jst
で消える。
Typoがあればsuggestする機能つけたかったけど、とりあえず今は一部を入力したら全部を返す("london"って入れたら「もしかしてEurope/London?」って聞いてくる)くらいしかできてない。
時刻のparse
Javascriptの時刻parserはいろいろ見つかったけど、Chronoが一番すごいと思ったので使わせてもらうことにした。Datejsも「tomorrow」とかをparseできるのはすごいんだけど、「tomorrow 5:00」とかになるとChronoしか処理できなくなる。
他にChronoがすごいところ
文字列が時刻以外の情報を含んでいても時刻だけを読み取り、どこから読み取ったかのインデックスを教えてくれる
年や月などのコンポーネントがそれぞれspecifyされてるのかimplyされてるだけなのか教えてくれる
期間のデータだったら始まりと終わりどちらも取ってくれる
デフォルトで多言語対応(さすがに英語の方が広く対応してるけど)
めっちゃありがたかった。
サーバーとか
Amazon Lambdaを使うことにした。データベースはDynamoDB。どっちもよくわかってないし、AWS自体が謎の塊だから、このチョイスで大丈夫なのか知らんけど。
一番躓いたところは、Lambdaでzipをアップロードして実行したときの「Cannot find module 'index'」っていうエラー。私の場合たぶん原因は二つあって、一つはzip圧縮するときにディレクトリの中身だけではなくディレクトリごと圧縮してしまったこと、もう一つはnode_modulesの中に必要なモジュールがちゃんと入ってなかった(npm i
し忘れた)ことだった。
あと、LambdaからDynamoDBにアクセスできない!!と思ったら原因は全然違うところにあった。DBの読み込みとかが非同期なのに、それを無視してcontext.succeed()やっちゃってたから途中でDBの処理を中断させられてたみたい。
LambdaとDynamoDBしか使わんはずやったのに、いざやり始めたら他に必要なサービスがどんどん出てきて圧倒された。AWSってすごいな…。もうちょっと全体像を把握したい。