]> git.netwichtig.de Git - user/henk/code/ruby/rbot.git/blobdiff - data/rbot/plugins/shortenurls.rb
webhook: gitlab support
[user/henk/code/ruby/rbot.git] / data / rbot / plugins / shortenurls.rb
index 743cad08e78ca5eebfe76cdc26e4d940f017edf2..782a4e2723e816671c35b655aec7d03debde6296 100644 (file)
@@ -15,13 +15,27 @@ require "shorturl"
 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")
+  Config.register Config::StringValue.new('shortenurls.favorite_service',
+    :default => 'tinyurl',
+    :desc => "Default shortening service. Probably only applies when other plugins " +
+             "use this one for shortening")
 
   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
@@ -35,7 +49,7 @@ class ShortenURLs < 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)
@@ -43,19 +57,41 @@ class ShortenURLs < Plugin
       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
+    if params.has_key? :service
+      service = params[:service]
+    elsif m != nil and m.plugin != nil
+      service = m.plugin
+    else
+      service = @bot.config['shortenurls.favorite_service']
+    end
+    service = service.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