summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Hecker <mail@apoc.cc>2020-04-16 23:48:42 +0200
committerMatthias Hecker <mail@apoc.cc>2020-04-16 23:48:42 +0200
commit7bee70f012b85c03f73fa3e765417a939e02a5cf (patch)
tree64385c8d40a47a60f9ca3365cf92248f2fc8c6bc
parentff6d7e5d043da99b2da36f628d52b7b5df47119d (diff)
core: sets plugin_path to loaded plugins
While loading a plugin in the manager using #load_botmodule_file this will remember the directory of the file that is being loaded in @next_plugin_path. In the plugin/BotModule initialization we set the path in plugin_path of the plugin. This was the only solution I could find to get this information in the plugin. It is useful because this allows the plugin to know in which directory it is located, it can then easily access data files stored alongside the plugin. Some built-in plugins (see #42) use the data/rbot/templates to copy data files on bot load (see #repopulate_botclass_directory) into the profile directory (~/.rbot/).
-rw-r--r--lib/rbot/plugins.rb11
1 files changed, 11 insertions, 0 deletions
diff --git a/lib/rbot/plugins.rb b/lib/rbot/plugins.rb
index 9589b202..76c76ae1 100644
--- a/lib/rbot/plugins.rb
+++ b/lib/rbot/plugins.rb
@@ -161,6 +161,9 @@ module Plugins
# 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:
#
@@ -191,6 +194,7 @@ module Plugins
@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
@@ -413,6 +417,7 @@ module Plugins
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.
@@ -610,8 +615,14 @@ module Plugins
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