]> git.netwichtig.de Git - user/henk/code/ruby/rbot.git/blobdiff - lib/rbot/plugins.rb
Thu Aug 04 00:11:52 BST 2005 Tom Gilbert <tom@linuxbrit.co.uk>
[user/henk/code/ruby/rbot.git] / lib / rbot / plugins.rb
index 9f88d0c3ea1bb4caa86c31037fd69c80329d5106..4e618f61df0b554b513dc7943e9f39e260f41106 100644 (file)
@@ -1,4 +1,5 @@
 module Irc
+module Plugins
   require 'rbot/messagemapper'
 
   # base class for all rbot plugins
@@ -7,8 +8,8 @@ module Irc
   #
   # map(template, options)::
   #    map is the new, cleaner way to respond to specific message formats
-  #    without littering your plugin code with regexps
-  #    examples:
+  #    without littering your plugin code with regexps. examples:
+  #
   #      plugin.map 'karmastats', :action => 'karma_stats'
   #
   #      # while in the plugin...
@@ -133,7 +134,7 @@ module Irc
 
     # default usage method provided as a utility for simple plugins. The
     # MessageMapper uses 'usage' as its default fallback method.
-    def usage(m, params)
+    def usage(m, params = {})
       m.reply "incorrect usage, ask for help using '#{@bot.nick}: help #{m.plugin}'"
     end
 
@@ -170,25 +171,27 @@ module Irc
     # load plugins from pre-assigned list of directories
     def scan
       dirs = Array.new
-      dirs << CONFIG::DATADIR + "/plugins"
+      dirs << Config::datadir + "/plugins"
       dirs += @dirs
       dirs.each {|dir|
         if(FileTest.directory?(dir))
           d = Dir.new(dir)
-          d.each {|file|
+          d.sort.each {|file|
             next if(file =~ /^\./)
             next unless(file =~ /\.rb$/)
-            @tmpfilename = "#{dir}/#{file}"
+            tmpfilename = "#{dir}/#{file}"
 
             # create a new, anonymous module to "house" the plugin
+            # the idea here is to prevent namespace pollution. perhaps there
+            # is another way?
             plugin_module = Module.new
             
             begin
-              plugin_string = IO.readlines(@tmpfilename).join("")
-              puts "loading module: #{@tmpfilename}"
+              plugin_string = IO.readlines(tmpfilename).join("")
+              debug "loading plugin #{tmpfilename}"
               plugin_module.module_eval(plugin_string)
-            rescue StandardError, NameError, LoadError, SyntaxError => err
-              puts "plugin #{@tmpfilename} load failed: " + err
+            rescue TimeoutError, StandardError, NameError, LoadError, SyntaxError => err
+              puts "warning: plugin #{tmpfilename} load failed: " + err
               puts err.backtrace.join("\n")
             end
           }
@@ -198,28 +201,12 @@ module Irc
 
     # call the save method for each active plugin
     def save
-      @@plugins.values.uniq.each {|p|
-        next unless(p.respond_to?("save"))
-        begin
-          p.save
-        rescue StandardError, NameError, SyntaxError => err
-          puts "plugin #{p.name} save() failed: " + err
-          puts err.backtrace.join("\n")
-        end
-      }
+      delegate 'save'
     end
 
     # call the cleanup method for each active plugin
     def cleanup
-      @@plugins.values.uniq.each {|p|
-        next unless(p.respond_to?("cleanup"))
-        begin
-          p.cleanup
-        rescue StandardError, NameError, SyntaxError => err
-          puts "plugin #{p.name} cleanup() failed: " + err
-          puts err.backtrace.join("\n")
-        end
-      }
+      delegate 'cleanup'
     end
 
     # drop all plugins and rescan plugins on disk
@@ -253,7 +240,7 @@ module Irc
         if(@@plugins.has_key?(key))
           begin
             return @@plugins[key].help(key, params)
-          rescue StandardError, NameError, SyntaxError => err
+          rescue TimeoutError, StandardError, NameError, SyntaxError => err
             puts "plugin #{@@plugins[key].name} help() failed: " + err
             puts err.backtrace.join("\n")
           end
@@ -265,12 +252,12 @@ module Irc
     
     # see if each plugin handles +method+, and if so, call it, passing
     # +message+ as a parameter
-    def delegate(method, message)
+    def delegate(method, *args)
       @@plugins.values.uniq.each {|p|
         if(p.respond_to? method)
           begin
-            p.send method, message
-          rescue StandardError, NameError, SyntaxError => err
+            p.send method, *args
+          rescue TimeoutError, StandardError, NameError, SyntaxError => err
             puts "plugin #{p.name} #{method}() failed: " + err
             puts err.backtrace.join("\n")
           end
@@ -287,7 +274,7 @@ module Irc
           @@bot.auth.allow?(m.plugin, m.source, m.replyto))
         begin
           @@plugins[m.plugin].privmsg(m)
-        rescue StandardError, NameError, SyntaxError => err
+        rescue TimeoutError, StandardError, NameError, SyntaxError => err
           puts "plugin #{@@plugins[m.plugin].name} privmsg() failed: " + err
           puts err.backtrace.join("\n")
         end
@@ -298,3 +285,4 @@ module Irc
   end
 
 end
+end