X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=data%2Frbot%2Fplugins%2Furl.rb;h=8327dd945d169c0d1c3282e547fef01d08f1c32e;hb=052217de30c59206d7025b582d4604557a747470;hp=6e03e75bc9e42175eed8616a4d8706e64ca3ca72;hpb=9f784d3c8a3e3b3fa3c57c196bdc2b9975d952b1;p=user%2Fhenk%2Fcode%2Fruby%2Frbot.git diff --git a/data/rbot/plugins/url.rb b/data/rbot/plugins/url.rb index 6e03e75b..8327dd94 100644 --- a/data/rbot/plugins/url.rb +++ b/data/rbot/plugins/url.rb @@ -15,6 +15,12 @@ class UrlPlugin < Plugin Config.register Config::IntegerValue.new('url.display_link_info', :default => 0, :desc => "Get the title of links pasted to the channel and display it (also tells if the link is broken or the site is down). Do it for at most this many links per line (set to 0 to disable)") + Config.register Config::BooleanValue.new('url.auto_shorten', + :default => false, + :desc => "Automatically spit out shortened URLs when they're seen. Check shortenurls for config options") + Config.register Config::IntegerValue.new('url.auto_shorten_min_length', + :default => 48, + :desc => "Minimum length of URL to auto-shorten. Only has an effect when url.auto_shorten is true.") Config.register Config::BooleanValue.new('url.titles_only', :default => false, :desc => "Only show info for links that have tags (in other words, don't display info for jpegs, mpegs, etc.)") @@ -28,7 +34,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 +48,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 @@ -69,7 +82,7 @@ class UrlPlugin < Plugin checks.flatten! unless checks.grep(@no_info_hosts).empty? - return "Sorry, info retrieval for #{url.host} (#{checks.first}) is disabled" + return ( opts[:always_reply] ? "Sorry, info retrieval for #{url.host} (#{checks.first}) is disabled" : false ) end logopts = opts.dup @@ -81,6 +94,7 @@ class UrlPlugin < Plugin debug "+ getting info for #{url.request_uri}" info = @bot.filter(:htmlinfo, url) debug info + logopts[:htmlinfo] = info resp = info[:headers] logopts[:title] = title = info[:title] @@ -120,7 +134,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 @@ -129,11 +159,17 @@ class UrlPlugin < Plugin urls.each do |urlstr| debug "working on #{urlstr}" next unless urlstr =~ /^https?:\/\/./ + if @bot.config['url.auto_shorten'] == true and + urlstr.length >= @bot.config['url.auto_shorten_min_length'] + m.reply(bot.plugins['shortenurls'].shorten(nil, {:url=>urlstr, :called=>true})) + next + end 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) @@ -145,16 +181,25 @@ class UrlPlugin < Plugin # 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?:\/\/./ + # chop off last non-word character from the unescaped version of + # the URL, and retry if we still have enough string to look like a + # minimal URL + unescaped = URI.unescape(urlstr) + debug "Unescaped: #{unescaped}" + if unescaped.sub!(/\W$/,'') and unescaped =~ /^https?:\/\/./ + urlstr.replace URI.escape(unescaped, OUR_UNSAFE) + retry + else + debug "Not retrying #{unescaped}" + end end reply = "Error #{e.message}" end if display_info > urls_displayed if reply - m.plainreply(reply, :overlong => :truncate) + m.reply reply, :overlong => :truncate, :to => :public, + :nick => (m.address? ? :auto : false) urls_displayed += 1 end end @@ -177,7 +222,12 @@ 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 message(m) @@ -186,7 +236,7 @@ class UrlPlugin < Plugin 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={})