+ results = results.map {|result|
+ url = CGI::parse(Utils.decode_html_entities(result[0]))['q'].first
+ title = Utils.decode_html_entities(result[1].gsub(/<\/?[^>]+>/, ''))
+ [url, title] unless url.empty? or title.empty?
+ }.reject {|item| not item}[0..hits]
+
+ result_string = results.map {|url, title| "#{Bold}#{title}#{NormalText}: #{url}"}
+
+ if params[:lucky]
+ m.reply result_string.first
+ Utils.get_first_pars([results.map {|url, title| url}.first], first_pars, :message => m)
+ return
+ end
+
+ m.reply "Results for #{what}: #{result_string.join(' | ')}", :split_at => /\s+\|\s+/
+
+ return unless first_pars > 0
+
+ Utils.get_first_pars(results.map {|url, title| url}, 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(GOOGLE_CALC_RESULT)
+ debug "candidates: #{candidates.inspect}"
+
+ if candidates.nil?
+ m.reply "couldn't calculate #{what}"
+ return
+ end
+ result = candidates[1].remove_nonascii
+
+ debug "replying with: #{result.inspect}"
+ m.reply result.ircify_html
+ 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
+ resp = @bot.httputil.get(url, resp: true)
+ rescue => e
+ m.reply "error googledefining #{what}"
+ return
+ end
+
+ results = resp.xpath(GOOGLE_XPATH_DEF).map(&:content)
+
+ if results.empty?
+ m.reply "couldn't find a definition for #{what} on Google"
+ else
+ m.reply "#{results.first} -- #{results[1..-1].join(' ')}"
+ end
+ end
+
+ def wolfram(m, params)
+ what = params[:words].to_s
+ terms = CGI.escape what
+ url = WOLFRAM_API_SEARCH % {
+ :terms => terms, :key => WOLFRAM_API_KEY
+ }
+
+ begin
+ feed = @bot.httputil.get(url)
+ raise unless feed
+ rescue => e
+ m.reply "error asking WolframAlfa about #{what}"
+ return
+ end
+ debug feed
+
+ xml = REXML::Document.new feed
+ if xml.elements['/queryresult'].attributes['error'] == "true"
+ m.reply xml.elements['/queryresult/error/text()'].to_s
+ return
+ end
+ unless xml.elements['/queryresult'].attributes['success'] == "true"
+ m.reply "no data available"
+ return
+ end
+ answer_type, answer = [], []
+ xml.elements.each("//pod") { |element|
+ answer_type << element.attributes['title']
+ answer << element.elements['subpod/plaintext'].text
+ }
+ # find the first answer that isn't nil,
+ # starting on the second pod in the array
+ n = 1
+ answer[1..-1].each { |a|
+ break unless a.nil?
+ n += 1
+ }
+ if answer[n].nil?
+ m.reply "no results"
+ return
+ end
+ # strip spaces, pipes, and line breaks
+ sep = Bold + ' :: ' + Bold
+ chars = [ [/\n/, sep], [/\t/, " "], [/\s+/, " "], ["|", "-"] ]
+ chars.each { |c| answer[n].gsub!(c[0], c[1]) }
+ m.reply answer_type[n] + sep + answer[n]