| Class | Irc::NetmaskDb |
| In: |
lib/rbot/maskdb.rb
|
| Parent: | Object |
api wrapper for netmasks
# File lib/rbot/maskdb.rb, line 101
101: def initialize
102: @tree = Tree.new
103: end
# File lib/rbot/maskdb.rb, line 126
126: def add(user, *masks)
127: masks.each do |m|
128: debug "adding user #{user} with mask #{m.fullform}"
129: @tree.add([user, m], *mask2keys(m))
130: end
131: end
# File lib/rbot/maskdb.rb, line 105
105: def cook_component(str)
106: s = (str && !str.empty?) ? str : '*'
107: l = s.index(/[\?\*]/)
108: if l
109: l2 = s.size - s.rindex(/[\?\*]/) - 1
110: if l2 > l
111: s = s.reverse
112: l = l2
113: end
114:
115: return (l > 0) ? s.slice(0 .. (l - 1)) : ''
116: else
117: return s
118: end
119: end
# File lib/rbot/maskdb.rb, line 149
149: def find(iu)
150: debug "find(#{iu.fullform})"
151: iud = iu.downcased
152: matches = @tree.find(iud.host, iud.user, iud.nick).uniq.map do |val|
153: m = metric(iu, *val)
154: m ? [val[0], m] : nil
155: end.compact.sort { |a, b| a[1] <=> a[1] }
156: debug "matches: " + (matches.map do |m|
157: "#{m[0].username}: [#{m[1]}]"
158: end.join(', '))
159: return matches.empty? ? nil : matches[0][0]
160: end
# File lib/rbot/maskdb.rb, line 121
121: def mask2keys(m)
122: md = m.downcased
123: [md.host, md.user, md.nick].map { |c| cook_component(c) }
124: end
# File lib/rbot/maskdb.rb, line 140
140: def metric(iu, bu, mask)
141: ret = nil
142: if iu.matches? mask
143: ret = iu.fullform.length - mask.fullform.length
144: ret += 10 if bu.transient?
145: end
146: return ret
147: end