diff options
Diffstat (limited to 'weather.lua')
-rw-r--r-- | weather.lua | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/weather.lua b/weather.lua new file mode 100644 index 0000000..30224b6 --- /dev/null +++ b/weather.lua @@ -0,0 +1,66 @@ +---------------------------------------------------------- +-- Licensed under the GNU General Public License version 2 +-- * Copyright (C) 2009 Adrian C. <anrxc_sysphere_org> +---------------------------------------------------------- + +-- {{{ Grab environment +local io = { popen = io.popen } +local string = { match = string.match } +-- }}} + + +-- Weather: provides weather information for a requested station +module("vicious.weather") + + +-- {{{ Weather widget type +function worker(format, station) + -- US National Oceanic and Atmospheric Administration + -- * Station codes: http://www.rap.ucar.edu/weather/surface/stations.txt + local noaa = "http://weather.noaa.gov/pub/data/observations/metar/decoded/" + + -- Get info from a weather station + local f = io.popen("wget --timeout=5 -o /dev/null -O - "..noaa..station..".TXT") + local ws = f:read("*all") + f:close() + + -- Setup tables + local weather = { + ["{city}"] = "N/A", + ["{wind}"] = "N/A", + ["{windmph}"] = "N/A", + ["{sky}"] = "N/A", + ["{weather}"] = "N/A", + ["{tempf}"] = "N/A", + ["{tempc}"] = "N/A", + ["{humid}"] = "N/A", + ["{press}"] = "N/A" + } + + -- Check if there was a timeout or a problem with the station + if ws == nil then + return weather + else + weather["{city}"] = -- City and/or area + string.match(ws, "^(.+)%,.*%([%u]+%)") or weather["{city}"] + weather["{wind}"] = -- Wind direction and degrees if available + string.match(ws, "Wind:[%s][%a]+[%s][%a]+[%s](.+)[%s]at.+$") or weather["{wind}"] + weather["{windmph}"] = -- Wind speed in MPH if available + string.match(ws, "Wind:[%s].+[%s]at[%s]([%d]+)[%s]MPH") or weather["{windmph}"] + weather["{sky}"] = -- Sky conditions if available + string.match(ws, "Sky[%s]conditions:[%s](.-)[%c]") or weather["{sky}"] + weather["{weather}"] = -- Weather conditions if available + string.match(ws, "Weather:[%s](.-)[%c]") or weather["{weather}"] + weather["{tempf}"] = -- Temperature in fahrenheit + string.match(ws, "Temperature:[%s]([%d%.]+).*[%c]") or weather["{tempf}"] + weather["{tempc}"] = -- Temperature in celsius + string.match(ws, "Temperature:[%s][%d%.]+[%s]F[%s]%(([%d%.]+)[%s]C%)[%c]") or weather["{tempc}"] + weather["{humid}"] = -- Relative humidity in percent + string.match(ws, "Relative[%s]Humidity:[%s]([%d]+)%%") or weather["{humid}"] + weather["{press}"] = -- Pressure in hPa + string.match(ws, "Pressure[%s].+%((.+)[%s]hPa%)") or weather["{press}"] + end + + return weather +end +-- }}} |