X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=data%2Frbot%2Fplugins%2Furban.rb;h=95210b252460980d7918c9067327ce929685189e;hb=c66e854af4f9d6be1947564638289fe781f1c9e9;hp=dd275e2de7a995e1c90f3fdc7d7287d5a3dcc1a2;hpb=b7d2b095520d8951eb41ebd9c7794889169e5228;p=user%2Fhenk%2Fcode%2Fruby%2Frbot.git diff --git a/data/rbot/plugins/urban.rb b/data/rbot/plugins/urban.rb index dd275e2d..95210b25 100644 --- a/data/rbot/plugins/urban.rb +++ b/data/rbot/plugins/urban.rb @@ -1,64 +1,101 @@ -require 'cgi' -require 'rubyful_soup' -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 ) + def urban(m, params) + words = params[:words].to_s + n = params[:n].nil? ? 1 : params[:n].to_i rescue 1 - unless(m.params && m.params.length > 0) - m.reply "incorrect usage: " + help(m.plugin) + 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 + # 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 - - paramArray = m.params.split(' ') - definitionN = 0 - if m.params == 'random' then - uri = URI.parse( "http://www.urbandictionary.com/random.php" ) - else - if( paramArray.last.to_i != 0 ) then - 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}" ) + if page =~ / is undefined<\/card><\/wml>/ + m.reply "There is no urban dictionary definition of #{words}" + return end - - soup = BeautifulSoup.new( @bot.httputil.get( 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}" - else - m.reply "#{query} does not have #{definitionN + 1} definitions." - 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 get_def(text) + # Start by removing the prev/home/next links + t = text.gsub(/(?:prev<\/a> )?home<\/a>(?: next<\/a>)?/,'') + # Close up paragraphs + t.gsub!(/<\/?p>/, ' ') + t.gsub!("\n", ' ') + # Reverse headings + t.gsub!(/<\/?b>/,"#{Reverse}") + # Enbolden links + t.gsub!(/<\/?a(?: .*?)?>/,"#{Bold}") + # Reverse examples + t.gsub!(/<\/?(?:i|em)>/,"#{Underline}") + # Clear anything else + t.gsub!(/<.*?>/, '') + + Utils.decode_html_entities t.strip end - def strip_tags(html) - html.gsub(/<.+?>/,''). - gsub(/&/,'&'). - gsub(/"/,'"'). - gsub(/</,'<'). - gsub(/>/,'>'). - gsub(/&ellip;/,'...'). - gsub(/'/, "'"). - gsub("\n",'') + 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' +