summaryrefslogtreecommitdiff
path: root/data/rbot/plugins/bash.rb
diff options
context:
space:
mode:
Diffstat (limited to 'data/rbot/plugins/bash.rb')
-rw-r--r--data/rbot/plugins/bash.rb149
1 files changed, 117 insertions, 32 deletions
diff --git a/data/rbot/plugins/bash.rb b/data/rbot/plugins/bash.rb
index 2a5bedad..520346be 100644
--- a/data/rbot/plugins/bash.rb
+++ b/data/rbot/plugins/bash.rb
@@ -1,37 +1,118 @@
-# bash.org xml plugin for rbot
-# by Robin Kearney (robin@riviera.org.uk)
+#-- vim:sw=2:et
+#++
#
-# its a bit of a quick hack, but it works for us :)
+# :title: bash.org quote retrieval
#
+# Author:: Robin Kearney <robin@riviera.org.uk>
+# Author:: cs
+# Author:: Giuseppe "Oblomov" Bilotta <giuseppe.bilotta@gmail.com>
+#
+# Copyright:: (C) 2005 Robin Kearney
+# Copyright:: (C) 2007 cs, Giuseppe Bilotta
+#
+# License:: public domain
+#
+# TODO improve output of quote
+# TODO show more than one quote
+# TODO allow selection of only quotes with vote > 0
+
require 'rexml/document'
require 'uri/common'
+class ::BashQuote
+ attr_accessor :num, :text, :vote
+
+ def initialize(num, text, vote)
+ @num = num.to_i
+ @text = text
+ @vote = vote
+ end
+
+ def url
+ "http://www.bash.org/?#{@num}"
+ end
+
+end
+
class BashPlugin < Plugin
+
+ BotConfig.register BotConfigEnumValue.new('bash.access',
+ :values => ['xml', 'html'], :default => 'html',
+ :desc => "Which method the bot should use to access bash.org quotes: xml files or standard webpages")
+
include REXML
def help(plugin, topic="")
"bash => print a random quote from bash.org, bash quote_id => print that quote id from bash.org, bash latest => print the latest quote from bash.org (currently broken, need to get josh@bash.org to fix the xml)"
end
- def privmsg(m)
- if m.params && m.params =~ /^([-\d]+)$/
- id = $1
- bash m, id
- elsif(m.params == "latest")
- bash m, id
+
+ def bash(m, params)
+ id = params[:id]
+ case @bot.config['bash.access'].intern
+ when :xml
+ xml_bash(m, id)
else
- bash m
+ html_bash(m, :id => id)
end
end
-
- def bash(m, id=0)
-
- if(id != 0)
- xml = @bot.httputil.get("http://bash.org/xml/?" + id + "&num=1")
- elsif(id == "latest")
- xml = @bot.httputil.get("http://bash.org/xml/?latest&num=1")
- else
- xml = @bot.httputil.get("http://bash.org/xml/?random&num=1",
- :cache => false)
- end
+
+ def search(m, params)
+ esc = URI.escape(params[:words].to_s)
+ html = @bot.httputil.get("http://bash.org/?search=#{esc}")
+ html_bash(m, :html => html)
+ end
+
+ def html_bash(m, opts={})
+ quotes = []
+
+ html = opts[:html]
+ if not html
+ id = opts[:id]
+ case id
+ when 'latest'
+ html = @bot.httputil.get("http://bash.org/?latest")
+ when nil
+ html = @bot.httputil.get("http://bash.org/?random", :cache => false)
+ else
+ html = @bot.httputil.get("http://bash.org/?" + id)
+ end
+ end
+
+ html_quotes = html.split(/<p class="quote">/)
+ html_quotes.each { |htqt|
+ # debug htqt.inspect
+ if htqt.match(/<a href="\?(\d+)"[^>]*>.*?\((-?\d+)\).*?<p class="qt">(.*)<\/p>\s+(?:<\/td>.*)?\z/m)
+ num = $1
+ vote = $2
+ text = $3
+ quotes << BashQuote.new(num, text, vote)
+ end
+ }
+
+ case quotes.length
+ when 0
+ m.reply "no quotes found"
+ return
+ when 1
+ quote = quotes.first
+ else
+ # For the time being, we only echo the first quote, but in the future we
+ # may want to echo more than one for latest/random
+ quote = quotes.first
+ end
+ # TODO: the gsub of br tags to | should be an ircify_html option
+ m.reply "#%d (%d): %s" % [quote.num, quote.vote, quote.text.gsub(/(?:<br \/>\s*)+/, ' | ').ircify_html]
+ end
+
+ def xml_bash(m, id=nil)
+ case id
+ when 'latest'
+ xml = @bot.httputil.get("http://bash.org/xml/?latest&num=1")
+ when nil
+ xml = @bot.httputil.get("http://bash.org/xml/?random&num=1", :cache => false)
+ else
+ xml = @bot.httputil.get("http://bash.org/xml/?" + id + "&num=1")
+ end
+
unless xml
m.reply "bash.org rss parse failed"
return
@@ -41,17 +122,21 @@ class BashPlugin < Plugin
m.reply "bash.org rss parse failed"
return
end
- doc.elements.each("*/item") {|e|
- if(id != 0)
- reply = e.elements["title"].text.gsub(/QDB: /,"") + " " + e.elements["link"].text.gsub(/QDB: /,"") + "\n"
- reply = reply + e.elements["description"].text.gsub(/\<br \/\>/, "\n")
- else
- reply = e.elements["title"].text.gsub(/QDB: /,"") + " " + e.elements["link"].text.gsub(/QDB: /,"") + "\n"
- reply = reply + e.elements["description"].text.gsub(/\<br \/\>/, "\n")
- end
- m.reply reply
- }
+ doc.elements.each("*/item") {|e|
+ if(id != 0)
+ reply = e.elements["title"].text.gsub(/QDB: /,"") + " " + e.elements["link"].text.gsub(/QDB: /,"") + "\n"
+ reply = reply + e.elements["description"].text.gsub(/\<br \/\>/, "\n")
+ else
+ reply = e.elements["title"].text.gsub(/QDB: /,"") + " " + e.elements["link"].text.gsub(/QDB: /,"") + "\n"
+ reply = reply + e.elements["description"].text.gsub(/\<br \/\>/, "\n")
+ end
+ m.reply reply
+ }
end
end
+
plugin = BashPlugin.new
-plugin.register("bash")
+
+plugin.map "bash search *words", :action => :search
+plugin.map "bash [:id]"
+