Examples:
- plugin.map 'karmastats', :action => 'karma_stats'
+ plugin.map 'pointstats', :action => 'point_stats'
# while in the plugin...
- def karma_stats(m, params)
+ def point_stats(m, params)
m.reply "..."
end
# the default action is the first component
- plugin.map 'karma'
+ plugin.map 'points'
# attributes can be pulled out of the match string
- plugin.map 'karma for :key'
- plugin.map 'karma :key'
+ plugin.map 'points for :key'
+ plugin.map 'points :key'
# while in the plugin...
- def karma(m, params)
+ def points(m, params)
item = params[:key]
- m.reply 'karma for #{item}'
+ m.reply 'points for #{item}'
end
# you can setup defaults, to make parameters optional
- plugin.map 'karma :key', :defaults => {:key => 'defaultvalue'}
+ plugin.map 'points :key', :defaults => {:key => 'defaultvalue'}
# the default auth check is also against the first component
# but that can be changed
- plugin.map 'karmastats', :auth => 'karma'
+ plugin.map 'pointstats', :auth => 'points'
# maps can be restricted to public or private message:
- plugin.map 'karmastats', :private => false
- plugin.map 'karmastats', :public => false
+ plugin.map 'pointstats', :private => false
+ plugin.map 'pointstats', :public => false
See MessageMapper#map for more information on the template format and the
allowed options.
# the message map handler
attr_reader :handler
+ # the directory in which the plugin is located
+ attr_reader :plugin_path
+
# Initialise your bot module. Always call super if you override this method,
# as important variables are set up for you:
#
@registry = @bot.registry_factory.create(@bot.path, self.class.to_s.gsub(/^.*::/, ''))
@manager.add_botmodule(self)
+ @plugin_path = @manager.next_plugin_path
if self.respond_to?('set_language')
self.set_language(@bot.lang.language)
end
@registry.flush
end
+
# Method called to cleanup before the plugin is unloaded. If you overload
# this method to handle additional cleanup tasks, remember to call super()
# so that the default cleanup actions are taken care of as well.
attr_reader :core_module_dirs
attr_reader :plugin_dirs
+ attr_reader :next_plugin_path
# This is the list of patterns commonly delegated to plugins.
# A fast delegation lookup is enabled for them.
([str, err.inspect] + err.backtrace).join("\n")
end
+ def get_plugin(name)
+ plugins.find { |plugin| plugin.name == name }
+ end
+
# This method is the one that actually loads a module from the
# file _fname_
#
begin
plugin_string = IO.read(fname)
debug "loading #{desc}#{fname}"
+
+ # set path of the plugin that will be loaded next (see BotModule#initialize)
+ @next_plugin_path = File.dirname fname
+
plugin_module.module_eval(plugin_string, fname)
+ @next_plugin_path = nil
+
return :loaded
rescue Exception => err
# rescue TimeoutError, StandardError, NameError, LoadError, SyntaxError => err
# idiotic approaches
if err.class.respond_to? :from_message
newerr = err.class.from_message(msg)
+ elsif ([:file, :line, :column, :offset, :problem, :context] & err.methods).length == 6
+ # Another ‘brillian’ overload, this time from Psych::SyntaxError
+ # In this case we'll just leave the message as-is
+ newerr = err.dup
else
raise aerr_in_err
end
return newerr
end
end
- private :load_botmodule_file
# add one or more directories to the list of directories to
# load core modules from
sort_modules unless @sorted_modules
opts = {}
- opts.merge(args.pop) if args.last.class == Hash
+ opts.merge!(args.pop) if args.last.class == Hash
m = args.first
if BasicUserMessage === m