aboutsummaryrefslogtreecommitdiff
path: root/widgets/weather.lua
diff options
context:
space:
mode:
authorAdrian C. (anrxc) <anrxc@sysphere.org>2010-03-14 01:55:33 +0100
committerAdrian C. (anrxc) <anrxc@sysphere.org>2010-03-14 01:55:33 +0100
commit237470c8f45190b213e3a173ce6ae1a74b3e11fe (patch)
tree7f53c8144761947d4bde20715bcad34f4be0d6c0 /widgets/weather.lua
parent9a82d4113a8271b7dfc7506f2b07379e3ede89a8 (diff)
downloadvicious-legacy-237470c8f45190b213e3a173ce6ae1a74b3e11fe.tar.xz
API: transform widgets namespace table to a directory
Diffstat (limited to 'widgets/weather.lua')
-rw-r--r--widgets/weather.lua83
1 files changed, 83 insertions, 0 deletions
diff --git a/widgets/weather.lua b/widgets/weather.lua
new file mode 100644
index 0000000..effa138
--- /dev/null
+++ b/widgets/weather.lua
@@ -0,0 +1,83 @@
+---------------------------------------------------
+-- Licensed under the GNU General Public License v2
+-- * (c) 2010, Adrian C. <anrxc@sysphere.org>
+---------------------------------------------------
+
+-- {{{ Grab environment
+local tonumber = tonumber
+local io = { popen = io.popen }
+local setmetatable = setmetatable
+local math = { ceil = math.ceil }
+local string = { match = string.match }
+local helpers = require("vicious.helpers")
+-- }}}
+
+
+-- Weather: provides weather information for a requested station
+module("vicious.widgets.weather")
+
+
+-- {{{ Weather widget type
+local function worker(format, station)
+ -- Default values
+ local weather = {
+ ["{city}"] = "N/A",
+ ["{wind}"] = "N/A",
+ ["{windmph}"] = "N/A",
+ ["{windkmh}"] = "N/A",
+ ["{sky}"] = "N/A",
+ ["{weather}"] = "N/A",
+ ["{tempf}"] = "N/A",
+ ["{tempc}"] = "N/A",
+ ["{humid}"] = "N/A",
+ ["{press}"] = "N/A"
+ }
+
+ -- Get weather forceast by the station ICAO code, from:
+ -- * US National Oceanic and Atmospheric Administration
+ local noaa = "http://weather.noaa.gov/pub/data/observations/metar/decoded/"
+ local f = io.popen("curl --connect-timeout 1 -fsm 3 "..noaa..station..".TXT")
+ local ws = f:read("*all")
+ f:close()
+
+ -- Check if there was a timeout or a problem with the station
+ if ws == nil then return weather end
+
+ 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["{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}"]
+
+ -- Wind speed in km/h if MPH was available
+ if weather["{windmph}"] ~= "N/A" then
+ weather["{windmph}"] = tonumber(weather["{windmph}"])
+ weather["{windkmh}"] = math.ceil(weather["{windmph}"] * 1.6)
+ end -- Temperature in °C if °F was available
+ if weather["{tempf}"] ~= "N/A" then
+ weather["{tempf}"] = tonumber(weather["{tempf}"])
+ weather["{tempc}"] = math.ceil((weather["{tempf}"] - 32) * 5/9)
+ end -- Capitalize some stats so they don't look so out of place
+ if weather["{sky}"] ~= "N/A" then
+ weather["{sky}"] = helpers.capitalize(weather["{sky}"])
+ end
+ if weather["{weather}"] ~= "N/A" then
+ weather["{weather}"] = helpers.capitalize(weather["{weather}"])
+ end
+
+ return weather
+end
+-- }}}
+
+setmetatable(_M, { __call = function(_, ...) return worker(...) end })