GOOGLE_WAP_SEARCH = "http://www.google.com/m/search?hl=en&q="
# GOOGLE_WAP_LINK = /<a accesskey="(\d)" href=".*?u=(.*?)">(.*?)<\/a>/im
GOOGLE_WAP_LINK = /<a href="(?:.*?u=(.*?)|(http:\/\/.*?))">(.*?)<\/a>/im
-GOOGLE_CALC_RESULT = %r{<img src=/images/calc_img\.gif(?: width=40 height=30 alt="")?>.*?<h2 class=r[^>]*><b>(.+?)</b>}
+GOOGLE_CALC_RESULT = %r{<img src=/images/calc_img\.gif(?: width=40 height=30 alt="")?>.*?<h[1-6] class=r[^>]*><b>(.+?)</b>}
GOOGLE_COUNT_RESULT = %r{<font size=-1>Results <b>1<\/b> - <b>10<\/b> of about <b>(.*)<\/b> for}
-GOOGLE_DEF_RESULT = %r{<a href="([^"]*)"[^>]*>(Web definitions for .*?)<br/>(.*?)<br/>(.*?)\s-\s+<a href}
+GOOGLE_DEF_RESULT = %r{<br/>\s*(.*?)\s*<br/>\s*(.*?)<a href="(/dictionary\?[^"]*)"[^>]*>(More ยป)\s*</a>\s*<br/>}
GOOGLE_TIME_RESULT = %r{alt="Clock"></td><td valign=[^>]+>(.+?)<(br|/td)>}
class SearchPlugin < Plugin
def google(m, params)
what = params[:words].to_s
+ if what.match(/^define:/)
+ return google_define(m, what, params)
+ end
+
searchfor = CGI.escape what
# This method is also called by other methods to restrict searching to some sites
if params[:site]
m.reply "error googling for #{what}"
return
end
- results = wml.scan(GOOGLE_WAP_LINK)
+ results = wml.match('<p align="center">').pre_match.scan(GOOGLE_WAP_LINK)
+
if results.length == 0
m.reply "no results found for #{what}"
return
end
+
single ||= (results.length==1)
+
urls = Array.new
n = 0
results = results[0...hits].map { |res|
n += 1
- t = Utils.decode_html_entities res[2].gsub(filter, '').strip
+ t = res[2].ircify_html(:img => "[%{src} %{alt} %{dimensions}]").strip
u = URI.unescape(res[0] || res[1])
urls.push(u)
"%{n}%{b}%{t}%{b}%{sep}%{u}" % {
:sep => (single ? " -- " : ": "),
:b => Bold, :t => t, :u => u
}
- }.join(" | ")
+ }
if params[:lucky]
m.reply results.first
return
end
+ result_string = results.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, results, Utils.get_first_pars(urls, first_pars)], :overlong => :truncate
+ 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}: #{results}", :split_at => /\s+\|\s+/
+ m.reply "Results for #{what}: #{result_string}", :split_at => /\s+\|\s+/
return unless first_pars > 0
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)
searchfor = CGI.escape(what)
debug "Getting gcalc thing: #{searchfor.inspect}"
- url = GOOGLE_SEARCH + searchfor
+ url = GOOGLE_WAP_SEARCH + searchfor
begin
html = @bot.httputil.get(url)
debug "#{html.size} bytes of html recieved"
- results = html.scan(GOOGLE_CALC_RESULT)
- debug "results: #{results.inspect}"
+ intro, result, junk = html.split(/\s*<br\/>\s*/, 3)
+ debug "result: #{result.inspect}"
- if results.length != 1
+ unless result.include? '='
m.reply "couldn't calculate #{what}"
return
end
- result = results[0][0].ircify_html
debug "replying with: #{result.inspect}"
- m.reply "#{result}"
+ m.reply result.ircify_html
end
def gcount(m, params)
return
end
- gdef_link = "http://www.google.com" + CGI.unescapeHTML(results[0][0]) # could be used to extract all defs
- head = results[0][1].ircify_html
- text = results[0][2].ircify_html
- link = results[0][3]
- m.reply "#{head} -- #{link}\n#{text}"
+ gdef_link = "http://www.google.com" + CGI.unescapeHTML(results[0][2]) # could be used to extract all defs
+ head = results[0][0].ircify_html
+ text = results[0][1].ircify_html
+ m.reply "#{head} -- #{text}"
### gdef_link could be used for something like
# html_defs = @bot.httputil.get(gdef_link)