X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=data%2Frbot%2Fplugins%2Furl.rb;h=ad8951212362b6c26bcad57403c2b73412cfaf38;hb=7f244f32d974cafa74f449853f940f194d08d6d2;hp=524b0858aaab183e9d0b440e87fea03c03f1ac6f;hpb=250407932afa3932c1357de1acf67d54cd12481b;p=user%2Fhenk%2Fcode%2Fruby%2Frbot.git diff --git a/data/rbot/plugins/url.rb b/data/rbot/plugins/url.rb index 524b0858..ad895121 100644 --- a/data/rbot/plugins/url.rb +++ b/data/rbot/plugins/url.rb @@ -28,7 +28,12 @@ class UrlPlugin < Plugin :default => ['localhost', '^192\.168\.', '^10\.', '^127\.', '^172\.(1[6-9]|2\d|31)\.'], :on_change => Proc.new { |bot, v| bot.plugins['url'].reset_no_info_hosts }, :desc => "A list of regular expressions matching hosts for which no info should be provided") - + Config.register Config::ArrayValue.new('url.only_on_channels', + :desc => "Show link info only on these channels", + :default => []) + Config.register Config::ArrayValue.new('url.ignore', + :desc => "Don't show link info for urls from users represented as hostmasks on this list. Useful for ignoring other bots, for example.", + :default => []) def initialize super @@ -37,6 +42,8 @@ class UrlPlugin < Plugin @bot.config.items[:'url.display_link_info'].set_string(@bot.config['url.display_link_info'].to_s) end reset_no_info_hosts + self.filter_group = :htmlinfo + load_filters end def reset_no_info_hosts @@ -57,8 +64,19 @@ class UrlPlugin < Plugin url = uri_str.kind_of?(URI) ? uri_str : URI.parse(uri_str) return if url.scheme !~ /https?/ - if url.host =~ @no_info_hosts - return "Sorry, info retrieval for #{url.host} is disabled" + # also check the ip, the canonical name and the aliases + begin + checks = TCPSocket.gethostbyname(url.host) + checks.delete_at(-2) + rescue => e + return "Unable to retrieve info for #{url.host}: #{e.message}" + end + + checks << url.host + checks.flatten! + + unless checks.grep(@no_info_hosts).empty? + return ( opts[:always_reply] ? "Sorry, info retrieval for #{url.host} (#{checks.first}) is disabled" : false ) end logopts = opts.dup @@ -68,7 +86,7 @@ class UrlPlugin < Plugin begin debug "+ getting info for #{url.request_uri}" - info = Utils.get_html_info(url) + info = @bot.filter(:htmlinfo, url) debug info resp = info[:headers] @@ -109,7 +127,23 @@ class UrlPlugin < Plugin 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']) + def handle_urls(m, params={}) + opts = { + :display_info => @bot.config['url.display_link_info'], + :channels => @bot.config['url.only_on_channels'], + :ignore => @bot.config['url.ignore'] + }.merge params + urls = opts[:urls] + display_info= opts[:display_info] + channels = opts[:channels] + ignore = opts[:ignore] + + unless channels.empty? + return unless channels.map { |c| c.downcase }.include?(m.channel.downcase) + end + + ignore.each { |u| return if m.source.matches?(u) } + return if urls.empty? debug "found urls #{urls.inspect}" list = m.public? ? @registry[m.target] : nil @@ -117,22 +151,35 @@ class UrlPlugin < Plugin urls_displayed = 0 urls.each do |urlstr| debug "working on #{urlstr}" - next unless urlstr =~ /^https?:/ + 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 - m.reply "Error #{e.message}" + 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 title - m.reply("#{LINK_INFO} #{title}", :overlong => :truncate) + if reply + m.reply reply, :overlong => :truncate, :to => :public, + :nick => (m.address? ? :auto : false) urls_displayed += 1 end end @@ -155,17 +202,21 @@ class UrlPlugin < Plugin 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) } + Thread.new do + handle_urls(m, + :urls => urls, + :display_info => params[:urls].length, + :channels => []) + end end - def listen(m) - return unless m.kind_of?(PrivMessage) + def message(m) return if m.address? escaped = URI.escape(m.message, OUR_UNSAFE) urls = URI.extract(escaped, ['http', 'https']) return if urls.empty? - Thread.new { handle_urls(m, urls) } + Thread.new { handle_urls(m, :urls => urls) } end def reply_urls(opts={})