X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;ds=sidebyside;f=data%2Frbot%2Fplugins%2Furl.rb;h=3faeeab91e33ea056d97d77cf2f10a56c56c7cc3;hb=6cf365c49ce5fbe24c0a4ff0663550390b501fea;hp=e1c9b47396e3bd2a782f47197c4fa64d38af54a9;hpb=80bf1a038e53fc1f179e444e91ed06ec4bfbc6b7;p=user%2Fhenk%2Fcode%2Fruby%2Frbot.git
diff --git a/data/rbot/plugins/url.rb b/data/rbot/plugins/url.rb
index e1c9b473..3faeeab9 100644
--- a/data/rbot/plugins/url.rb
+++ b/data/rbot/plugins/url.rb
@@ -15,12 +15,24 @@ 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.)")
Config.register Config::BooleanValue.new('url.first_par',
:default => false,
:desc => "Also try to get the first paragraph of a web page")
+ Config.register Config::IntegerValue.new('url.first_par_length',
+ :default => 150,
+ :desc => "The max length of the first paragraph")
+ Config.register Config::ArrayValue.new('url.first_par_whitelist',
+ :default => ['twitter.com'],
+ :desc => "List of url patterns to show the content for.")
Config.register Config::BooleanValue.new('url.info_on_list',
:default => false,
:desc => "Show link info when listing/searching for urls")
@@ -28,7 +40,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 +54,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 +88,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
@@ -79,15 +98,31 @@ class UrlPlugin < Plugin
begin
debug "+ getting info for #{url.request_uri}"
- info = Utils.get_html_info(url)
- debug info
+ info = @bot.filter(:htmlinfo, url)
+ logopts[:htmlinfo] = info
resp = info[:headers]
logopts[:title] = title = info[:title]
if info[:content]
logopts[:extra] = info[:content]
- extra << "#{Bold}text#{Bold}: #{info[:content]}" if @bot.config['url.first_par']
+
+ max_length = @bot.config['url.first_par_length']
+
+ whitelist = @bot.config['url.first_par_whitelist']
+ content = nil
+ if whitelist.length > 0
+ whitelist.each do |pattern|
+ if Regexp.new(pattern, Regexp::IGNORECASE).match(url.to_s)
+ content = info[:content][0...max_length]
+ break
+ end
+ end
+ else
+ content = info[:content][0...max_length]
+ end
+
+ extra << "#{Bold}text#{Bold}: #{content}" if @bot.config['url.first_par'] and content
else
logopts[:extra] = String.new
logopts[:extra] << "Content Type: #{resp['content-type']}"
@@ -120,7 +155,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
@@ -128,29 +179,48 @@ class UrlPlugin < Plugin
urls_displayed = 0
urls.each do |urlstr|
debug "working on #{urlstr}"
- next unless urlstr =~ /^https?:/
+ 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)
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?:\/\/./
+ 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 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
@@ -173,17 +243,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={})