- 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+|$)/
- urlstr = $1
- list = @registry[m.target]
-
- if @bot.config['url.display_link_info']
- Thread.start do
- debug "Getting title for #{urlstr}..."
- begin
- title = get_title_for_url urlstr
- if title
- m.reply "#{LINK_INFO} #{title}", :overlong => :truncate
- debug "Title found!"
- else
- debug "Title not found!"
- end
- rescue => e
- debug "Failed: #{e}"
- end
- end
+ def handle_urls(m, params={})
+ opts = {
+ :display_info => @bot.config['url.display_link_info'],
+ :channels => @bot.config['url.only_on_channels']
+ }.merge params
+ urls = opts[:urls]
+ display_info= opts[:display_info]
+ channels = opts[:channels]
+ unless channels.empty?
+ return unless channels.map { |c| c.downcase }.include?(m.channel.downcase)
+ end
+
+ 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,
+ :always_reply => m.address?,
+ :nick => m.source.nick,
+ :channel => m.channel,
+ :ircline => m.message)
+ debug "Title #{title ? '' : 'not '} found"
+ reply = "#{LINK_INFO} #{title}" if title
+ rescue => e
+ debug e
+ # we might get a 404 because of trailing punctuation, so we try again
+ # with the last character stripped. this might generate invalid URIs
+ # (e.g. because "some.url" gets chopped to some.url%2, so catch that too
+ if e.message =~ /\(404 - Not Found\)/i or e.kind_of?(URI::InvalidURIError)
+ # chop off last character, and retry if we still have enough string to
+ # look like a minimal URL
+ retry if urlstr.chop! and urlstr =~ /^https?:\/\/./
+ end
+ reply = "Error #{e.message}"
+ end
+
+ if display_info > urls_displayed
+ if reply
+ m.reply reply, :overlong => :truncate, :to => :public,
+ :nick => (m.address? ? :auto : false)
+ urls_displayed += 1