]> git.netwichtig.de Git - user/henk/code/ruby/rbot.git/blobdiff - data/rbot/plugins/fortune.rb
plugin(points): forgot one special case, see #34
[user/henk/code/ruby/rbot.git] / data / rbot / plugins / fortune.rb
index 184b6b1382d344d9b51ef9e9003ee5a1ee021395..fc54aebc353cda9220640cc8130b068a6878450c 100644 (file)
+#-- vim:sw=2:et
+#++
+#
+# :title: Fortune plugin
+
 class FortunePlugin < Plugin
+  Config.register Config::StringValue.new('fortune.path',
+    :default => '',
+    :desc => "Full path to the fortune executable")
+  Config.register Config::ArrayValue.new('fortune.options',
+    :default => ['-n', '350', '-s'],
+    :desc => "Options to be passed on to fortune")
+
   def help(plugin, topic="")
-    "fortune [<module>] => get a (short) fortune, optionally specifying fortune db"
+    "fortune [<category>] => get a (short) fortune, optionally specifying fortune category || fortune categories => show categories"
   end
-  def fortune(m, params)
-    db = params[:db]
-    fortune = nil
-    ["/usr/games/fortune", "/usr/bin/fortune", "/usr/local/bin/fortune"].each {|f|
+
+  def find_fortune(m)
+    fortune = @bot.config['fortune.path']
+    return fortune if fortune and not fortune.empty?
+
+    ["/usr/bin/fortune",
+     "/usr/share/bin/fortune",
+     "/usr/games/fortune",
+     "/usr/local/games/fortune",
+     "/usr/local/bin/fortune"].each do |f|
       if FileTest.executable? f
         fortune = f
         break
       end
-    }
-    m.reply "fortune binary not found" unless fortune
-    ret = Utils.safe_exec(fortune, "-n", "255", "-s", db)
-    m.reply ret.gsub(/\t/, "  ").split(/\n/).join(" ")
-    return
+    end
+
+    return nil unless fortune
+
+    # Try setting the config entry
+    config_par = {:key => 'fortune.path', :value => [fortune], :silent => true }
+    debug "Setting fortune.path to #{fortune}"
+    set_path = @bot.plugins['config'].handle_set(m, config_par)
+    if set_path
+      debug "fortune.path set to #{@bot.config['fortune.path']}"
+    else
+      debug "couldn't set fortune.path"
+    end
+
+    return fortune
+  end
+
+  ## Pick a fortune
+  def fortune(m, params)
+    fortune = find_fortune(m)
+    if not fortune or fortune.empty?
+      m.reply "fortune executable not found (try setting the 'fortune.path' variable)"
+      return
+    end
+
+    command = [fortune] + @bot.config['fortune.options']
+    command << params[:db]
+    command.compact!
+
+    begin
+      ret = Utils.safe_exec(*command)
+
+      ## cleanup ret
+      ret = ret.split(/\n+/).map do |l|
+        # check if this is a "  -- Some Dood" line
+        if l =~ /^\s+-{1,3}\s+\w/
+          # turn "-" into "--"
+          l.gsub!(/^\s+-\s/, '-- ')
+          # extra space
+          " " + l.strip
+        else
+          # just remove leading and trailing whitespace
+          l.strip
+        end
+      end.join(" ")
+
+    rescue
+      ret = "failed to execute fortune"
+      # TODO reset fortune.path when execution fails
+    end
+
+    m.reply ret
+  end
+
+  # Print the fortune categories
+  def categories(m, params)
+    fortune = find_fortune(m)
+    if not fortune or fortune.empty?
+      m.reply "fortune executable not found (try setting the 'fortune.path' variable)"
+      return
+    end
+
+    ## list all fortune databases
+    categories = Utils.safe_exec(fortune, "-f").split(/\n+ */).map{ |f|
+      f.split[1]
+    }.select{ |f|
+      f[0..0] != '/'
+    }.sort
+
+    ## say 'em!
+    m.reply "Fortune categories: #{categories.join ', '}"
   end
+
 end
 plugin = FortunePlugin.new
-plugin.map 'fortune :db', :defaults => {:db => 'fortunes'},
+plugin.map 'fortune categories', :action => "categories"
+plugin.map 'fortune list', :action => "categories"
+plugin.map 'fortune :db', :defaults => {:db => ''},
                           :requirements => {:db => /^[^-][\w-]+$/}