]> git.netwichtig.de Git - user/henk/code/ruby/rbot.git/blobdiff - data/rbot/plugins/weather.rb
spotify: fail on load if Spotify module is not available
[user/henk/code/ruby/rbot.git] / data / rbot / plugins / weather.rb
index ff5f053757562e5c9db84f031c89860265b83b4b..cb0a2b186a955bdb61a5861c8ef30a8f71c35c45 100644 (file)
@@ -35,9 +35,9 @@ class CurrentConditions
             end
         rescue OpenURI::HTTPError => e
             case e
-            when /304/:
+            when /304/
                 @iscached = true
-            when /404/:
+            when /404/
                 raise "Data for #{@station} not found"
             else
                 raise "Error retrieving data: #{e}"
@@ -67,18 +67,22 @@ 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
     when "nws"
       "weather nws <station> => display the current conditions at the location specified by the NOAA National Weather Service station code <station> ( lookup your station code at http://www.nws.noaa.gov/data/current_obs/ )"
     when "station", "wu"
-      "weather [<units>] <location> => display the current conditions at the location specified, looking it up on the Weather Underground site; you can use 'station <code>' to look up data by station code ( lookup your station code at http://www.weatherunderground.com/ ); you can optionally set <units>  to 'metric' or 'english' if you only want data with the units; use 'both' for units to go back to having both." 
+      "weather [<units>] <location> => display the current conditions at the location specified, looking it up on the Weather Underground site; you can use 'station <code>' to look up data by station code ( lookup your station code at http://www.weatherunderground.com/ ); you can optionally set <units>  to 'metric' or 'english' if you only want data with the units; use 'both' for units to go back to having both."
     else
       "weather information lookup. Looks up weather information for the last location you specified. See topics 'nws' and 'wu' for more information"
     end
   end
-  
+
   def initialize
     super
 
@@ -87,7 +91,7 @@ class WeatherPlugin < Plugin
     @wu_url         = "http://mobile.wunderground.com/cgi-bin/findweather/getForecast?brand=mobile%s&query=%s"
     @wu_station_url = "http://mobile.wunderground.com/auto/mobile%s/global/stations/%s.html"
   end
-  
+
   def weather(m, params)
     if params[:where].empty?
       if @registry.has_key?(m.sourcenick)
@@ -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,6 +207,7 @@ class WeatherPlugin < Plugin
         else
           m.reply "couldn't parse weather data from #{where}"
         end
+        wu_out_special(m, xml)
       when /<a href="\/(?:global\/stations|US\/\w\w)\//
         wu_weather_multi(m, xml)
       else
@@ -245,6 +251,39 @@ class WeatherPlugin < Plugin
     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)