]> git.netwichtig.de Git - user/henk/code/ruby/rbot.git/blobdiff - data/rbot/plugins/rss.rb
rss plugin: all watchers are now informed of feed updates when anybody asks for the...
[user/henk/code/ruby/rbot.git] / data / rbot / plugins / rss.rb
index e0d4df01747b4b6ccf77049133c62d9d22f20e0b..094b4571bf6b5ca56e28bae4e6cddf653d8807b5 100644 (file)
@@ -230,11 +230,11 @@ end
 \r
 class RSSFeedsPlugin < Plugin\r
   BotConfig.register BotConfigIntegerValue.new('rss.head_max',\r
-    :default => 30, :validate => Proc.new{|v| v > 0 && v < 200},\r
+    :default => 100, :validate => Proc.new{|v| v > 0 && v < 200},\r
     :desc => "How many characters to use of a RSS item header")\r
 \r
   BotConfig.register BotConfigIntegerValue.new('rss.text_max',\r
-    :default => 90, :validate => Proc.new{|v| v > 0 && v < 400},\r
+    :default => 200, :validate => Proc.new{|v| v > 0 && v < 400},\r
     :desc => "How many characters to use of a RSS item text")\r
 \r
   BotConfig.register BotConfigIntegerValue.new('rss.thread_sleep',\r
@@ -414,7 +414,25 @@ class RSSFeedsPlugin < Plugin
 \r
     m.reply "lemme fetch it..."\r
     title = items = nil\r
-    fetched = fetchRss(feed, m, false)\r
+    we_were_watching = false\r
+\r
+    if @watch.key?(feed.handle)\r
+      # If a feed is being watched, we run the watcher thread\r
+      # so that all watchers can be informed of changes to\r
+      # the feed. Before we do that, though, we remove the\r
+      # show requester from the watchlist, if present, lest\r
+      # he gets the update twice.\r
+      if feed.watched_by?(m.replyto)\r
+        we_were_watching = true\r
+        feed.rm_watch(m.replyto)\r
+      end\r
+      @bot.timer.reschedule(@watch[feed.handle], 0)\r
+      if we_were_watching\r
+        feed.add_watch(m.replyto)\r
+      end\r
+    else\r
+      fetched = fetchRss(feed, m, false)\r
+    end\r
     return unless fetched or feed.xml\r
     if not fetched and feed.items\r
       m.reply "using old data"\r
@@ -575,6 +593,7 @@ class RSSFeedsPlugin < Plugin
 \r
   def del_rss(m, params, pass=false)\r
     feed = unwatch_rss(m, params, true)\r
+    return unless feed\r
     if feed.watched?\r
       m.reply "someone else is watching #{feed.handle}, I won't remove it from my list"\r
       return\r
@@ -715,7 +734,7 @@ class RSSFeedsPlugin < Plugin
                   else\r
                     debug "accepting new #{uid} #{item.inspect}"\r
                     debug [uid, txt].inspect\r
-                    warn "same text! #{txt}" if otxt.include?(txt)\r
+                    warning "same text! #{txt}" if otxt.include?(txt)\r
                     false\r
                   end\r
                 }\r
@@ -778,9 +797,9 @@ class RSSFeedsPlugin < Plugin
       end\r
     end\r
 \r
-    title = "#{Bold}#{item.title.ircify_html}#{Bold}" if item.title\r
+    title = "#{Bold}#{item.title.ircify_html :limit => @bot.config['rss.head_max']}#{Bold}" if item.title\r
 \r
-    desc = item.description.ircify_html(:a_href => :link_out) if item.description\r
+    desc = item.description.ircify_html(:limit => @bot.config['rss.text_max'], :a_href => :link_out) if item.description\r
 \r
     link = item.link.chomp if item.link\r
 \r
@@ -945,6 +964,9 @@ plugin.map 'rss replace :handle :url :type',
 plugin.map 'rss forcereplace :handle :url :type',\r
   :action => 'forcereplace_rss',\r
   :defaults => {:type => nil}\r
+plugin.map 'rss watch :handle [in :chan]',\r
+  :action => 'watch_rss',\r
+  :defaults => {:url => nil, :type => nil}\r
 plugin.map 'rss watch :handle :url :type [in :chan]',\r
   :action => 'watch_rss',\r
   :defaults => {:url => nil, :type => nil}\r