From 5bfce83f0619276cd0db55e02f9fe29fd2333ba3 Mon Sep 17 00:00:00 2001 From: Raine Virta Date: Wed, 4 Feb 2009 16:07:37 +0200 Subject: googlefight plugin --- data/rbot/plugins/googlefight.rb | 64 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100755 data/rbot/plugins/googlefight.rb diff --git a/data/rbot/plugins/googlefight.rb b/data/rbot/plugins/googlefight.rb new file mode 100755 index 00000000..3f7cf5a1 --- /dev/null +++ b/data/rbot/plugins/googlefight.rb @@ -0,0 +1,64 @@ +#-- vim:sw=2:et +#++ +# +# :title: Googlefight plugin for rbot +# +# Author:: Raine Virta [... ] => battles given keywords based on amount of google search results and announces the winner!" + end + + def fight(m, params) + keywords = parse_keywords(params) + return if keywords.nil? + + keywords.map! do |k| + [k, google_count(k)] + end + + m.reply output(keywords) + end + + def output(result) + result = result.sort_by { |e| e[1] }.reverse + str = result.map do |kw| + "%{keyword} (%{count})" % { + :keyword => Bold+kw[0]+Bold, + :count => kw[1].to_s.gsub(/(\d)(?=(\d\d\d)+(?!\d))/, "\\1,") + } + end.join(" vs. ") + + unless result[0][1].zero? + str << _(" -- %{keyword} wins!") % { + :keyword => Bold+result[0][0]+Bold + } + else + str << _(" -- no winner here!") + end + end + + def parse_keywords(params) + str = params[:keywords].join(" ") + + # foo "foo bar" bar + # no separators so assume they're all separate keywords + if str.match(/(?:"[\w\s]+"|\w+)(?: (?:"[\w\s]+"|\w+))+/) + str.scan(/"[^"]+"|\S+/).flatten + end + end + + def google_count(query) + url = 'http://www.google.com/search?hl=en&safe=off&btnG=Search&q=' << CGI.escape(query) + html = Net::HTTP.get(URI.parse((url))) + res = html.scan(%r{Results 1 - \d+ of(?: about)? ([\d,]+)}) + res.to_s.tr(",", "").to_i + end +end + +plugin = GoogleFightPlugin.new +plugin.map "googlefight *keywords", :action => "fight", + :requirements => { :keywords => /^[\w\s"]+? (?:(?:(?:\||vs\.) )?[\w\s"]+?)+/ } \ No newline at end of file -- cgit v1.2.3