aboutsummaryrefslogtreecommitdiff
path: root/users/ryan/modules/sketchybar/bar-config/plugins/weather.sh
diff options
context:
space:
mode:
Diffstat (limited to 'users/ryan/modules/sketchybar/bar-config/plugins/weather.sh')
-rwxr-xr-xusers/ryan/modules/sketchybar/bar-config/plugins/weather.sh56
1 files changed, 56 insertions, 0 deletions
diff --git a/users/ryan/modules/sketchybar/bar-config/plugins/weather.sh b/users/ryan/modules/sketchybar/bar-config/plugins/weather.sh
new file mode 100755
index 0000000..abf8103
--- /dev/null
+++ b/users/ryan/modules/sketchybar/bar-config/plugins/weather.sh
@@ -0,0 +1,56 @@
1#!/usr/bin/env bash
2# custom/weather -> condition icon + temp, with a hover popup ("tooltip").
3# Uses wttr.in JSON (format=j2, the smaller no-hourly variant). Needs jq + curl.
4source "$CONFIG_DIR/colors.sh"
5source "$CONFIG_DIR/icons.sh"
6
7CACHE="/tmp/sketchybar_weather.txt"
8
9# --- hover: show/hide the popup, populated from the cached line ---
10case "$SENDER" in
11 mouse.entered)
12 [ -f "$CACHE" ] && sketchybar --set weather.details label="$(cat "$CACHE")"
13 sketchybar --set "$NAME" popup.drawing=on
14 exit 0 ;;
15 mouse.exited)
16 sketchybar --set "$NAME" popup.drawing=off
17 exit 0 ;;
18esac
19
20command -v jq >/dev/null 2>&1 || { sketchybar --set "$NAME" label="wttr?"; exit 0; }
21
22JSON="$(curl -sf --max-time 6 'wttr.in/?format=j2')" \
23 || JSON="$(curl -sf --max-time 6 'wttr.in/?format=j1')" \
24 || { sketchybar --set "$NAME" label="--"; exit 0; }
25
26cc() { printf '%s' "$JSON" | jq -r ".current_condition[0].$1 // empty"; }
27CODE="$(cc weatherCode)"; TEMP="$(cc temp_F)"; FEELS="$(cc FeelsLikeF)"
28HUM="$(cc humidity)"; WSPD="$(cc windspeedMiles)"; WDIR="$(cc winddir16Point)"
29DESC="$(printf '%s' "$JSON" | jq -r '.current_condition[0].weatherDesc[0].value // empty')"
30AREA="$(printf '%s' "$JSON" | jq -r '.nearest_area[0].areaName[0].value // empty')"
31
32# daytime? simple local-hour heuristic (06:00–18:59) for clear/partly-cloudy variants
33HOUR=$(date +%H); HOUR=${HOUR#0}; : "${HOUR:=0}"
34if [ "$HOUR" -ge 6 ] && [ "$HOUR" -lt 19 ]; then DAY=1; else DAY=0; fi
35
36# WWO weatherCode -> nf-weather glyph
37case "$CODE" in
38 113) [ "$DAY" = 1 ] && ICON="$WEA_SUNNY" || ICON="$WEA_NIGHT" ;;
39 116) [ "$DAY" = 1 ] && ICON="$WEA_DAY_CLOUDY" || ICON="$WEA_NIGHT_CLOUDY" ;;
40 119|122) ICON="$WEA_CLOUDY" ;;
41 143|248|260) ICON="$WEA_FOG" ;;
42 200|386|389|392|395) ICON="$WEA_THUNDER" ;;
43 176|263|266|293|296|353) ICON="$WEA_SHOWERS" ;;
44 299|302|305|308|356|359) ICON="$WEA_RAIN" ;;
45 179|227|230|323|326|329|332|335|338|368|371) ICON="$WEA_SNOW" ;;
46 182|185|281|284|311|314|317|320|350|362|365|374|377) ICON="$WEA_SLEET" ;;
47 *) ICON="$WEA_CLOUDY" ;;
48esac
49
50[ -z "$TEMP" ] && exit 0
51
52# bar: <icon> <temp>°F (drop " ${TEMP}°F" if you want the icon only)
53sketchybar --set "$NAME" label="$ICON ${TEMP}°F"
54
55# cache the single-line hover tooltip
56printf '%s' "${AREA:+$AREA · }${DESC} · feels ${FEELS}°F · ${HUM}% humidity · ${WDIR} ${WSPD}mph" > "$CACHE"