+ single ||= (results.length==1)
+ pretty = []
+
+ begin
+ urls = Array.new
+
+ debug results
+ results.each do |res|
+ t = res[1].ircify_html(:img => "[%{src} %{alt} %{dimensions}]").strip
+ u = res[0]
+ if u.sub!(%r{^http://www.google.com/aclk\?},'')
+ u = CGI::parse(u)['adurl'].first
+ debug "skipping ad for #{u}"
+ next
+ elsif u.sub!(%r{^http://www.google.com/gwt/x\?},'')
+ u = CGI::parse(u)['u'].first
+ elsif u.sub!(%r{^/url\?},'')
+ u = CGI::parse(u)['q'].first
+ end
+ urls.push(u)
+ pretty.push("%{n}%{b}%{t}%{b}%{sep}%{u}" % {
+ :n => (single ? "" : "#{urls.length}. "),
+ :sep => (single ? " -- " : ": "),
+ :b => Bold, :t => t, :u => u
+ })
+ break if urls.length == hits
+ end
+ rescue => e
+ m.reply "failed to understand what google found for #{what}"
+ error e
+ debug wml
+ debug results
+ return
+ end
+
+ if params[:lucky]
+ m.reply pretty.first
+ return
+ end
+
+ result_string = pretty.join(" | ")
+
+ # If we return a single, full result, change the output to a more compact representation
+ if single
+ m.reply "Result for %s: %s -- %s" % [what, result_string, Utils.get_first_pars(urls, first_pars)], :overlong => :truncate
+ return
+ end
+
+ m.reply "Results for #{what}: #{result_string}", :split_at => /\s+\|\s+/
+
+ return unless first_pars > 0
+
+ Utils.get_first_pars urls, first_pars, :message => m
+
+ end
+
+ def google_define(m, what, params)
+ begin
+ wml = @bot.httputil.get(GOOGLE_SEARCH + CGI.escape(what))
+ raise unless wml
+ rescue => e
+ m.reply "error googling for #{what}"
+ return
+ end
+
+ begin
+ related_index = wml.index(/Related phrases:/, 0)
+ raise unless related_index
+ defs_index = wml.index(/Definitions of <b>/, related_index)
+ raise unless defs_index
+ defs_end = wml.index(/<input/, defs_index)
+ raise unless defs_end
+ rescue => e
+ m.reply "no results found for #{what}"
+ return
+ end
+
+ related = wml[related_index...defs_index]
+ defs = wml[defs_index...defs_end]
+
+ m.reply defs.ircify_html(:a_href => Underline), :split_at => (Underline + ' ')
+
+ end
+
+ def lucky(m, params)
+ params.merge!(:lucky => true)
+ google(m, params)
+ end
+
+ def gcalc(m, params)
+ what = params[:words].to_s
+ searchfor = CGI.escape(what)
+
+ debug "Getting gcalc thing: #{searchfor.inspect}"
+ url = GOOGLE_WAP_SEARCH + searchfor
+
+ begin
+ html = @bot.httputil.get(url)
+ rescue => e
+ m.reply "error googlecalcing #{what}"
+ return
+ end
+
+ debug "#{html.size} bytes of html recieved"
+ debug html
+
+ candidates = html.match(/font-weight:bold">(.*?)<\/(?:span|div)>/)
+ debug "candidates: #{candidates.inspect}"
+
+ if candidates.nil?
+ m.reply "couldn't calculate #{what}"
+ return
+ end
+ result = candidates[1]
+
+ debug "replying with: #{result.inspect}"
+ m.reply result.ircify_html
+ end
+
+ def gcount(m, params)
+ what = params[:words].to_s
+ searchfor = CGI.escape(what)
+
+ debug "Getting gcount thing: #{searchfor.inspect}"
+ url = GOOGLE_SEARCH + searchfor
+
+ begin
+ html = @bot.httputil.get(url)
+ rescue => e
+ m.reply "error googlecounting #{what}"
+ return
+ end
+
+ debug "#{html.size} bytes of html recieved"
+
+ results = html.scan(GOOGLE_COUNT_RESULT)
+ debug "results: #{results.inspect}"
+
+ if results.length != 1
+ m.reply "couldn't count #{what}"
+ return
+ end
+
+ result = results[0][0].ircify_html
+ debug "replying with: #{result.inspect}"
+ m.reply "total results: #{result}"
+
+ end
+
+ def gdef(m, params)
+ what = params[:words].to_s
+ searchfor = CGI.escape("define " + what)
+
+ debug "Getting gdef thing: #{searchfor.inspect}"
+ url = GOOGLE_WAP_SEARCH + searchfor
+
+ begin
+ html = @bot.httputil.get(url)
+ rescue => e
+ m.reply "error googledefining #{what}"
+ return
+ end
+
+ debug html
+ results = html.scan(GOOGLE_DEF_RESULT)
+ debug "results: #{results.inspect}"
+
+ if results.length != 1
+ m.reply "couldn't find a definition for #{what} on Google"
+ return
+ end
+
+ head = results[0][0].ircify_html
+ text = results[0][1].ircify_html
+ m.reply "#{head} -- #{text}"