]> git.netwichtig.de Git - user/henk/code/ruby/rbot.git/blobdiff - data/rbot/plugins/weather.rb
grouphug: refactor confession retrieval
[user/henk/code/ruby/rbot.git] / data / rbot / plugins / weather.rb
index 4f89e08d37cf83fbe6d3610547bcd51fffac3b33..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
@@ -248,25 +252,30 @@ class WeatherPlugin < Plugin
   end
 
   def wu_check_special(xml)
-    if spec_match = xml.match(%r{<a href="([^"]+\?[^"]*feature=warning[^"]+)"[^>]*>([^<]+)</a>})
+    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,
-        :special => $2.dup
+        :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(/<tr>\s*<td align="left">\s*(.*?)\s*<\/td>\s*<\/tr>\s*<\/table>/m)
-        return special.merge(:text => $1.ircify_html)
-      else
-        return special
+      if spec_xml and spec_td = spec_xml.match(spec_rx)
+        special.merge!(:text => spec_td.captures.first.ircify_html)
       end
-    else
-      return nil
+      specials << special
     end
+    return specials
   end
 
   def wu_out_special(m, xml)
-    special = wu_check_special(xml).merge(:underline => Underline)
-    if special
+    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