X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=data%2Frbot%2Fplugins%2Fweather.rb;h=5da949e4d8787e6532ad3dd91bbd67451d0cfea2;hb=7a128ab6457c9b79ed31a5562be98e1718bfaf80;hp=da6a2116a57548525d7799f1e808c0b162845c6d;hpb=a7c40c145f5be6c7c99752bb0af93c0735971694;p=user%2Fhenk%2Fcode%2Fruby%2Frbot.git diff --git a/data/rbot/plugins/weather.rb b/data/rbot/plugins/weather.rb index da6a2116..5da949e4 100644 --- a/data/rbot/plugins/weather.rb +++ b/data/rbot/plugins/weather.rb @@ -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 @@ -164,7 +168,7 @@ class WeatherPlugin < Plugin def wu_station(m, where, units) begin - xml = @bot.httputil.get(@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" @@ -173,8 +177,9 @@ class WeatherPlugin < Plugin m.reply "no such station found (#{where})" return when /(.*?)<\/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}..." @@ -186,20 +191,25 @@ class WeatherPlugin < Plugin def wu_weather(m, where, units) begin - xml = @bot.httputil.get(@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>/m - data = $1 - m.reply wu_weather_filter(data) - when //) - m.reply "multiple stations available, use 'weather station ' where code is one of " + stations.join(", ") + when /Current<\/a>/ + data = "" + xml.scan(/
(.*?)<\/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 + wu_out_special(m, xml) + when //,'') txt.gsub!(/<\/?span[^<>]*?>/,'') txt.gsub!(/]*?>/,'') txt.gsub!(//,'') + txt + end + + def wu_weather_multi(m, xml) + # debug xml + stations = xml.scan(/\\s+\\s+
\s*(?:]*>]+><\/a>\s*)?(.*?)<\/a>\s*:\s*(.*?)<\/td>/m) + # debug stations + m.reply "multiple stations available, use 'weather station ' or 'weather ' 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{]*>([^<]+)}) do + special = { + :url => "http://mobile.wunderground.com"+$1, + :type => $2.dup, + :special => $3.dup + } + spec_rx = Regexp.new("(?:.+?)\\s+(.+?)\\s+
", 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) result = Array.new if txt.match(/<\/a>\s*Updated:\s*(.*?)\s*Observed at\s*(.*?)\s*<\/td>/)