require "uri"
class ShortenURLs < Plugin
- include WWW
+ # starting from about shorturl 0.8.4, the WWW module is not defined
+ include WWW rescue nil
+
+ Config.register Config::ArrayValue.new('shortenurls.services_blacklist',
+ :default => ['rubyurl', 'shorterlink'],
+ :requires_rescan => true,
+ :desc => "List of nonfunctioning shorturl services")
attr_accessor :services
def initialize
super
+ @blacklist = @bot.config['shortenurls.services_blacklist'].map { |s| s.intern }
# Instead of catering for all the services, we only pick the ones with 'link' or 'url' in the name
- @services = ShortURL.valid_services.select { |service| service.to_s =~ /(?:link|url)/ } << :shorturl
+ @services = ShortURL.valid_services.select { |service| service.to_s =~ /(?:link|url)/ } - @blacklist
+ if @services.include?(:rubyurl)
+ @services << :shorturl
+ end
end
# return a help string when the bot is asked for help on this plugin
url = params[:url]
if url == "help"
m.reply help(m.plugin) unless params[:called]
- return
+ return nil
end
begin
to_uri = URI.parse(url)
raise URI::InvalidURIError if to_uri.class == URI::Generic
rescue URI::InvalidURIError
m.reply "#{url} doesn't look like an URL to me ..." unless params[:called]
- return
+ return nil
end
- service = params[:service] || m.plugin.to_sym
+ service = (params[:service] || m.plugin).to_sym
service = :rubyurl if service == :shorturl
- short = WWW::ShortURL.shorten(url, service)
+ tried = []
+ short = nil
- if params[:called]
- return short
- else
- m.reply "#{url} shortened to #{short}"
+ begin
+ tried << service
+ raise InvalidService, "#{service} blacklisted" if @blacklist.include?(service)
+ short = ShortURL.shorten(url, service)
+ raise InvalidService, "#{service} returned an empty string for #{url}" unless short and not short.empty?
+ rescue InvalidService
+ pool = services - tried
+ if pool.empty?
+ m.reply "#{service} failed, and I don't know what else to try next" unless params[:called]
+ return nil
+ else
+ service = pool.pick_one
+ m.reply "#{tried.last} failed, I'll try #{service} instead" unless params[:called]
+ retry
+ end
end
+
+ m.reply "#{url} shortened to #{short}" unless params[:called]
+ return short
end
end