X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=data%2Frbot%2Fplugins%2Furban.rb;h=d66883060ea823dcaa394a4362dff6cef53c5460;hb=052217de30c59206d7025b582d4604557a747470;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..d6688306 100644 --- a/data/rbot/plugins/urban.rb +++ b/data/rbot/plugins/urban.rb @@ -1,64 +1,82 @@ -require 'cgi' -require 'rubyful_soup' -require 'uri/common' - class UrbanPlugin < Plugin + URBAN = 'http://www.urbandictionary.com/define.php?term=' 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 format_definition(total, num, word, desc, ex) + "#{Bold}#{word} (#{num}/#{total})#{Bold}: " + + desc.ircify_html(:limit => 300) + " " + + "#{ex}".ircify_html(:limit => 100) + end - unless(m.params && m.params.length > 0) - m.reply "incorrect usage: " + help(m.plugin) - return + def get_def(m, word, n = nil) + n = n ? n.to_i : 1 + p = (n-1)/7 + 1 + u = URBAN + URI.escape(word) + u += '&page=' + p.to_s if p > 1 + s = @bot.httputil.get(u) + return m.reply("Couldn't get the urban dictionary definition for #{word}") if s.nil? + + notfound = s.match %r{.*? isn't defined} + + numpages = if s[%r{
.*?
}m] + $&.scan(/\d+/).collect {|x| x.to_i}.max || 1 + else 1 end + + rv = Array.new + s.scan(%r{]*>.*?(\d+)\..*?.*?(?:)?([^>]+)(?:)?.*?
(.+?)
.*?
(.+?)
}m) do |num, wrd, desc, ex| + rv << [num.to_i, wrd.strip, desc.strip, ex.strip] 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}" ) + maxnum = rv.collect {|x| x[0]}.max || 0 + return m.reply("#{Bold}#{word}#{Bold} not found") if rv.empty? + + if notfound + suggestions = rv.map { |str| Underline + str[1] + Underline }.uniq.join ', ' + m.reply "#{Bold}#{word}#{Bold} not found. maybe you mean #{suggestions}?" + 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." + answer = rv.find { |a| a[0] == n } + answer ||= (n > maxnum ? rv.last : rv.first) + m.reply format_definition((p == numpages ? maxnum : "#{(numpages-1)*7 + 1}+"), *answer) + end + + def urban(m, params) + words = params[:words].to_s + if words.empty? + resp = @bot.httputil.head('http://www.urbandictionary.com/random.php', + :max_redir => -1, + :cache => false) + return m.reply("Couldn't get a random urban dictionary word") if resp.nil? + if resp.code == "302" && (loc = resp['location']) + words = URI.unescape(loc.match(/define.php\?term=(.*)$/)[1]) rescue nil end - else - m.reply "#{m.params} not found." end - + get_def(m, words, params[:n]) 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.urbandictionary.com/daily.php") + if home.nil? + m.reply "Couldn't get the urban dictionary word of the day" + return + end + home.match(%r{href="/define.php\?term=.*?">(.*?)<}) + wotd = $1 + debug "Urban word of the day: #{wotd}" + if !wotd + m.reply "Couldn't get the urban dictionary word of the day" + return + end + get_def(m, wotd, 1) 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' +