先日Raycastを開くと2024年のサマリーが見られるようになっていました。
アプリケーションを開いた回数もカウントされており、僕はSlackを一番開いていることがわかりました。hotkeyに登録しているアプリケーションが少ないためSlackの使用回数が多いこと想像していましたが、改めて見ると流石に多すぎると感じました。
そこで、自分の使用状況を監視するために、RaycastのExtensionを作成してみることにしました。
やりたいこと
- 1日にSlackを開く回数の傾向を把握する
- 感覚よりも多く開いている場合に、「お前開きすぎちゃう?」と指摘してもらう
本来はRaycast経由でないSlackを開いた数もカウントしたかったのですが、今回は普段自分が使っているhotkeyで開いた回数のみのカウントになっています。あらかじめご了承ください。
やったこと
- hotkeyでExtensionを実行し、その中でSlackを開くように設定
- 起動回数をカウントし、一定回数以上になると通知する仕組みを作成
最終的に、以下の2つの機能を作成しました。
① 設定したしきい値以上の回数開いた場合、Macのdisplay notificationで通知
② 使用するたびにRaycastのshowHUDを使ってディスプレイにその日の使用回数を表示
コード例
以下はサンプルコードです。
普段Slackを開くのに使用していたhotkeyをこのExtensionの実行に割り当てることで実現しました。Slackを開く前に拡張機能を経由することになりますが、操作感は従来と変わりませんでした。
import { getFrontmostApplication, LocalStorage, showHUD } from "@raycast/api";
import { exec } from "child_process";
interface DailyTracker {
date: string;
count: number;
}
export default async function main() {
const now = new Date();
const today = now.toLocaleDateString('ja-JP');
const storedData = await LocalStorage.getItem<string>("slack-tracker");
let dailyTracker: DailyTracker;
if (storedData) {
const parsed = JSON.parse(storedData) as DailyTracker;
if (parsed.date === today) {
dailyTracker = parsed;
} else {
dailyTracker = { date: today, count: 0 };
await LocalStorage.clear()
}
} else {
dailyTracker = { date: today, count: 0 };
}
const frontmostApplication = await getFrontmostApplication();
if (frontmostApplication.name !== "Slack") {
dailyTracker.count += 1;
exec("open -a Slack");
if (dailyTracker.count >= 20) {
exec(`osascript -e 'display notification "今日は${dailyTracker.count}回もSlackを開いているので辞めときましょう" with title "Slack Tracker"'`)
} else {
await showHUD(`Slack opened! (Today: ${dailyTracker.count} times)`);
}
}
await LocalStorage.setItem("slack-tracker", JSON.stringify(dailyTracker));
}
最後に
RaycastでExtensionを自作するのは初めてでしたが、とても簡単に作成することが出来ました。APIのドキュメントも充実しており、さらに深く活用していきたいと思います。
今回は、拡張機能を経由してSlackを開く方法しか思いつきませんでしたが、将来的には他のアプリケーションも含めて監視できるようにしたいです。
※ 初めは30回Slackを開いたら通知する設定にしていたのですが、意外とすぐに通知が来てしまい、自分の使用頻度の多さを実感しましたw
Happy Raycast Life!