]> git.netwichtig.de Git - user/henk/code/ruby/rbot.git/blobdiff - data/rbot/plugins/fortune.rb
plugins/keywords: add method that was missing from commit 7cac523563de6473d2f93fd2d05 ...
[user/henk/code/ruby/rbot.git] / data / rbot / plugins / fortune.rb
index e530ae3e84c82d5067e3efa5f3748d30b9db9f86..adb6a839a656a0897387508d6792ed63792b222d 100644 (file)
@@ -1,21 +1,28 @@
+#-- vim:sw=2:et
+#++
+#
+# :title: Fortune plugin
+
 class FortunePlugin < Plugin
-  BotConfig.register BotConfigStringValue.new('fortune.path',
+  Config.register Config::StringValue.new('fortune.path',
     :default => '',
     :desc => "Full path to the fortune executable")
 
   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
+
+
+  ## Pick a fortune
   def fortune(m, params)
     db = params[:db]
     fortune = @bot.config['fortune.path']
     if fortune.empty?
-      ["/usr/share/games/fortune",
+      ["/usr/bin/fortune",
        "/usr/share/bin/fortune",
        "/usr/games/fortune",
-       "/usr/bin/fortune",
        "/usr/local/games/fortune",
-       "/usr/local/bin/fortune"].each {|f|
+       "/usr/local/bin/fortune"].each do |f|
           if FileTest.executable? f
             fortune = f
 
@@ -31,19 +38,53 @@ class FortunePlugin < Plugin
 
             break
           end
-        }
+        end
     end
-    m.reply "fortune binary not found" unless fortune
+    m.reply "fortune executable not found (try setting the 'fortune.path' variable)" unless fortune
+
     begin
-      ret = Utils.safe_exec(fortune, "-n", "255", "-s", db)
+      ret = Utils.safe_exec(fortune, "-n", "350", "-s", db)
+
+      ## 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.gsub(/\t/, "  ").split(/\n/).join(" ")
-    return
+
+    m.reply ret
+  end
+
+
+  # Print the fortune categories
+  def categories(m, params)
+    ## list all fortune files in /usr/share/games/fortune
+    categories = Dir["/usr/share/games/fortune/*"].select{ |f|
+      File.split(f).last.match(/^\w+$/)
+    }.select{ |f|
+      File.file?(f)
+    }.map{ |p|
+      File.split(p).last
+    }.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-]+$/}