]> git.netwichtig.de Git - user/henk/code/ruby/rbot.git/commitdiff
rss plugin: code cleanup. add support for slashdot feeds, with RDF extension and...
authorGiuseppe Bilotta <giuseppe.bilotta@gmail.com>
Sat, 31 Mar 2007 01:30:57 +0000 (01:30 +0000)
committerGiuseppe Bilotta <giuseppe.bilotta@gmail.com>
Sat, 31 Mar 2007 01:30:57 +0000 (01:30 +0000)
data/rbot/plugins/rss.rb

index 68a5271b6921a5e43786be545ea7bb70ce710a41..5873c496a15f5a034893fb099da88c5567125635 100644 (file)
 #\r
 # License:: MIT license\r
 \r
-# require 'rss/parser'\r
-# require 'rss/1.0'\r
-# require 'rss/2.0'\r
-# require 'rss/dublincore'\r
-# # begin\r
-# #   require 'rss/dublincore/2.0'\r
-# # rescue\r
-# #   warning "Unable to load RSS libraries, RSS plugin functionality crippled"\r
-# # end\r
-#\r
-# GB: Let's just go for the simple stuff:\r
-#\r
 require 'rss'\r
 \r
+# Add support for Slashdot namespace in RDF. The code is just an adaptation of\r
+# the DublinCore code.\r
+module ::RSS\r
+\r
+  unless defined?(SLASH_PREFIX)\r
+    SLASH_PREFIX = 'slash'\r
+    SLASH_URI = "http://purl.org/rss/1.0/modules/slash/"\r
+\r
+    RDF.install_ns(SLASH_PREFIX, SLASH_URI)\r
+\r
+    module BaseSlashModel\r
+      def append_features(klass)\r
+        super\r
+\r
+        return if klass.instance_of?(Module)\r
+        SlashModel::ELEMENT_NAME_INFOS.each do |name, plural_name|\r
+          plural = plural_name || "#{name}s"\r
+          full_name = "#{SLASH_PREFIX}_#{name}"\r
+          full_plural_name = "#{SLASH_PREFIX}_#{plural}"\r
+          klass_name = "Slash#{Utils.to_class_name(name)}"\r
+          klass.install_must_call_validator(SLASH_PREFIX, SLASH_URI)\r
+          klass.install_have_children_element(name, SLASH_URI, "*",\r
+                                              full_name, full_plural_name)\r
+          klass.module_eval(<<-EOC, *get_file_and_line_from_caller(0))\r
+          remove_method :#{full_name}\r
+          remove_method :#{full_name}=\r
+          remove_method :set_#{full_name}\r
+\r
+          def #{full_name}\r
+            @#{full_name}.first and @#{full_name}.first.value\r
+          end\r
+\r
+          def #{full_name}=(new_value)\r
+            @#{full_name}[0] = Utils.new_with_value_if_need(#{klass_name}, new_value)\r
+          end\r
+          alias set_#{full_name} #{full_name}=\r
+        EOC\r
+        end\r
+      end\r
+    end\r
+\r
+    module SlashModel\r
+      extend BaseModel\r
+      extend BaseSlashModel\r
+\r
+      TEXT_ELEMENTS = {\r
+      "department" => nil,\r
+      "section" => nil,\r
+      "comments" =>  nil,\r
+      "hit_parade" => nil\r
+      }\r
+\r
+      ELEMENT_NAME_INFOS = SlashModel::TEXT_ELEMENTS.to_a\r
+\r
+      ELEMENTS = TEXT_ELEMENTS.keys\r
+\r
+      ELEMENTS.each do |name, plural_name|\r
+        module_eval(<<-EOC, *get_file_and_line_from_caller(0))\r
+        class Slash#{Utils.to_class_name(name)} < Element\r
+          include RSS10\r
+\r
+          content_setup\r
+\r
+          class << self\r
+            def required_prefix\r
+              SLASH_PREFIX\r
+            end\r
+\r
+            def required_uri\r
+              SLASH_URI\r
+            end\r
+          end\r
+\r
+          @tag_name = #{name.dump}\r
+\r
+          alias_method(:value, :content)\r
+          alias_method(:value=, :content=)\r
+\r
+          def initialize(*args)\r
+            if Utils.element_initialize_arguments?(args)\r
+              super\r
+            else\r
+              super()\r
+              self.content = args[0]\r
+            end\r
+          end\r
+\r
+          def full_name\r
+            tag_name_with_prefix(SLASH_PREFIX)\r
+          end\r
+\r
+          def maker_target(target)\r
+            target.new_#{name}\r
+          end\r
+\r
+          def setup_maker_attributes(#{name})\r
+            #{name}.content = content\r
+          end\r
+        end\r
+      EOC\r
+      end\r
+    end\r
+\r
+    class RDF\r
+      class Item; include SlashModel; end\r
+    end\r
+\r
+    SlashModel::ELEMENTS.each do |name|\r
+      class_name = Utils.to_class_name(name)\r
+      BaseListener.install_class_name(SLASH_URI, name, "Slash#{class_name}")\r
+    end\r
+\r
+    SlashModel::ELEMENTS.collect! {|name| "#{SLASH_PREFIX}_#{name}"}\r
+  end\r
+end\r
+\r
+\r
 class ::RssBlob\r
   attr_accessor :url\r
   attr_accessor :handle\r
@@ -621,28 +726,44 @@ class RSSFeedsPlugin < Plugin
         date += " :: "\r
       end\r
     end\r
+\r
     title = "#{Bold}#{item.title.chomp.riphtml}#{Bold}" if item.title\r
+\r
     desc = item.description.gsub(/\s+/,' ').strip.riphtml if item.description\r
+\r
     link = item.link.chomp if item.link\r
+\r
+    debug item.inspect\r
+    category = item.dc_subject rescue item.category rescue nil\r
+    author = item.dc_creator rescue item.author rescue nil\r
+\r
     line1 = nil\r
     line2 = nil\r
+\r
+    at = ((item.title && item.link) ? ' @ ' : '')\r
     case feed.type\r
     when 'blog'\r
-      line1 = "#{handle}#{date}#{item.category.content} blogged at #{link}"\r
+      abt = category ? "about #{category} " : ""\r
+      line1 = "#{handle}#{date}#{author} blogged #{abt}at #{link}"\r
       line2 = "#{handle}#{title} - #{desc}"\r
     when 'forum'\r
-      line1 = "#{handle}#{date}#{title}#{' @ ' if item.title && item.link}#{link}"\r
+      line1 = "#{handle}#{date}#{title}#{at}#{link}"\r
     when 'wiki'\r
-      line1 = "#{handle}#{date}#{title}#{' @ ' if item.title && item.link}#{link} has been edited by #{item.dc_creator}. #{desc}"\r
+      line1 = "#{handle}#{date}#{title}#{at}#{link} has been edited by #{author}. #{desc}"\r
     when 'gmane'\r
-      line1 = "#{handle}#{date}Message #{title} sent by #{item.dc_creator}. #{desc}"\r
+      line1 = "#{handle}#{date}Message #{title} sent by #{author}. #{desc}"\r
     when 'trac'\r
       line1 = "#{handle}#{date}#{title} @ #{link}"\r
       unless item.title =~ /^Changeset \[(\d+)\]/\r
         line2 = "#{handle}#{date}#{desc}"\r
       end\r
+    when '/.'\r
+      dept = "(from the #{item.slash_department} dept) " rescue nil\r
+      sec = " in section #{item.slash_section}" rescue nil\r
+\r
+      line1 = "#{handle}#{date}#{dept}#{title}#{at}#{link} (posted by #{author}#{sec})"\r
     else\r
-      line1 = "#{handle}#{date}#{title}#{' @ ' if item.title && item.link}#{link}"\r
+      line1 = "#{handle}#{date}#{title}#{at}#{link}"\r
     end\r
     places.each { |loc|\r
       @bot.say loc, line1, :overlong => :truncate\r