80 lines
3.2 KiB
Lua
80 lines
3.2 KiB
Lua
----------------------------------------------------------
|
|
-- 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 setmetatable = setmetatable
|
|
local math = { floor = math.floor }
|
|
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("curl --max-time 3 -f -s "..noaa..station..".TXT")
|
|
local ws = f:read("*all")
|
|
f:close()
|
|
|
|
-- Setup tables
|
|
local weather = {
|
|
-- Some of the weather symbols would look nice if prepended to
|
|
-- the final output, but it is up to the user to do that
|
|
-- * http://www.alanwood.net/unicode/miscellaneous_symbols.html
|
|
["{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"
|
|
}
|
|
|
|
-- 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}"]
|
|
|
|
-- Wind speed in KMH if MPH was available
|
|
if weather["{windmph}"] ~= "N/A" then
|
|
weather["{windkmh}"] = math.floor(weather["{windmph}"] * 1.6)
|
|
end
|
|
end
|
|
|
|
return weather
|
|
end
|
|
-- }}}
|
|
|
|
setmetatable(_M, { __call = function(_, ...) return worker(...) end })
|