X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=lib%2Frbot%2Fplugins.rb;h=4e618f61df0b554b513dc7943e9f39e260f41106;hb=e7558ab501d89ed4d04ff69b58344aec8de50844;hp=8d9dcfc9f9736ca5ba25243b4eb1997b9571f5ad;hpb=8caeee3853ef66dd0e326ff17906f9ca544b8a35;p=user%2Fhenk%2Fcode%2Fruby%2Frbot.git diff --git a/lib/rbot/plugins.rb b/lib/rbot/plugins.rb index 8d9dcfc9..4e618f61 100644 --- a/lib/rbot/plugins.rb +++ b/lib/rbot/plugins.rb @@ -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("") - debug "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 "warning: 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