X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=lib%2Frbot%2Fplugins.rb;h=9a41610f6e4961b9fb6de8431e80b8674d8d6cfd;hb=5079554263a9a2c8c661c1c8728b4ce1a0bbd05a;hp=00fc423457a6a39bd82117e25202b00408baaaec;hpb=be5d914984e767ce1a718b84d0bad1c88d9f8ea3;p=user%2Fhenk%2Fcode%2Fruby%2Frbot.git diff --git a/lib/rbot/plugins.rb b/lib/rbot/plugins.rb old mode 100755 new mode 100644 index 00fc4234..9a41610f --- a/lib/rbot/plugins.rb +++ b/lib/rbot/plugins.rb @@ -10,6 +10,9 @@ class Bot Config.register Config::ArrayValue.new('plugins.blacklist', :default => [], :wizard => false, :requires_rescan => true, :desc => "Plugins that should not be loaded") + Config.register Config::ArrayValue.new('plugins.whitelist', + :default => [], :wizard => false, :requires_rescan => true, + :desc => "Only whitelisted plugins will be loaded unless the list is empty") module Plugins require 'rbot/messagemapper' @@ -338,6 +341,15 @@ module Plugins # MessageMapper uses 'usage' as its default fallback method. # def usage(m, params = {}) + if params[:failures].respond_to? :find + friendly = params[:failures].find do |f| + f.kind_of? MessageMapper::FriendlyFailure + end + if friendly + m.reply friendly.friendly + return + end + end m.reply(_("incorrect usage, ask for help using '%{command}'") % {:command => "#{@bot.nick}: help #{m.plugin}"}) end @@ -561,6 +573,7 @@ module Plugins return :loaded rescue Exception => err # rescue TimeoutError, StandardError, NameError, LoadError, SyntaxError => err + raise if err.kind_of? DBFatal error report_error("#{desc}#{fname} load failed", err) bt = err.backtrace.select { |line| line.match(/^(\(eval\)|#{fname}):\d+/) @@ -570,10 +583,27 @@ module Plugins "#{fname}#{$1}#{$3}" } } - msg = err.to_str.gsub(/^\(eval\)(:\d+)(:in `.*')?(:.*)?/) { |m| + msg = err.to_s.gsub(/^\(eval\)(:\d+)(:in `.*')?(:.*)?/) { |m| "#{fname}#{$1}#{$3}" } - newerr = err.class.new(msg) + begin + newerr = err.class.new(msg) + rescue ArgumentError => err_in_err + # Somebody should hang the ActiveSupport developers by their balls + # with barbed wire. Their MissingSourceFile extension to LoadError + # _expects_ a second argument, breaking the usual Exception interface + # (instead, the smart thing to do would have been to make the second + # parameter optional and run the code in the from_message method if + # it was missing). + # Anyway, we try to cope with this in the simplest possible way. On + # the upside, this new block can be extended to handle other similar + # idiotic approaches + if err.class.respond_to? :from_message + newerr = err.class.from_message(msg) + else + raise err_in_err + end + end newerr.set_backtrace(bt) return newerr end @@ -614,6 +644,10 @@ module Plugins pn = p + ".rb" processed[pn.intern] = :blacklisted } + + whitelist = @bot.config['plugins.whitelist'].map { |p| + p + ".rb" + } end dirs.each do |dir| @@ -625,7 +659,10 @@ module Plugins case type when :plugins - if processed.has_key?(file.intern) + if !whitelist.empty? && !whitelist.include?(file) + @ignored << {:name => file, :dir => dir, :reason => :"not whitelisted" } + next + elsif processed.has_key?(file.intern) @ignored << {:name => file, :dir => dir, :reason => processed[file.intern]} next end @@ -905,7 +942,7 @@ module Plugins rescue Exception => err raise if err.kind_of?(SystemExit) error report_error("#{p.botmodule_class} #{p.name} #{method}() failed:", err) - raise if err.kind_of?(BDB::Fatal) + raise if err.kind_of?(DBFatal) end } else @@ -921,7 +958,7 @@ module Plugins rescue Exception => err raise if err.kind_of?(SystemExit) error report_error("#{p.botmodule_class} #{p.name} #{method}() failed:", err) - raise if err.kind_of?(BDB::Fatal) + raise if err.kind_of?(DBFatal) end end } @@ -951,7 +988,7 @@ module Plugins rescue Exception => err raise if err.kind_of?(SystemExit) error report_error("#{p.botmodule_class} #{p.name} privmsg() failed:", err) - raise if err.kind_of?(BDB::Fatal) + raise if err.kind_of?(DBFatal) end debug "Successfully delegated #{m.inspect}" return true