#!/bin/bash # omarchy:summary=Show or set the location used for weather reports # # State lives in ~/.local/state/omarchy/settings/weather.json as # {"name": ..., "latitude": ..., "longitude": ...}. A missing file means the # location is auto-detected from the IP address. Coordinates make the weather # panel exact; a hand-written {"name": "Malibu"} alone works too. # # (no args) the current location: the stored name, or the # IP-detected city when nothing is set # --set [lat,lon] store a location # --clear return to IP auto-detect LOC_FILE="$HOME/.local/state/omarchy/settings/weather.json" COORDS_PATTERN='^(-?[0-9]+(\.[0-9]+)?),(-?[0-9]+(\.[0-9]+)?)$' case "${1:-}" in "") name="" [[ -f $LOC_FILE ]] && name=$(jq -r '.name // "" | if type == "string" then . else "" end' "$LOC_FILE" 2>/dev/null) if [[ -z $name ]]; then name=$(curl -fsS --max-time 4 "https://wttr.in/?format=%l" 2>/dev/null) name=${name%%,*} fi [[ -n $name ]] && echo "$name" ;; --set) [[ -n ${2:-} ]] || { echo "Usage: omarchy-weather-location --set [lat,lon]" >&2; exit 1; } if [[ -n ${3:-} ]]; then [[ ${3} =~ $COORDS_PATTERN ]] || { echo "Invalid coordinates: $3 (expected lat,lon)" >&2; exit 1; } location=$(jq -n --arg name "$2" --argjson latitude "${3%,*}" --argjson longitude "${3#*,}" '{$name, $latitude, $longitude}') else location=$(jq -n --arg name "$2" '{$name}') fi mkdir -p "$(dirname "$LOC_FILE")" echo "$location" >"$LOC_FILE" ;; --clear) rm -f "$LOC_FILE" ;; *) echo "Usage: omarchy-weather-location [--set [lat,lon]|--clear]" >&2 exit 1 ;; esac