背景
IFTTTでは条件を指定して、Dropboxに日付入りのファイルを作成する事が出来る。
この条件に最近AlexaやSiriをhomebridge経由でIFTTTのWebhooksを指定できる事を
知った。
問題
Node.jsでfs.watchで指定したディレクトリの監視がOSが限定されるようだが
出来る。
でも、ファイルの追加削除がrenameイベントで通知されてしまう。
何も考えないでこのrenameイベントを契機に処理を行うと
溜め込んだ古いファイルを削除しても動いてしまう問題がある。
Dropboxのファイル名を解釈することで、古いファイルが
削除されても、これを無視する事が可能になる。
Node.jsで日付入りのファイル名を扱う
Dropboxに作成されるファイル名は人間が読みやすい形式なので、
なんとかNode.jsで扱える形式にパースする必要がある。
IFTTT経由のDropboxのファイル名を作成日付にしてるが、タイムゾーンがJSTっぽくてなんで俺が日本にいるの分かるのだろう?と思ったら、IFTTTの設定でタイムゾーンを指定してて、JSTをちゃんと指定していた為だったっぽい
— kjunichi (@kjunichi) 2018年2月12日
日付を扱う便利なライブラリを入れる
moment.jsを使うと、幅広い日付の形式に対応していて、
今回の形式の日付も簡単に扱うことできた。
日付ファイル名が10分以内に作成されたかをチェックするコード
const moment = require("moment");
const checkFilename = (name) => {
const now = moment();
const origDateStr = name.split(" at ")[0];
if (name.split(" at ")[1]) {
const origTimeStr = name.split(" at ")[1].substring(0, 7);
const origDateTime = moment(`${origDateStr}${origTimeStr}`, "MMMM D, YYYYhh:mma");
if (now.diff(origDateTime) < 10 * 60 * 1000) {
// 10分位内に作成されたファイル
return true;
}
}
return false;
};
// DropBoxには以下のようなファイル名でファイルが作成される
checkFilename("February 12, 2018 at 11/35AMT1-2On.txt");
// IFTTTで指定したDropboxのパスを設定
const path = "/Users/kjunichi/Dropbox/IFTTT/MakerWebooks/hoge";
fs.watch(path, (event, filename) => {
// console.log(event + " to " + filename);
if (checkFilename(filename) && event === "rename") {
// IFTTTで通知された際に行う処理を実行する
}
});