add international support for weather module

It uses [wttr.in](https://github.com/chubin/wttr.in) to get the weather information and the current city based on the IP address
This commit is contained in:
Hugo Licon 2020-07-05 18:22:47 -06:00
parent 60c2017fb0
commit 107d7ab440

View file

@ -3,79 +3,29 @@
fahrenheit=$1 fahrenheit=$1
load_request_params()
{
city=$(curl -s https://ipinfo.io/city 2> /dev/null)
region=$(curl -s https://ipinfo.io/region 2> /dev/null)
zip=$(curl -s https://ipinfo.io/postal 2> /dev/null | tail -1)
country_w_code=$(curl -w "\n%{http_code}\n" -s https://ipinfo.io/country 2> /dev/null)
country=`grep -Eo [a-zA-Z]+ <<< "$country_w_code"`
exit_code=`grep -Eo [0-9]{3} <<< "$country_w_code"`
region_code_url=http://www.ip2country.net/ip2country/region_code.html
weather_url=https://forecast.weather.gov/zipcity.php
}
#substitute region code for regions in north america
get_region_code()
{
curl -s $region_code_url | grep $region &> /dev/null && region=$(curl -s $region_code_url | grep $region | cut -d ',' -f 2)
echo $region
}
weather_information() weather_information()
{ {
curl -sL $weather_url?inputstring=$zip | grep myforecast-current | grep -Eo '>.*<' | sed -E 's/>(.*)</\1/' display_weather=$1
# it gets the weather condition (%c), the temperature (%t), and the location (%l)
curl -sL curl wttr.in\?format="+%c+%t+%l$display_weather"
} }
get_temp()
{
if $fahrenheit; then
echo $(weather_information | grep 'deg;F' | cut -d '&' -f 1)
else
echo $(( ($(weather_information | grep 'deg;F' | cut -d '&' -f 1) - 32) * 5 / 9 ))
fi
}
forecast_unicode()
{
forecast=$(weather_information | head -n 1)
if [[ $forecast =~ 'Snow' ]]; then #get weather display
echo '❄ '
elif [[ (($forecast =~ 'Rain') || ($forecast =~ 'Shower')) ]]; then
echo '☂ '
elif [[ (($forecast =~ 'Overcast') || ($forecast =~ 'Cloud')) ]]; then
echo '☁ '
elif [[ $forecast = 'NA' ]]; then
echo ''
else
echo '☀ '
fi
}
#get weather display if in US
display_weather() display_weather()
{ {
if [ $country = 'US' ]; then if $fahrenheit; then
echo "$(forecast_unicode)$(get_temp)° " display_weather='&u' # for USA system
else else
echo '' display_weather='&m' # for metric system
fi fi
echo $(weather_information $display_weather)
} }
main() main()
{ {
# don't run the rest of the script unless we can safely get all the information
load_request_params
if [[ $exit_code -eq 429 ]]; then
echo "Request Limit Reached"
exit
fi
# process should be cancelled when session is killed # process should be cancelled when session is killed
if ping -q -c 1 -W 1 ipinfo.io &>/dev/null; then if ping -q -c 1 -W 1 ipinfo.io &>/dev/null; then
echo "$(display_weather)$city, $(get_region_code)" echo "$(display_weather)"
else else
echo "Location Unavailable" echo "Location Unavailable"
fi fi