X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;ds=sidebyside;f=data%2Frbot%2Fplugins%2Frss.rb;h=bfc700d3e90a6738b3282e3f662c89fc1dd5c0f6;hb=783ffa4235330029d661752b1023db635b26f2b3;hp=87f79ec57c240c947d4fd7a95ad789d7aa56eacf;hpb=05852a3188a1811e2f5030c747d5a3add2ecd1c0;p=user%2Fhenk%2Fcode%2Fruby%2Frbot.git diff --git a/data/rbot/plugins/rss.rb b/data/rbot/plugins/rss.rb index 87f79ec5..bfc700d3 100644 --- a/data/rbot/plugins/rss.rb +++ b/data/rbot/plugins/rss.rb @@ -16,7 +16,7 @@ require 'rss' -# Try to load rss/content/2.0 so we can access the data in +# Try to load rss/content/2.0 so we can access the data in # tags. begin require 'rss/content/2.0' @@ -185,7 +185,7 @@ end class ::RssBlob attr_accessor :url, :handle, :type, :refresh_rate, :xml, :title, :items, - :mutex, :watchers, :last_fetched, :http_cache + :mutex, :watchers, :last_fetched, :http_cache, :last_success def initialize(url,handle=nil,type=nil,watchers=[], xml=nil, lf = nil) @url = url @@ -203,6 +203,7 @@ class ::RssBlob @items = nil @mutex = Mutex.new @last_fetched = lf + @last_success = nil sanitize_watchers(watchers) end @@ -277,6 +278,10 @@ class RSSFeedsPlugin < Plugin :default => 300, :validate => Proc.new{|v| v > 30}, :desc => "How many seconds to sleep before checking RSS feeds again") + Config.register Config::IntegerValue.new('rss.announce_timeout', + :default => 0, + :desc => "Don't announce watched feed if these many seconds elapsed since the last successful update") + Config.register Config::BooleanValue.new('rss.show_updated', :default => true, :desc => "Whether feed items for which the description was changed should be shown as new") @@ -288,7 +293,7 @@ class RSSFeedsPlugin < Plugin # Make an 'unique' ID for a given item, based on appropriate bot options # Currently only suppored is bot.config['rss.show_updated']: when false, # only the guid/link is accounted for. - + def make_uid(item) uid = [item.guid! || item.link!] if @bot.config['rss.show_updated'] @@ -888,7 +893,13 @@ class RSSFeedsPlugin < Plugin failures = status[:failures] begin debug "fetching #{feed}" - first_run = !feed.last_fetched + + first_run = !feed.last_success + if (@bot.config['rss.announce_timeout'] > 0 && + (Time.now - feed.last_success > @bot.config['rss.announce_timeout'])) + debug "#{feed} wasn't polled for too long, supressing output" + first_run = true + end oldxml = feed.xml ? feed.xml.dup : nil unless fetchRss(feed, nil, feed.http_cache) failures += 1 @@ -1007,7 +1018,7 @@ class RSSFeedsPlugin < Plugin else date = item.source.updated.content.to_s end - elsif item.respond_to?(:pubDate) + elsif item.respond_to?(:pubDate) if item.pubDate.class <= Time date = item.pubDate.strftime("%Y/%m/%d %H:%M") else @@ -1044,7 +1055,7 @@ class RSSFeedsPlugin < Plugin desc_opt[:limit] = @bot.config['rss.text_max'] desc_opt[:a_href] = :link_out if @bot.config['rss.show_links'] - # We prefer content_encoded here as it tends to provide more html formatting + # We prefer content_encoded here as it tends to provide more html formatting # for use with ircify_html. if item.respond_to?(:content_encoded) && item.content_encoded desc = item.content_encoded.ircify_html(desc_opt) @@ -1126,6 +1137,7 @@ class RSSFeedsPlugin < Plugin end feed.mutex.synchronize do feed.xml = xml + feed.last_success = Time.now end return true end @@ -1134,25 +1146,33 @@ class RSSFeedsPlugin < Plugin return nil unless feed.xml feed.mutex.synchronize do xml = feed.xml - begin - ## do validate parse - rss = RSS::Parser.parse(xml) - debug "parsed and validated #{feed}" - rescue RSS::InvalidRSSError - ## do non validate parse for invalid RSS 1.0 + rss = nil + errors = [] + RSS::AVAILABLE_PARSERS.each do |parser| begin - rss = RSS::Parser.parse(xml, false) - debug "parsed but not validated #{feed}" + ## do validate parse + rss = RSS::Parser.parse(xml, true, true, parser) + debug "parsed and validated #{feed} with #{parser}" + break + rescue RSS::InvalidRSSError + begin + ## do non validate parse for invalid RSS 1.0 + rss = RSS::Parser.parse(xml, false, true, parser) + debug "parsed but not validated #{feed} with #{parser}" + break + rescue RSS::Error => e + errors << [parser, e, "parsing rss stream failed, whoops =("] + end rescue RSS::Error => e - report_problem("parsing rss stream failed, whoops =(", e, m) - return nil + errors << [parser, e, "parsing rss stream failed, oioi"] + rescue => e + errors << [parser, e, "processing error occured, sorry =("] end - rescue RSS::Error => e - report_problem("parsing rss stream failed, oioi", e, m) - return nil - rescue => e - report_problem("processing error occured, sorry =(", e, m) - return nil + end + unless errors.empty? + debug errors + self.send(:report_problem, errors.last[2], errors.last[1], m) + return nil unless rss end items = [] if rss.nil?