#!/bin/bash # client version, calls server for actual API info usage() { cat <] Queries OpenWeatherMapAPI for weather or lat/long options: -c, --coords searches for weather based on COORD_PAIR -z, --zipcode returns the coordinate pair(s) for given zipcode -s, --search returns the coordinate pair(s) for QUERY -u, --units sets the temperature units COORD_PAIR is a string of the format "LAT,LON" QUERY is a city, state or city to search EOF } WORKING_DIR="$HOME/.local/share/weather" WEATHER_FILE="$WORKING_DIR/.env" WEATHER_CALL="ssh spinach@git.keegandeppe.com weather" TIMEOUT=60 # timeout for info print_weather() { # prints the weather # check to see if it is expired check_expiration print "$TEMPERATURE $HUMIDITY in $CITY, $STATE\n" # save before exiting save_info } check_expiration() { # checks if the info is expired get_weather } get_location() { # no search, use IP if [[ -n "$SEARCH" ]] ; then # search echo "$SEARCH" elif [[ -n "$ZIPCODE" ]] ; then # zipcode echo "$ZIPCODE" else # default to IP url="http://ip-api.com/csv/?fields=252" res=$(curl --silent -fL "$url") LAT=$(awk -F , '{print $5}' <<<"$res") LON=$(awk -F , '{print $6}' <<<"$res") CITY=$(awk -F , '{print $3}' <<<"$res") STATE=$(awk -F , '{print $1}' <<<"$res") fi } get_weather() { # calls server for weather based on $LAT, $LONG # only update weather every 30 seconds if [[ "$UNITS" =~ ^[Cc]$ ]] ; then # units set to celsius UNITS="metric" else # imperial UNITS="imperial" fi if [[ -z "$LAT" || -z "$LON" ]] ; then # no lat or lon get_location fi WEATHER=$($WEATHER_CALL "-c $LAT,$LON -u $UNITS") echo "$WEATHER" | gojq '.' TEMPERATURE=$(echo $WEATHER | gojq -r '.main.temp') HUMIDITY=$(echo $WEATHER | gojq -r '.main.humidity') WEATHER_ICON=$(echo $WEATHER | gojq -r '.weather[0].icon') EXPIRATION=$(($(date +%s)+$TIMEOUT)) } save_info() { # saves set env vars to files printf '%s\n' \ "LAT=$LAT" \ "LON=$LON" \ "CITY=$CITY" \ "STATE=$STATE" \ "TEMPERATURE=$TEMPERATURE" \ "TEMPERATURE_ICON=$TEMPERATURE_ICON" \ "HUMIDITY=$HUMIDITY" \ "WEATHER_ICON=$WEATHER_ICON" \ "EXPIRATION=$EXPIRATION" } load_info() { if [[ -e "$ # shifting longform for arg in "$@"; do shift case "$arg" in '--zipcode') set -- "$@" "-z" ;; '--coords') set -- "$@" "-c" ;; '--search') set -- "$@" "-s" ;; '--units') set -- "$@" "-u" ;; *) set -- "$@" "$arg" ;; esac done while getopts "z:c:s:u:h" opt; do case "$opt" in 'u' ) UNITS="$OPTARG" ;; 'z' ) ZIPCODE="$OPTARG" ;; 's' ) SEARCH="$OPTARG" ;; 'h' ) usage exit 0 ;; esac done if [[ -n "$SEARCH" || -n "$ZIPCODE" ]] ; then # perform search get_location fi # print the weather print_weather