-# Weather plugin for rbot
+#-- vim:sw=2:et
+#++
#
-# NOAA National Weather Service support by MrChucho (mrchucho@mrchucho.net)
-# Copyright (C) 2006 Ralph M. Churchill
+# :title: Weather plugin for rbot
#
-# Weather Undeground support by Giuseppe "Oblomov" Bilotta <giuseppe.bilotta@gmail.com>
-# Copyright (C) 2006 Giuseppe Bilotta
+# Author:: MrChucho (mrchucho@mrchucho.net): NOAA National Weather Service support
+# Author:: Giuseppe "Oblomov" Bilotta <giuseppe.bilotta@gmail.com>
+#
+# Copyright:: (C) 2006 Ralph M. Churchill
+# Copyright:: (C) 2006-2007 Giuseppe Bilotta
+#
+# License:: GPL v2
-require 'uri'
require 'rexml/document'
# Wraps NOAA National Weather Service information
def wu_station(m, where, units)
begin
- xml = @bot.httputil.get_cached(@wu_station_url % [units, URI.escape(where)])
+ xml = @bot.httputil.get(@wu_station_url % [units, CGI.escape(where)])
case xml
when nil
m.reply "couldn't retrieve weather information, sorry"
def wu_weather(m, where, units)
begin
- xml = @bot.httputil.get_cached(@wu_url % [units, URI.escape(where)])
+ xml = @bot.httputil.get(@wu_url % [units, CGI.escape(where)])
case xml
when nil
m.reply "couldn't retrieve weather information, sorry"
- return
when /City Not Found/
m.reply "no such location found (#{where})"
- return
- when /<table border.*?>(.*?)<\/table>/m
- data = $1
- m.reply wu_weather_filter(data)
+ when /Current<\/a>/
+ data = ""
+ xml.scan(/<table border.*?>(.*?)<\/table>/m).each do |match|
+ data += wu_weather_filter(match.first)
+ end
+ if data.length > 0
+ m.reply data
+ else
+ m.reply "couldn't parse weather data from #{where}"
+ end
when /<a href="\/global\/stations\//
stations = xml.scan(/<a href="\/global\/stations\/(.*?)\.html">/)
m.reply "multiple stations available, use 'weather station <code>' where code is one of " + stations.join(", ")
end
end
- def wu_weather_filter(stuff)
+ def wu_clean(stuff)
txt = stuff
txt.gsub!(/[\n\s]+/,' ')
- data = Hash.new
txt.gsub!(/ /, ' ')
txt.gsub!(/°/, ' ') # degree sign
txt.gsub!(/<\/?b>/,'')
txt.gsub!(/<\/?span[^<>]*?>/,'')
txt.gsub!(/<img\s*[^<>]*?>/,'')
txt.gsub!(/<br\s?\/?>/,'')
+ txt
+ end
+
+ def wu_weather_filter(stuff)
+ txt = wu_clean(stuff)
result = Array.new
if txt.match(/<\/a>\s*Updated:\s*(.*?)\s*Observed at\s*(.*?)\s*<\/td>/)