]> git.netwichtig.de Git - user/henk/code/ruby/rbot.git/blobdiff - data/rbot/plugins/weather.rb
wheelfortune: it's chan, not p[:chan]
[user/henk/code/ruby/rbot.git] / data / rbot / plugins / weather.rb
index 07584d883f7f7a45381ce84630e6b21664f64f75..b58354471e302101fe349c51d4b5622b2dc3f100 100644 (file)
@@ -1,12 +1,16 @@
-# 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
@@ -160,7 +164,7 @@ class WeatherPlugin < Plugin
 
   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"
@@ -182,20 +186,24 @@ class WeatherPlugin < Plugin
 
   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 /<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(", ")
+      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}..."
@@ -205,16 +213,33 @@ class WeatherPlugin < Plugin
     end
   end
 
-  def wu_weather_filter(stuff)
+  def wu_clean(stuff)
     txt = stuff
     txt.gsub!(/[\n\s]+/,' ')
-    data = Hash.new
     txt.gsub!(/&nbsp;/, ' ')
     txt.gsub!(/&#176;/, ' ') # 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>/)