sketchybar: meetingbar <> zoom
change ttqklyurmxksykxpqozmqqxxwklzmkyk
commit 543d8ccdb30adacf1f9fa081ba2b220479c70af9
author Alpha Chen <alpha@kejadlen.dev>
date
parent rysvxorn
diff --git a/.config/sketchybar/meetingbar.swift b/.config/sketchybar/meetingbar.swift
index 880c9822..99bd0d48 100755
--- a/.config/sketchybar/meetingbar.swift
+++ b/.config/sketchybar/meetingbar.swift
@@ -147,6 +147,49 @@ guard CommandLine.arguments.count > 1 else {
 
 let calendarTitle = CommandLine.arguments[1]
 
+func extractZoomURL(from event: EKEvent) -> String? {
+    // Check notes for Zoom URL
+    if let notes = event.notes {
+        if let url = extractZoomURL(from: notes) {
+            return url
+        }
+    }
+
+    // Check location for Zoom URL
+    if let location = event.location {
+        if let url = extractZoomURL(from: location) {
+            return url
+        }
+    }
+
+    // Check URL property
+    if let url = event.url?.absoluteString {
+        if url.contains("zoom.us") {
+            return url
+        }
+    }
+
+    return nil
+}
+
+func extractZoomURL(from text: String) -> String? {
+    // Pattern to match Zoom URLs
+    let pattern = "https://[a-zA-Z0-9.-]*\\.?zoom\\.us/[^\\s]+"
+
+    guard let regex = try? NSRegularExpression(pattern: pattern, options: []) else {
+        return nil
+    }
+
+    let nsString = text as NSString
+    let matches = regex.matches(in: text, options: [], range: NSRange(location: 0, length: nsString.length))
+
+    if let match = matches.first {
+        return nsString.substring(with: match.range)
+    }
+
+    return nil
+}
+
 func formatTimeUntil(_ date: Date, from currentDate: Date) -> String {
     let minutes = Int(date.timeIntervalSince(currentDate) / 60)
     if minutes <= 0 {
@@ -174,12 +217,20 @@ do {
         let currentDate = Date()
         let isCurrentMeeting = currentDate >= event.startDate && currentDate <= event.endDate
 
+        let displayText: String
         if isCurrentMeeting {
             let timeStr = formatTimeUntil(event.endDate, from: currentDate)
-            print("\(event.title ?? "Untitled Event") ends \(timeStr)")
+            displayText = "\(event.title ?? "Untitled Event") ends \(timeStr)"
         } else {
             let timeStr = formatTimeUntil(event.startDate, from: currentDate)
-            print("\(event.title ?? "Untitled Event") \(timeStr)")
+            displayText = "\(event.title ?? "Untitled Event") \(timeStr)"
+        }
+
+        // Output format: DISPLAY_TEXT<||>ZOOM_URL (or just DISPLAY_TEXT if no Zoom URL)
+        if let zoomURL = extractZoomURL(from: event) {
+            print("\(displayText)<||>\(zoomURL)")
+        } else {
+            print(displayText)
         }
     } else {
         print("No meetings")
diff --git a/.config/sketchybar/plugins/meetingbar.sh b/.config/sketchybar/plugins/meetingbar.sh
index 3314de2c..deff3678 100755
--- a/.config/sketchybar/plugins/meetingbar.sh
+++ b/.config/sketchybar/plugins/meetingbar.sh
@@ -1,6 +1,22 @@
 #!/bin/sh
 
 CALENDAR=
-MEETING=$("$CONFIG_DIR/meetingbar.swift" "$CALENDAR")
+OUTPUT=$("$CONFIG_DIR/meetingbar.swift" "$CALENDAR")
 
-sketchybar --set "$NAME" label="$MEETING"
+# Parse output: format is "DISPLAY_TEXT<||>ZOOM_URL" or just "DISPLAY_TEXT"
+if echo "$OUTPUT" | grep -q "<||>"; then
+    MEETING=$(echo "$OUTPUT" | cut -d'<' -f1)
+    ZOOM_URL=$(echo "$OUTPUT" | grep -o '<||>.*' | sed 's/<||>//')
+
+    # Create a temporary script for clicking
+    CLICK_SCRIPT="open \"$ZOOM_URL\""
+
+    sketchybar --set "$NAME" \
+        label="$MEETING" \
+        click_script="$CLICK_SCRIPT"
+else
+    # No Zoom URL, just set the label and clear any click script
+    sketchybar --set "$NAME" \
+        label="$OUTPUT" \
+        click_script=""
+fi