ミーティング中かどうかを自動で妻に伝える

これは Kyash Advent Calendar 2020 12日目の記事です。今日は箸休め回です。

リモートワークをしていて急にミーティングが入ることがありますよね。自分は妻と一緒に暮らしているので、ミーティングが始まる前にその旨を伝えておかないと、妻がいきなりビデオチャットに登場してしまうリスクや、ミーティング中にいつの間にかご飯の時間を過ぎているなどで家庭内の雰囲気が引き締まるリスクがあります。これまでは都度口頭で伝えていたのですが、伝え忘れてしまうことやタイミングが悪くて伝えられないことがあるので自動で伝わってほしいなと感じ、ちょっと思いついた方法を試してみたら1時間くらいでできたので書き残しておきます。環境はMacです。

まず、伝達手段を決めます。最初、ミーティングが始まったらなんらかの方法でLEDを光らせたり音を出したりして伝えるか...?と思っていたのですが、冷静に考えると家庭内slackがあるのでslackで連絡すればいいということに気付きました。Incoming Webhookを使って適当なチャンネルにミーティング開始時/終了時にそれぞれ投稿することにします。Incoming Webhookについてはネット上にいくらでも情報がありますが、とりあえず以下のドキュメントに従っておけば大丈夫です。

api.slack.com

続いて、ミーティングの開始/終了を検知する方法を考えます。まずミーティング中かどうかですが、基本的にchromeを使ってgoogle meetでミーティングをすることが多いので *1chromeの開いているタブをすべて見て、その中にmeetが存在したらミーティング中と見なすのが良さそうです。調べてみたところ、これには chrome-cli というコマンドラインツールが使えそうでした。使い方はREADMEに載っていますが、とりあえず chrome-cli list tabs で開いているタブのタイトルが列挙されるのでその中に Meet を含むタイトルが存在するかでミーティング中かを判定できます。

github.com

それでミーティング中かどうかはわかるとして、ミーティング開始/終了を検知するためには、「ミーティング中かどうか」の状態が切り替わったことを知る必要があります。それには、「ミーティング中かどうか」を調べるスクリプトを定期実行して、

  • 前回実行時にミーティング中でなく、今回はミーティング中だったらミーティングが開始した
  • 前回実行時にミーティング中で、今回はミーティング中でなかったらミーティングが終了した

と考えれば大丈夫そうです。これを実現するためには前回のスクリプト実行時の結果を覚えている必要があります。いくつか方法が考えられますが、スクリプト実行時にミーティング中だった場合は決まったpathに一時ファイルを作ることにして、その次のスクリプト実行時には一時ファイルがあれば前回はミーティング中だったんだなと判断するのが簡単そうです。

ここまでの流れをスクリプトにしたものが以下です。簡単な処理なのでシェルスクリプトで書きました。

#!/bin/sh

flagFile="/path/to/flag_file"
slackWebhookURL="https://url.of/slack/webhook"

# slack()は引数として受け取ったメッセージをslack通知する
slack()
{
  curl \
  -X POST \
  -d "{\"text\": \"$1\"}" \
  $slackWebhookURL
}

# 今ミーティング中かどうか
isOnMeeting=false
if [ $(/usr/local/bin/chrome-cli list tabs | grep -c 'Meet -') -gt 0 ]; then
  isOnMeeting=true
fi

# 前回のスクリプト実行時にミーティング中だったかどうか
wasOnMeeting=false
if [ -e $flagFile ]; then
  wasOnMeeting=true
fi

if "$isOnMeeting" && ! "$wasOnMeeting"; then
  slack ミーティングが始まりました:baby_chick:
  if [ ! -e $flagFile ]; then
    # ここで一時ファイルを作成しミーティング中であることが次回のスクリプト実行時にわかるようにする
    touch $flagFile
  fi
elif ! "$isOnMeeting" && "$wasOnMeeting"; then
  slack ミーティングが終わりました:chicken:
  if [ -e $flagFile ]; then
    rm $flagFile
  fi
fi

あとはこのスクリプトを適当な間隔で実行すればOKです。Macで何らかのスクリプトを定期実行するには launchd を使うのが一番簡単だと思います。自分は以下の記事を参考に設定し、30秒間隔でスクリプトを実行しています。

shikiyura.com

エンジニア間でのちょっとした相談では突発的に短いミーティングが発生することがあると思いますが、そんなときもただミーティングをしているだけで自動的に家庭内slackに以下のような投稿が飛び、平和が維持されています。

f:id:muijp:20201209095814p:plain

*1:2020年11月くらいまで。現在のKyashではzoomへの移行が進んでおり、この記事の方法は引退が近づいています