+
+ def wu_weather(m, where, units)
+ begin
+ xml = @bot.httputil.get(@wu_url % [units, CGI.escape(where)])
+ case xml
+ when nil
+ m.reply "couldn't retrieve weather information, sorry"
+ when /City Not Found/
+ m.reply "no such location found (#{where})"
+ 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|US\/\w\w)\//
+ wu_weather_multi(m, xml)
+ else
+ debug xml
+ m.reply "something went wrong with the data from #{where}..."
+ end
+ rescue => e
+ m.reply "retrieving info about '#{where}' failed (#{e})"
+ end
+ end
+
+ def wu_clean(stuff)
+ txt = stuff
+ txt.gsub!(/[\n\s]+/,' ')
+ 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_multi(m, xml)
+ stations = xml.scan(/<td>\s*<a href="\/(?:global\/stations|US\/(\w\w))\/(.*?)\.html">(.*?)<\/a>\s*:\s*(.*?)<\/td>/m)
+ m.reply "multiple stations available, use 'weather station <code>' or 'weather <city, state>' as appropriate, for one of the following (current temp shown):"
+ stations.map! { |ar|
+ if ar.first # US state
+ "%s, %s (%s): %s" % [ar[1], ar[0], ar[2], wu_clean(ar[3])]
+ else # non-US station
+ "station %s (%s): %s" % [ar[1], ar[2], wu_clean(ar[3])]
+ end
+ }
+ m.reply stations.join("; ")
+ 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>/)
+ result << ("Weather info for %s (updated on %s)" % [$2, $1])
+ end
+ txt.scan(/<tr>\s*<td>\s*(.*?)\s*<\/td>\s*<td>\s*(.*?)\s*<\/td>\s*<\/tr>/) { |k, v|
+ next if v.empty?
+ next if ["-", "- approx.", "N/A", "N/A approx."].include?(v)
+ next if k == "Raw METAR"
+ result << ("%s: %s" % [k, v])
+ }
+ return result.join('; ')
+ end