diff options
author | Tom Gilbert <tom@linuxbrit.co.uk> | 2005-07-27 16:32:32 +0000 |
---|---|---|
committer | Tom Gilbert <tom@linuxbrit.co.uk> | 2005-07-27 16:32:32 +0000 |
commit | 2a96c9198c1f6e13407d0999083f6ce5e0bc06fa (patch) | |
tree | b3b9247d275d9b554665bc22884104d266d2e757 /lib/rbot/plugins/url.rb | |
parent | 21949774b91eaec6ecde4eaa8ad121e2c0a36b87 (diff) |
move rbot into lib - still rearranging for packaging/installation
Diffstat (limited to 'lib/rbot/plugins/url.rb')
-rw-r--r-- | lib/rbot/plugins/url.rb | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/lib/rbot/plugins/url.rb b/lib/rbot/plugins/url.rb new file mode 100644 index 00000000..ed82d1c1 --- /dev/null +++ b/lib/rbot/plugins/url.rb @@ -0,0 +1,98 @@ +Url = Struct.new("Url", :channel, :nick, :time, :url) + +class UrlPlugin < Plugin + def initialize + super + @registry.set_default(Array.new) + end + def help(plugin, topic="") + "urls [<max>=4] => list <max> last urls mentioned in current channel, urls <channel> [<max>=4] => list <max> last urls mentioned in <channel>, urls search <regexp> => search for matching urls, urls search <channel> <regexp>, search for matching urls in channel <channel>" + end + def listen(m) + return unless m.kind_of?(PrivMessage) + return if m.address? + # TODO support multiple urls in one line + if m.message =~ /(f|ht)tps?:\/\// + if m.message =~ /((f|ht)tps?:\/\/.*?)(?:\s+|$)/ + url = Url.new(m.target, m.sourcenick, Time.new, $1) + list = @registry[m.target] + debug "#{list.length} urls so far" + if list.length > 50 + list.pop + end + debug "storing url #{url.url}" + list.unshift url + debug "#{list.length} urls now" + @registry[m.target] = list + end + end + end + def privmsg(m) + case m.params + when nil + if m.public? + urls m, m.target + else + m.reply "in a private message, you need to specify a channel name for urls" + end + when (/^(\d+)$/) + max = $1.to_i + if m.public? + urls m, m.target, max + else + m.reply "in a private message, you need to specify a channel name for urls" + end + when (/^(#.*?)\s+(\d+)$/) + channel = $1 + max = $2.to_i + urls m, channel, max + when (/^(#.*?)$/) + channel = $1 + urls m, channel + when (/^search\s+(#.*?)\s+(.*)$/) + channel = $1 + string = $2 + search m, channel, string + when (/^search\s+(.*)$/) + string = $1 + if m.public? + search m, m.target, string + else + m.reply "in a private message, you need to specify a channel name for urls" + end + else + m.reply "incorrect usage: " + help(m.plugin) + end + end + + def urls(m, channel, max=4) + max = 10 if max > 10 + max = 1 if max < 1 + list = @registry[channel] + if list.empty? + m.reply "no urls seen yet for channel #{channel}" + else + list[0..(max-1)].each do |url| + m.reply "[#{url.time.strftime('%Y/%m/%d %H:%M:%S')}] <#{url.nick}> #{url.url}" + end + end + end + + def search(m, channel, string, max=4) + max = 10 if max > 10 + max = 1 if max < 1 + regex = Regexp.new(string) + list = @registry[channel].find_all {|url| + regex.match(url.url) || regex.match(url.nick) + } + if list.empty? + m.reply "no matches for channel #{channel}" + else + list[0..(max-1)].each do |url| + m.reply "[#{url.time.strftime('%Y/%m/%d %H:%M:%S')}] <#{url.nick}> #{url.url}" + end + end + end +end +plugin = UrlPlugin.new +plugin.register("urls") |