]> git.netwichtig.de Git - user/henk/code/ruby/rbot.git/blobdiff - data/rbot/plugins/slashdot.rb
hl2 plugin: handle send errors as well
[user/henk/code/ruby/rbot.git] / data / rbot / plugins / slashdot.rb
index c9e35b9e9592badde10fe4689aa9765e17c55add..71411458e7300565cd1b069d240b1e39ade44953 100644 (file)
@@ -1,3 +1,8 @@
+#-- vim:sw=2:et
+#++
+#
+# :title: Slashdot plugin for rbot
+
 require 'rexml/document'
 
 class SlashdotPlugin < Plugin
@@ -5,6 +10,45 @@ class SlashdotPlugin < Plugin
   def help(plugin, topic="")
     "slashdot search <string> [<max>=4] => search slashdot for <string>, slashdot [<max>=4] => return up to <max> slashdot headlines (use negative max to return that many headlines, but all on one line.)"
   end
+
+  # This method defines a filter for /. pages. It's needed because the generic
+  # summarization grabs a comment, not the actual article.
+  #
+  # This filter relies on Hpricot being available, since REXML isn't too
+  # happy with the /. pages
+  def slashdot_filter(s)
+    return nil unless defined? Hpricot
+    loc = Utils.check_location(s, /slashdot\.org/)
+    return nil unless loc
+    h = Hpricot(s[:text])
+    # If we have no title tag in a head tag, return as this is not
+    # a /. page (it's probably a Slashdot RSS
+    ht = h/"head/title"
+    return nil if ht.empty?
+    title = ht.first.to_html.ircify_html
+    arts = (h/"div.article")
+    return nil if arts.empty?
+    if arts.length > 1
+      tits = []
+      arts.each { |el|
+        artitle = (el/"div.generaltitle").first.to_html.ircify_html
+        tits << artitle
+      }
+      content = tits.join(" | ")
+    else
+      det = (arts.first/"div.details").first.to_html.ircify_html
+      body = (arts.first/"div.body").first.to_html.ircify_html
+      content = [det, body].join(' ')
+    end
+    return {:title => title, :content => content}
+  end
+
+  def initialize
+    super
+    if defined? Hpricot
+      @bot.register_filter(:slashdot, :htmlinfo) { |s| slashdot_filter(s) }
+    end
+  end
   
   def search_slashdot(m, params)
     max = params[:limit].to_i