]> git.netwichtig.de Git - user/henk/code/ruby/rbot.git/blobdiff - data/rbot/plugins/weather.rb
weather plugin: echo special advisories if present
[user/henk/code/ruby/rbot.git] / data / rbot / plugins / weather.rb
index 47ab1ca259fe4f330a4bb32563b25770f8c689bd..4f89e08d37cf83fbe6d3610547bcd51fffac3b33 100644 (file)
@@ -173,8 +173,9 @@ class WeatherPlugin < Plugin
         m.reply "no such station found (#{where})"
         return
       when /<table border.*?>(.*?)<\/table>/m
-        data = $1
+        data = $1.dup
         m.reply wu_weather_filter(data)
+        wu_out_special(m, xml)
       else
         debug xml
         m.reply "something went wrong with the data for #{where}..."
@@ -192,7 +193,7 @@ class WeatherPlugin < Plugin
         m.reply "couldn't retrieve weather information, sorry"
       when /City Not Found/
         m.reply "no such location found (#{where})"
-      when /<table/
+      when /Current<\/a>/
         data = ""
         xml.scan(/<table border.*?>(.*?)<\/table>/m).each do |match|
           data += wu_weather_filter(match.first)
@@ -202,9 +203,9 @@ class WeatherPlugin < Plugin
         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(", ")
+        wu_out_special(m, xml)
+      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}..."
@@ -214,16 +215,68 @@ 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)
+    # debug xml
+    stations = xml.scan(/<td>\s*(?:<a href="([^?"]+\?feature=[^"]+)"\s*[^>]*><img [^>]+><\/a>\s*)?<a href="\/(?:global\/stations|US\/(\w\w))\/([^"]*?)\.html">(.*?)<\/a>\s*:\s*(.*?)<\/td>/m)
+    # debug stations
+    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|
+      warning = ar[0]
+      loc = ar[2]
+      state = ar[1]
+      par = ar[3]
+      w = ar[4]
+      if state # US station
+        (warning ? "*" : "") + ("%s, %s (%s): %s" % [loc, state, par, wu_clean(w)])
+      else # non-US station
+        (warning ? "*" : "") + ("station %s (%s): %s" % [loc, par, wu_clean(w)])
+      end
+    }
+    m.reply stations.join("; ")
+  end
+
+  def wu_check_special(xml)
+    if spec_match = xml.match(%r{<a href="([^"]+\?[^"]*feature=warning[^"]+)"[^>]*>([^<]+)</a>})
+      special = {
+        :url => "http://mobile.wunderground.com"+$1,
+        :special => $2.dup
+      }
+      spec_xml = @bot.httputil.get(special[:url])
+      if spec_xml and spec_td = spec_xml.match(/<tr>\s*<td align="left">\s*(.*?)\s*<\/td>\s*<\/tr>\s*<\/table>/m)
+        return special.merge(:text => $1.ircify_html)
+      else
+        return special
+      end
+    else
+      return nil
+    end
+  end
+
+  def wu_out_special(m, xml)
+    special = wu_check_special(xml).merge(:underline => Underline)
+    if special
+      if special[:text]
+        m.reply("%{underline}%{special}%{underline}: %{text}" % special)
+      else
+        m.reply("%{underline}%{special}%{underline} @ %{url}" % special)
+      end
+    end
+  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>/)