]> git.netwichtig.de Git - user/henk/code/ruby/rbot.git/blobdiff - data/rbot/plugins/weather.rb
script plugin: store channels as strings
[user/henk/code/ruby/rbot.git] / data / rbot / plugins / weather.rb
index c241daa832f0e8a97f7fd317592478006aca8c0a..5da949e4d8787e6532ad3dd91bbd67451d0cfea2 100644 (file)
@@ -67,6 +67,10 @@ private
 end
 
 class WeatherPlugin < Plugin
+
+  Config.register Config::BooleanValue.new('weather.advisory',
+    :default => true,
+    :desc => "Should the bot report special weather advisories when any is present?")
   
   def help(plugin, topic="")
     case topic
@@ -173,8 +177,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}..."
@@ -202,9 +207,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}..."
@@ -226,6 +231,59 @@ class WeatherPlugin < Plugin
     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)
+    specials = []
+    # We only scan the first half to prevent getting the advisories twice
+    xml[0,xml.length/2].scan(%r{<a href="([^"]+\?[^"]*feature=warning#([^"]+))"[^>]*>([^<]+)</a>}) do
+      special = {
+        :url => "http://mobile.wunderground.com"+$1,
+        :type => $2.dup,
+        :special => $3.dup
+      }
+      spec_rx = Regexp.new("<a name=\"#{special[:type]}\">(?:.+?)<td align=\"left\">\\s+(.+?)\\s+</td>\\s+</tr>\\s+</table>", Regexp::MULTILINE)
+      spec_xml = @bot.httputil.get(special[:url])
+      if spec_xml and spec_td = spec_xml.match(spec_rx)
+        special.merge!(:text => spec_td.captures.first.ircify_html)
+      end
+      specials << special
+    end
+    return specials
+  end
+
+  def wu_out_special(m, xml)
+    return unless @bot.config['weather.advisory']
+    specials = wu_check_special(xml)
+    debug specials
+    specials.each do |special|
+      special.merge!(:underline => Underline)
+      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)