From c7146d39eede9d1f439bda48117b4dc194ce120e Mon Sep 17 00:00:00 2001 From: Giuseppe Bilotta Date: Sun, 15 Oct 2006 01:07:05 +0000 Subject: [PATCH 1/1] Totally reworked urban dictionary plugin to use WAP. Much faster, much cleaner, doesn't need any fancy package --- data/rbot/plugins/urban.rb | 118 ++++++++++++++++++++++--------------- 1 file changed, 70 insertions(+), 48 deletions(-) diff --git a/data/rbot/plugins/urban.rb b/data/rbot/plugins/urban.rb index 246251ec..36c39077 100644 --- a/data/rbot/plugins/urban.rb +++ b/data/rbot/plugins/urban.rb @@ -1,65 +1,87 @@ -require 'cgi' -begin - require 'rubyful_soup' -rescue - warning "could not load rubyful_soup, urban dictionary disabled" - warning "please get it from http://www.crummy.com/software/RubyfulSoup/" - warning "or install it via gem" - return -end -require 'uri/common' +require 'uri' class UrbanPlugin < Plugin def help( plugin, topic="") - "urban [word] [n]. Give the [n]th definition of [word] from urbandictionary.com." + "urban [word] [n]: give the [n]th definition of [word] from urbandictionary.com. urbanday: give the word-of-the-day at urban" end - def privmsg( m ) - definitionN = 0 + def urban(m, params) + words = params[:words].to_s + n = params[:n].nil? ? 1 : params[:n].to_i rescue 1 - if m.params - paramArray = m.params.split(' ') - if paramArray.last.to_i != 0 - definitionN = paramArray.last.to_i - 1 - query = m.params.chomp( paramArray.last ) - query.rstrip! - else - query = m.params - end - uri = URI.parse( "http://www.urbandictionary.com/define.php?term=#{ URI.escape query}" ) - else + if words.empty? uri = URI.parse( "http://www.urbandictionary.com/random.php" ) + @bot.httputil.head(uri) { |redir| + words = URI.unescape(redir.match(/define.php\?term=(.*)$/)[1]) rescue nil + } end - - soup = BeautifulSoup.new( @bot.httputil.get_cached( uri ) ) - if titleNavi = soup.find_all( 'td', :attrs => { 'class' => 'def_word' } )[0] then - title = titleNavi.contents - results = soup.find_all( 'div', :attrs => { 'class' => 'def_p' } ) - # debug PP.pp(results,'') - output = Array.new - if results[definitionN] then - results[definitionN].p.contents.each { |s| output.push( strip_tags( s.to_s ) ) } - m.reply "\002#{title}\002 - #{output} (#{definitionN+1}/#{results.length})" - else - m.reply "#{query} does not have #{definitionN + 1} definitions." - end + # we give a very high 'skip' because this will allow us to get the number of definitions by retrieving the previous definition + uri = URI.parse("http://www.urbanwap.com/search.php?term=#{URI.escape words}&skip=65536") + page = @bot.httputil.get(uri) + if page.nil? + m.reply "Couldn't retrieve an urban dictionary definition of #{words}" + return + end + if page =~ / is undefined<\/card><\/wml>/ + m.reply "There is no urban dictionary definition of #{words}" + return + end + if page =~ /&skip=(\d+)">prev<\/a>/ + numdefs = $1.to_i + 1 else - m.reply "#{m.params} not found." + numdefs = 1 end + n = numdefs + n + 1 if n < 0 + if n > numdefs + m.reply "Urban dictionary only has #{numdefs} definitions for '#{words}'" + n = numdefs + end + if n < numdefs + uri = URI.parse("http://www.urbanwap.com/search.php?term=#{URI.escape words}&skip=#{n-1}") + page = @bot.httputil.get(uri) + if page.nil? + case n % 10 + when 1 + ord = 'st' + when 2 + ord = 'nd' + when 3 + ord = 'rd' + else + ord = 'th' + end + m.reply "Couldn't retrieve the #{n}#{ord} urban dictionary definition of #{words}" + return + end + end + m.reply "#{get_def(page)} (#{n}/#{numdefs})" end - def strip_tags(html) - html.gsub(/<.+?>/,''). - gsub(/&/,'&'). - gsub(/"/,'"'). - gsub(/</,'<'). - gsub(/>/,'>'). - gsub(/&ellip;/,'...'). - gsub(/'/, "'"). - gsub("\n",'') + def get_def(text) + Utils.decode_html_entities text.gsub(/(?:prev<\/a> )?home<\/a>(?: next<\/a>)?/,'').gsub(/<\/?p>/, ' ').gsub(/<.*?>/, '').gsub("\n", ' ').strip + end + + def uotd(m, params) + home = @bot.httputil.get("http://www.urbanwap.com/") + if home.nil? + m.reply "Couldn't get the urban dictionary word of the day" + return + end + home.match(/Word of the Day: .*?<\/a>/) + wotd = $1 + debug "Urban word of the day: #{wotd}" + page = @bot.httputil.get(wotd) + if page.nil? + m.reply "Couldn't get the urban dictionary word of the day" + else + m.reply get_def(page) + end end end plugin = UrbanPlugin.new -plugin.register( "urban" ) +plugin.map "urban *words :n", :requirements => { :n => /^-?\d+$/ }, :action => 'urban' +plugin.map "urban [*words]", :action => 'urban' +plugin.map "urbanday", :action => 'uotd' + -- 2.39.2