#!/bin/bash # nws - a National Weather Service terminal client # git.slickd.xyz/nws source ~/.config/nws/nws.conf version=v0.0.3 colors() { NOCOLOR='\033[0m' RED='\033[0;31m' GREEN='\033[0;32m' } cleanup() { rm -rf ~/.cache/.county_ids ~/.cache/.weather_forecast ~/.cache/.weather_alerts /tmp/nws/ } retrieve_counties() { curl -s "https://api.weather.gov/zones?area=${state}" >> ~/.cache/.county_ids colors count=0 length=$(echo $(jq '.features | length' ~/.cache/.county_ids) -1 | bc) while [ $count -le $length ] do echo -e ${GREEN}County: ${NOCOLOR}$(jq '.features['$count'].properties.name' ~/.cache/.county_ids) echo -e ${GREEN}Id: ${NOCOLOR}$(jq '.features['$count'].properties.id' ~/.cache/.county_ids) echo ((count++)) done } get_location() { cords=$(curl ipinfo.io/json | jq -r .loc) } show_radar() { case $radar_choice in "1") mpv --loop-file=inf "https://radar.weather.gov/ridge/standard/${area1}_loop.gif";; "2") mpv --loop-file=inf "https://radar.weather.gov/ridge/standard/${area3}_loop.gif";; "3") mpv --loop-file=inf "https://radar.weather.gov/ridge/standard/CONUS_loop.gif";; *) echo "You can only choose from 1 to 3." esac } show_alerts() { colors curl -s "https://api.weather.gov/alerts/active/zone/${countyId}" >> ~/.cache/.weather_alerts length=$(echo $(jq '.features | length' ~/.cache/.weather_alerts) -1 | bc) count=0 while [ $count -le $length ] do echo echo echo -------------------------------------------------------------------------------------------------------------------------------------------- echo echo -e ${GREEN}Alert: ${NOCOLOR}$(jq '.features['$count'].properties.headline' ~/.cache/.weather_alerts) echo -e ${GREEN}Starts: ${NOCOLOR}$(jq '.features['$count'].properties.effective' ~/.cache/.weather_alerts) echo -e ${GREEN}Ends: ${NOCOLOR}$(jq '.features['$count'].properties.expires' ~/.cache/.weather_alerts) echo -e ${GREEN}Sent: ${NOCOLOR}$(jq '.features['$count'].properties.sent' ~/.cache/.weather_alerts) echo -e ${GREEN}Severity: ${RED}$(jq '.features['$count'].properties.severity' ~/.cache/.weather_alerts) echo -e ${NOCOLOR} echo -e $(jq '.features['$count'].properties.parameters.NWSheadline' ~/.cache/.weather_alerts) echo -e $(jq '.features['$count'].properties.description' ~/.cache/.weather_alerts) echo -e $(jq '.features['$count'].properties.instruction' ~/.cache/.weather_alerts) echo echo -e ${GREEN}Affected areas: ${NOCOLOR}$(jq '.features['$count'].properties.areaDesc' ~/.cache/.weather_alerts) echo -e ${GREEN}Wind: ${NOCOLOR}$(jq '.features['$count'].properties.windThreat' ~/.cache/.weather_alerts) echo -e ${GREEN}Max Wind Gust: ${NOCOLOR}$(jq '.features['$count'].properties.maxWindGust' ~/.cache/.weather_alerts) echo -e ${GREEN}Hail: ${NOCOLOR}$(jq '.features['$count'].properties.hailThreat' ~/.cache/.weather_alerts) echo -e ${GREEN}Issued by $(jq '.features['$count'].properties.senderName' ~/.cache/.weather_alerts)${NOCOLOR} echo -------------------------------------------------------------------------------------------------------------------------------------------- ((count++)) done echo echo ((length++)) # json needs count to start at zero, real amount needs one added echo -e ${GREEN}Total alerts: $length${NOCOLOR} } count_alerts() { curl -s "https://api.weather.gov/alerts/active/zone/${countyId}" >> ~/.cache/.weather_alerts length=$(jq '.features | length' ~/.cache/.weather_alerts) echo $length } show_spc() { mpv --loop-file=inf "https://www.spc.noaa.gov/products/activity_loop.gif" } get_graphicast() { mkdir -p /tmp/nws/ count=1 prog=12.5 bar="#" while [ $count -le 8 ] do wget -q -P /tmp/nws https://www.weather.gov/images/oun/graphicast/image${count}.png echo -ne "${bar} (${prog}%)\r" ((count++)) prog=$(echo "$prog + 12.5" | bc) bar="${bar}#" done echo "Getting Mesonet radar..." wget -q -P /tmp/nws https://data.mesonet.org/data/nids/maps/realtime/${state_full}.MosaicBREF.png $IV /tmp/nws/* } get_forecast() { colors get_location curl $(curl https://api.weather.gov/points/$cords | jq -r .properties.forecast) >> ~/.cache/.weather_forecast count=0 length=$(echo $(jq '.properties.periods | length' ~/.cache/.weather_forecast) -1 | bc) while [ $count -le $length ] do echo ---------------------------------------------------------------------------------------------------- echo -e ${GREEN}Day: ${NOCOLOR}$(jq '.properties.periods['$count'].name' ~/.cache/.weather_forecast) echo -e ${GREEN}Temperature: ${NOCOLOR}$(jq '.properties.periods['$count'].temperature' ~/.cache/.weather_forecast)$(jq '.properties.periods['$count'].temperatureUnit' ~/.cache/.weather_forecast) echo -e ${GREEN}Rain chance: ${NOCOLOR}$(jq '.properties.periods['$count'].probabilityOfPrecipitation.value' ~/.cache/.weather_forecast)% echo -e ${GREEN}Wind: ${NOCOLOR}$(jq '.properties.periods['$count'].windDirection' ~/.cache/.weather_forecast), $(jq '.properties.periods['$count'].windSpeed' ~/.cache/.weather_forecast) echo echo $(jq '.properties.periods['$count'].detailedForecast' ~/.cache/.weather_forecast) echo echo ---------------------------------------------------------------------------------------------------- echo echo ((count++)) done echo "" } help() { echo "nws $version" echo echo " --radar (1,2,3): shows local radar" echo " --spc: shows storm predictions" echo " --retrieve-counties: shows county ids" echo " --ca: shows number of alerts" echo " --gc: shows graphic forecast, uses image viewer set in config" echo " -a: shows alerts" echo " -f: shows local forecast" echo } cleanup radar_choice=$2 case $1 in '--radar') show_radar;; '--spc') show_spc;; '--retrieve-counties') retrieve_counties;; '--ca') count_alerts;; '--gc') get_graphicast;; '-a') show_alerts | sed 's/null//g ; s/"//g' |less -R;; '-f') get_forecast | sed 's/"//g ; s/null/0/g' | less -R;; '-h') help;; '--help') help;; "") help;; esac