+ return extra.join(", ") if title or not @bot.config['url.titles_only']
+ end
+
+ def handle_urls(m, urls, display_info=@bot.config['url.display_link_info'])
+ return if urls.empty?
+ debug "found urls #{urls.inspect}"
+ list = m.public? ? @registry[m.target] : nil
+ debug "display link info: #{display_info}"
+ urls_displayed = 0
+ urls.each do |urlstr|
+ debug "working on #{urlstr}"
+ next unless urlstr =~ /^https?:/
+ title = nil
+ debug "Getting title for #{urlstr}..."
+ reply = nil
+ begin
+ title = get_title_for_url(urlstr,
+ :nick => m.source.nick,
+ :channel => m.channel,
+ :ircline => m.message)
+ debug "Title #{title ? '' : 'not '} found"
+ reply = "#{LINK_INFO} #{title}" if title
+ rescue => e
+ if e.message =~ /\(404 - Not Found\)/i
+ # see if we failed to find the thing because of trailing punctuation
+ # but check that we still have 'something' in the URL
+ retry if urlstr.chop! and urlstr =~ /^https?:\/\/./
+ end
+ reply = "Error #{e.message}"
+ end
+
+ if display_info > urls_displayed
+ if reply
+ m.plainreply(reply, :overlong => :truncate)
+ urls_displayed += 1
+ end
+ end
+
+ next unless list
+
+ # check to see if this url is already listed
+ next if list.find {|u| u.url == urlstr }
+
+ url = Url.new(m.target, m.sourcenick, Time.new, urlstr, title)
+ debug "#{list.length} urls so far"
+ list.pop if list.length > @bot.config['url.max_urls']
+ debug "storing url #{url.url}"
+ list.unshift url
+ debug "#{list.length} urls now"
+ end
+ @registry[m.target] = list
+ end
+
+ def info(m, params)
+ escaped = URI.escape(params[:urls].to_s, OUR_UNSAFE)
+ urls = URI.extract(escaped)
+ Thread.new { handle_urls(m, urls, params[:urls].length) }