X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=data%2Frbot%2Fplugins%2Furl.rb;h=269227a3c468e21d643d83e8f66296be5e6128fb;hb=69db4133c5ccfa41c35b43c67fce1d5ff640bfd5;hp=8c064dccb91750d866e111fc87765ac4aaf4635c;hpb=37fb9f96d582d24ffb9bbc14cc75fc9fec52ace3;p=user%2Fhenk%2Fcode%2Fruby%2Frbot.git diff --git a/data/rbot/plugins/url.rb b/data/rbot/plugins/url.rb index 8c064dcc..269227a3 100644 --- a/data/rbot/plugins/url.rb +++ b/data/rbot/plugins/url.rb @@ -1,4 +1,4 @@ -Url = Struct.new("Url", :channel, :nick, :time, :url, :info) +define_structure :Url, :channel, :nick, :time, :url, :info class ::UrlLinkError < RuntimeError end @@ -38,11 +38,15 @@ class UrlPlugin < Plugin $1.ircify_html end - def get_title_for_url(uri_str) + def get_title_for_url(uri_str, nick = nil, channel = nil) url = uri_str.kind_of?(URI) ? uri_str : URI.parse(uri_str) return if url.scheme !~ /https?/ + logopts = Hash.new + logopts[:nick] = nick if nick + logopts[:channel] = channel if channel + title = nil extra = String.new @@ -52,6 +56,8 @@ class UrlPlugin < Plugin case resp when Net::HTTPSuccess + debug resp.to_hash + if resp['content-type'] =~ /^text\/|(?:x|ht)ml/ # The page is text or HTML, so we can try finding a title and, if # requested, the first par. @@ -63,35 +69,50 @@ class UrlPlugin < Plugin # if @bot.config['url.first_par'] partial = resp.partial_body(@bot.config['http.info_bytes']) - title = get_title_from_html(partial) + logopts[:title] = title = get_title_from_html(partial) first_par = Utils.ircify_first_html_par(partial, :strip => title) - extra << ", #{Bold}text#{Bold}: #{first_par}" unless first_par.empty? + unless first_par.empty? + logopts[:extra] = first_par + extra << ", #{Bold}text#{Bold}: #{first_par}" + end + call_event(:url_added, url.to_s, logopts) return "#{Bold}title#{Bold}: #{title}#{extra}" if title else resp.partial_body(@bot.config['http.info_bytes']) { |part| - title = get_title_from_html(part) + logopts[:title] = title = get_title_from_html(part) + call_event(:url_added, url.to_s, logopts) return "#{Bold}title#{Bold}: #{title}" if title } end # if nothing was found, provide more basic info, as for non-html pages + else + resp.no_cache = true end - debug resp.to_hash.inspect - enc = resp['content-encoding'] - - extra << ", #{Bold}encoding#{Bold}: #{enc}" if enc + logopts[:extra] = String.new + logopts[:extra] << "Content Type: #{resp['content-type']}" + if enc + logopts[:extra] << ", encoding: #{enc}" + extra << ", #{Bold}encoding#{Bold}: #{enc}" + end unless @bot.config['url.titles_only'] # content doesn't have title, just display info. size = resp['content-length'].gsub(/(\d)(?=\d{3}+(?:\.|$))(\d{3}\..*)?/,'\1,\2') rescue nil - size = size ? ", #{Bold}size#{Bold}: #{size} bytes" : "" + if size + logopts[:extra] << ", size: #{size} bytes" + size = ", #{Bold}size#{Bold}: #{size} bytes" + end + call_event(:url_added, url.to_s, logopts) return "#{Bold}type#{Bold}: #{resp['content-type']}#{size}#{extra}" end + call_event(:url_added, url.to_s, logopts) else raise UrlLinkError, "getting link (#{resp.code} - #{resp.message})" end } + return nil rescue Exception => e case e when UrlLinkError @@ -117,7 +138,7 @@ class UrlPlugin < Plugin Thread.start do debug "Getting title for #{urlstr}..." begin - title = get_title_for_url urlstr + title = get_title_for_url urlstr, m.source.nick, m.channel if title m.reply "#{LINK_INFO} #{title}", :overlong => :truncate debug "Title found!" @@ -146,13 +167,24 @@ class UrlPlugin < Plugin end end - def reply_urls(m, list, max) + def reply_urls(opts={}) + list = opts[:list] + max = opts[:max] + channel = opts[:channel] + m = opts[:msg] + return unless list and max and m list[0..(max-1)].each do |url| disp = "[#{url.time.strftime('%Y/%m/%d %H:%M:%S')}] <#{url.nick}> #{url.url}" if @bot.config['url.info_on_list'] - title = url.info || get_title_for_url(url.url) rescue nil - if title and not url.info - url.info = title + title = url.info || get_title_for_url(url.url, url.nick, channel) rescue nil + # If the url info was missing and we now have some, try to upgrade it + if channel and title and not url.info + ll = @registry[channel] + debug ll + if el = ll.find { |u| u.url == url.url } + el.info = title + @registry[channel] = ll + end end disp << " --> #{title}" if title end @@ -169,7 +201,7 @@ class UrlPlugin < Plugin if list.empty? m.reply "no urls seen yet for channel #{channel}" else - reply_urls(m, list, max) + reply_urls :msg => m, :channel => channel, :list => list, :max => max end end @@ -181,12 +213,13 @@ class UrlPlugin < Plugin max = 1 if max < 1 regex = Regexp.new(string, Regexp::IGNORECASE) list = @registry[channel].find_all {|url| - regex.match(url.url) || regex.match(url.nick) + regex.match(url.url) || regex.match(url.nick) || + (@bot.config['url.info_on_list'] && regex.match(url.info)) } if list.empty? m.reply "no matches for channel #{channel}" else - reply_urls(m, list, max) + reply_urls :msg => m, :channel => channel, :list => list, :max => max end end end