+ "search <string> (or: google <string>) => search google for <string> | ddg <string> to search DuckDuckGo | wp <string> => search for <string> on Wikipedia | wa <string> => search for <string> on WolframAlpha | unpedia <string> => search for <string> on Uncyclopedia"
+ end
+ end
+
+ def duckduckgo(m, params)
+ what = params[:words].to_s
+ terms = CGI.escape what
+ url = DDG_API_SEARCH + terms
+
+ hits = @bot.config['duckduckgo.hits']
+ first_pars = params[:firstpar] || @bot.config['duckduckgo.first_par']
+ single = params[:lucky] || (hits == 1 and first_pars == 1)
+
+ begin
+ feed = @bot.httputil.get(url)
+ raise unless feed
+ rescue => e
+ m.reply "error duckduckgoing for #{what}"
+ return
+ end
+ debug feed
+
+ xml = REXML::Document.new feed
+ heading = xml.elements['//Heading/text()'].to_s
+ # answer is returned for calculations
+ answer = xml.elements['//Answer/text()'].to_s
+ # abstract is returned for definitions etc
+ abstract = xml.elements['//AbstractText/text()'].to_s
+ unless abstract.empty?
+ absrc = xml.elements['//AbstractSource/text()']
+ aburl = xml.elements['//AbstractURL/text()']
+ end
+ # but also definition (yes, you can have both, see e.g. printf)
+ definition = xml.elements['//Definition/text()'].to_s
+ unless definition.empty?
+ defsrc = xml.elements['//Definition/@source/text()'].to_s
+ defurl = xml.elements['//Definition/@url/text()'].to_s
+ end
+
+ if heading.empty? and answer.empty? and abstract.empty? and definition.empty?
+ m.reply "no results"
+ return
+ end
+
+ # if we got a one-shot answer (e.g. a calculation, return it)
+ unless answer.empty?
+ m.reply answer
+ return
+ end
+
+ # otherwise, return the abstract, followed by as many hits as found
+ unless heading.empty? or abstract.empty?
+ m.reply "%{bold}%{heading}:%{bold} %{abstract} -- %{absrc} %{aburl}" % {
+ :bold => Bold, :heading => heading,
+ :abstract => abstract, :absrc => absrc, :aburl => aburl
+ }
+ end
+ unless heading.empty? or definition.empty?
+ m.reply "%{bold}%{heading}:%{bold} %{abstract} -- %{absrc} %{aburl}" % {
+ :bold => Bold, :heading => heading,
+ :abstract => definition, :absrc => defsrc, :aburl => defurl
+ }