summaryrefslogtreecommitdiff
path: root/data/rbot/plugins/slashdot.rb
diff options
context:
space:
mode:
Diffstat (limited to 'data/rbot/plugins/slashdot.rb')
-rw-r--r--data/rbot/plugins/slashdot.rb95
1 files changed, 95 insertions, 0 deletions
diff --git a/data/rbot/plugins/slashdot.rb b/data/rbot/plugins/slashdot.rb
new file mode 100644
index 00000000..b09ac7a7
--- /dev/null
+++ b/data/rbot/plugins/slashdot.rb
@@ -0,0 +1,95 @@
+require 'rexml/document'
+require 'uri/common'
+
+class SlashdotPlugin < Plugin
+ include REXML
+ 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
+ def privmsg(m)
+ if m.params && m.params =~ /^search\s+(.*)\s+(\d+)$/
+ search = $1
+ limit = $2.to_i
+ search_slashdot m, search, limit
+ elsif m.params && m.params =~ /^search\s+(.*)$/
+ search = $1
+ search_slashdot m, search
+ elsif m.params && m.params =~ /^([-\d]+)$/
+ limit = $1.to_i
+ slashdot m, limit
+ else
+ slashdot m
+ end
+ end
+
+ def search_slashdot(m, search, max=4)
+ begin
+ xml = @bot.httputil.get(URI.parse("http://slashdot.org/search.pl?content_type=rss&query=#{URI.escape(search)}"))
+ rescue URI::InvalidURIError, URI::BadURIError => e
+ m.reply "illegal search string #{search}"
+ return
+ end
+ unless xml
+ m.reply "search for #{search} failed"
+ return
+ end
+ begin
+ doc = Document.new xml
+ rescue REXML::ParseException => e
+ puts e
+ m.reply "couldn't parse output XML: #{e.class}"
+ return
+ end
+ unless doc
+ m.reply "search for #{search} failed"
+ return
+ end
+ max = 8 if max > 8
+ done = 0
+ doc.elements.each("*/item") {|e|
+ desc = e.elements["title"].text
+ desc.gsub!(/(.{150}).*/, '\1..')
+ reply = sprintf("%s | %s", e.elements["link"].text, desc)
+ m.reply reply
+ done += 1
+ break if done >= max
+ }
+ end
+
+ def slashdot(m, max=4)
+ xml = @bot.httputil.get(URI.parse("http://slashdot.org/slashdot.xml"))
+ unless xml
+ m.reply "slashdot news parse failed"
+ return
+ end
+ doc = Document.new xml
+ unless doc
+ m.reply "slashdot news parse failed (invalid xml)"
+ return
+ end
+ done = 0
+ oneline = false
+ if max < 0
+ max = (0 - max)
+ oneline = true
+ end
+ max = 8 if max > 8
+ matches = Array.new
+ doc.elements.each("*/story") {|e|
+ matches << [ e.elements["title"].text,
+ e.elements["author"].text,
+ e.elements["time"].text.gsub(/\d{4}-(\d{2})-(\d{2})/, "\\2/\\1").gsub(/:\d\d$/, "") ]
+ done += 1
+ break if done >= max
+ }
+ if oneline
+ m.reply matches.collect{|mat| mat[0]}.join(" | ")
+ else
+ matches.each {|mat|
+ m.reply sprintf("%36s | %8s | %8s", mat[0][0,36], mat[1][0,8], mat[2])
+ }
+ end
+ end
+end
+plugin = SlashdotPlugin.new
+plugin.register("slashdot")