#!/bin/sh arg=$1 report=~/.cache/weather_report.json ifinstalled jq # Get a weather report from 'wttr.in' and save it locally. getforecast() { { rg -q -m1 '^up$' /sys/class/net/w*/operstate || rg -q -m1 '^up$' /sys/class/net/e*/operstate; } && curl -sf "wttr.in/?format=j1" --output "$report" && touch "$report" } # Forecast should be updated only once a day. checkforecast() { [ "$(stat -c %y "$report" 2>/dev/null | cut -d' ' -f1)" = "$(date '+%Y-%m-%d')" ] } # Function to get weather emoji from code get_weather_emoji() { local code="$1" grep "^$code " ~/.local/share/extras/weather_codes | awk '{print $2}' } showweather(){ temp=$(jq -r '.current_condition[0].temp_C' $report) code=$(jq -r '.current_condition[0].weatherCode' $report) rainchance=$(jq '.weather[].hourly[].chanceofrain | tonumber' $report | sort -n | tail -n 1) emoji=$(get_weather_emoji "$code") case "$arg" in weather) case 1 in $((temp >= 30)) ) class="very_hot" ;; $((temp >= 26)) ) class="hot" ;; $((temp >= 21)) ) class="warm" ;; $((temp >= 16)) ) class="mild" ;; $((temp >= 11)) ) class="cool" ;; $((temp >= 6)) ) class="chilly" ;; $((temp >= 0)) ) class="cold" ;; $((temp < 0)) ) class="below_zero" ;; * ) echo unavailable && exit ;; esac output="$emoji$temp°C" ;; rain) case 1 in $((rainchance >= 70)) ) class="high" ;; $((rainchance >= 45)) ) class="mid" ;; $((rainchance > 0)) ) class="low" ;; $((rainchance <= 0)) ) printf '' && exit ;; * ) echo unavailable && exit ;; esac output="$rainchance%" ;; *) echo "Usage: $0 {weather|rain}" exit 1 ;; esac printf '{"text": "%s", "class": "%s" }' "$output" "$class" } case $BLOCK_BUTTON in 2) getforecast && showweather ;; 3) notify-send " Weather module" "\- Middle click to update forecast. : Chance of rain/snow : Current temperature" ;; 8) setsid -f "$TERMINAL" -e "$EDITOR" "$0" >/dev/null 2>&1 ;; esac # shellcheck disable=SC2015 checkforecast && showweather || ( flock -n 9 && ( tries=0; while [ $tries -ne 100 ]; do getforecast && break || { tries=$((tries+1)); sleep .1; } done ! checkforecast && until getforecast; do sleep 60; done pkill -RTMIN+5 "${STATUSBAR:-waybar}" ) & echo ) 9>"${XDG_RUNTIME_DIR}/sb-forecast.lock"