diff options
-rw-r--r-- | data/rbot/plugins/url.rb | 42 |
1 files changed, 39 insertions, 3 deletions
diff --git a/data/rbot/plugins/url.rb b/data/rbot/plugins/url.rb index 7972037a..286e8c4a 100644 --- a/data/rbot/plugins/url.rb +++ b/data/rbot/plugins/url.rb @@ -1,17 +1,42 @@ +require 'open-uri' + Url = Struct.new("Url", :channel, :nick, :time, :url) +TITLE_RE = /<\s*title\s*>(.+)<\s*\/title\s*>/im class UrlPlugin < Plugin BotConfig.register BotConfigIntegerValue.new('url.max_urls', :default => 100, :validate => Proc.new{|v| v > 0}, :desc => "Maximum number of urls to store. New urls replace oldest ones.") + BotConfig.register BotConfigBooleanValue.new('url.say_titles', + :default => true, + :desc => "Get the title of any links pasted to the channel and display it (Also, tells if the link is broken)") 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 search [<max>=4] <regexp> => search for matching urls. In a private message, you must specify the channel to query, eg. urls <channel> [max], urls search <channel> [max] <regexp>" end + + def get_title_for_url(url) + begin + pagedata = open(url).read + return unless TITLE_RE.match(pagedata) + title = $1.strip.gsub(/\s*\n\s*/, " ") + title = title[0..255] if title.length > 255 + "Title: #{title}" + + rescue SocketError => e + "Title: ^- Error connecting to site (#{e.message})" + rescue OpenURI::HTTPError => e + "Title: ^- Error getting page (#{e.message})" + rescue Exception => e + "Title: ^- Error: #{e.inspect}" + end + end + def listen(m) return unless m.kind_of?(PrivMessage) return if m.address? @@ -20,10 +45,21 @@ class UrlPlugin < Plugin if m.message =~ /((f|ht)tps?:\/\/.*?)(?:\s+|$)/ urlstr = $1 list = @registry[m.target] + + if @bot.config['url.say_titles'] + debug "Getting title for #{urlstr}..." + title = get_title_for_url urlstr + if title + m.reply title + debug "Title found!" + else + debug "Title not found!" + end + end + # check to see if this url is already listed - return if list.find {|u| - u.url == urlstr - } + return if list.find {|u| u.url == urlstr } + url = Url.new(m.target, m.sourcenick, Time.new, urlstr) debug "#{list.length} urls so far" if list.length > @bot.config['url.max_urls'] |