summaryrefslogtreecommitdiff
path: root/data/rbot/plugins/urban.rb
blob: 9b547644ad80ea5b6be8bf4e0dcc6ad72f805270 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
class UrbanPlugin < Plugin

  def help( plugin, topic="")
    "urban [word] [n]: give the [n]th definition of [word] from urbandictionary.com. urbanday: give the word-of-the-day at urban"
  end

  def urban(m, params)
    words = params[:words].to_s
    n = params[:n].nil? ? 1 : params[:n].to_i rescue 1

    if words.empty?
      resp = @bot.httputil.head('http://www.urbandictionary.com/random.php',
                               :max_redir => -1)
      if resp.code == "302" && (loc = resp['location'])
        words = URI.unescape(loc.match(/define.php\?term=(.*)$/)[1]) rescue nil
      end
    end
    # we give a very high 'skip' because this will allow us to get the number of definitions by retrieving the previous definition
    uri = "http://www.urbanwap.com/search.php?term=#{CGI.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 =~ /&amp;skip=(\d+)">prev<\/a>/
      numdefs = $1.to_i + 1
    else
      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 = "http://www.urbanwap.com/search.php?term=#{CGI.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(/(?:<a href[^>]*>prev<\/a> )?<a href[^>]*>home<\/a>(?: <a href[^>]*>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 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 href="(.*?)">.*?<\/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.map "urban *words :n", :requirements => { :n => /^-?\d+$/ }, :action => 'urban'
plugin.map "urban [*words]", :action => 'urban'
plugin.map "urbanday", :action => 'uotd'