]> git.netwichtig.de Git - user/henk/code/ruby/rbot.git/blobdiff - data/rbot/plugins/rss.rb
plugins/keywords: add method that was missing from commit 7cac523563de6473d2f93fd2d05 ...
[user/henk/code/ruby/rbot.git] / data / rbot / plugins / rss.rb
index dd35978168cbf7ae328c64cbd71185f226ab4786..1d141f3b10dff1e4ecd521630ae0ae58fd90d400 100644 (file)
@@ -288,7 +288,8 @@ class RSSFeedsPlugin < Plugin
   # running substitutions against DataStream _s_ optionally joined
   # with hash _h_
   def make_stream(line1, line2, s, h={})
-    DataStream.new([line1, line2].compact.join("\n") % s.merge(h))
+    ss = s.merge(h)
+    DataStream.new([line1, line2].compact.join("\n") % ss, ss)
   end
 
   # Define default RSS filters
@@ -354,6 +355,34 @@ class RSSFeedsPlugin < Plugin
       line1 << " (by %{author})" if s[:author]
       make_stream(line1, nil, s)
     }
+
+    # Define an HTML info filter too
+    @bot.register_filter(:rss, :htmlinfo) { |s| htmlinfo_filter(s) }
+
+    # This is the output format used by the input filter
+    @bot.register_filter(:htmlinfo, @outkey) { |s|
+      line1 = "%{title}%{at}%{link}"
+      make_stream(line1, nil, s)
+    }
+  end
+
+  FEED_NS = %r{xmlns.*http://(purl\.org/rss|www.w3c.org/1999/02/22-rdf)}
+  def htmlinfo_filter(s)
+    return nil unless s[:headers] and s[:headers]['x-rbot-location']
+    return nil unless s[:headers]['content-type'].first.match(/xml|rss|atom|rdf/i) or
+      (s[:text].include?("<rdf:RDF") and s[:text].include?("<channel")) or
+      s[:text].include?("<rss") or s[:text].include?("<feed") or
+      s[:text].match(FEED_NS)
+    blob = RssBlob.new(s[:headers]['x-rbot-location'],"", :htmlinfo)
+    unless (fetchRss(blob, nil) and parseRss(blob, nil) rescue nil)
+      debug "#{s.pretty_inspect} is not an RSS feed, despite the appearances"
+      return nil
+    end
+    output = []
+    blob.items.each { |it|
+      output << printFormattedRss(blob, it)[:text]
+    }
+    return {:title => blob.title, :content => output.join(" | ")}
   end
 
   # Display the known rss types
@@ -774,7 +803,7 @@ class RSSFeedsPlugin < Plugin
     if params and handle = params[:handle]
       feed = @feeds.fetch(handle.downcase, nil)
       if feed
-        @bot.timer.reschedule(@watch[feed.handle], 0)
+        @bot.timer.reschedule(@watch[feed.handle], (params[:delay] || 0).to_f)
         m.okay if m
       else
         m.reply _("no such feed %{handle}") % { :handle => handle } if m
@@ -916,7 +945,7 @@ class RSSFeedsPlugin < Plugin
   def printFormattedRss(feed, item, opts=nil)
     debug item
     places = feed.watchers
-    handle = "::#{feed.handle}:: "
+    handle = feed.handle.empty? ? "" : "::#{feed.handle}:: "
     date = String.new
     if opts
       places = opts[:places] if opts.key?(:places)
@@ -1007,6 +1036,8 @@ class RSSFeedsPlugin < Plugin
                          :title => title, :desc => desc, :link => link,
                          :category => category, :author => author, :at => at)
 
+    return output if places.empty?
+
     places.each { |loc|
       output.to_s.each_line { |line|
         @bot.say loc, line, :overlong => :truncate
@@ -1159,7 +1190,7 @@ plugin.map 'rss unwatch :handle [in :chan]',
   :action => 'unwatch_rss'
 plugin.map 'rss rmwatch :handle [in :chan]',
   :action => 'unwatch_rss'
-plugin.map 'rss rewatch [:handle]',
+plugin.map 'rss rewatch [:handle] [:delay]',
   :action => 'rewatch_rss'
 plugin.map 'rss types',
   :action => 'rss_types'