46 |
46 |
47 local api = _G.require "core.moduleapi"; -- Module API container |
47 local api = _G.require "core.moduleapi"; -- Module API container |
48 |
48 |
49 local modulemap = { ["*"] = {} }; |
49 local modulemap = { ["*"] = {} }; |
50 |
50 |
51 local modulehelpers = setmetatable({}, { __index = _G }); |
|
52 |
|
53 local hooks = multitable_new(); |
|
54 |
|
55 local NULL = {}; |
51 local NULL = {}; |
56 |
52 |
57 -- Load modules when a host is activated |
53 -- Load modules when a host is activated |
58 function load_modules_for_host(host) |
54 function load_modules_for_host(host) |
59 local component = config.get(host, "core", "component_module"); |
55 local component = config.get(host, "core", "component_module"); |
98 local ok, err = call_module_method(mod, "unload"); |
94 local ok, err = call_module_method(mod, "unload"); |
99 if (not ok) and err then |
95 if (not ok) and err then |
100 log("warn", "Non-fatal error unloading module '%s' on '%s': %s", name, host, err); |
96 log("warn", "Non-fatal error unloading module '%s' on '%s': %s", name, host, err); |
101 end |
97 end |
102 end |
98 end |
103 -- unhook event handlers hooked by module:hook |
99 |
104 for event, handlers in pairs(hooks:get(host, name) or NULL) do |
100 for handler, event in pairs(mod.module.event_handlers) do |
105 for handler in pairs(handlers or NULL) do |
101 event.object.remove_handler(event.name, handler); |
106 (hosts[host] or prosody).events.remove_handler(event, handler); |
102 end |
107 end |
103 |
108 end |
|
109 -- unhook event handlers hooked by module:hook_global |
|
110 for event, handlers in pairs(hooks:get("*", name) or NULL) do |
|
111 for handler in pairs(handlers or NULL) do |
|
112 prosody.events.remove_handler(event, handler); |
|
113 end |
|
114 end |
|
115 hooks:remove(host, name); |
|
116 if mod.module.items then -- remove items |
104 if mod.module.items then -- remove items |
117 for key,t in pairs(mod.module.items) do |
105 for key,t in pairs(mod.module.items) do |
118 for i = #t,1,-1 do |
106 for i = #t,1,-1 do |
119 local value = t[i]; |
107 local value = t[i]; |
120 t[i] = nil; |
108 t[i] = nil; |
151 return nil, err; |
139 return nil, err; |
152 end |
140 end |
153 |
141 |
154 local _log = logger.init(host..":"..module_name); |
142 local _log = logger.init(host..":"..module_name); |
155 local api_instance = setmetatable({ name = module_name, host = host, path = err, |
143 local api_instance = setmetatable({ name = module_name, host = host, path = err, |
156 _log = _log, log = function (self, ...) return _log(...); end } |
144 _log = _log, log = function (self, ...) return _log(...); end, event_handlers = {} } |
157 , { __index = api }); |
145 , { __index = api }); |
158 |
146 |
159 local pluginenv = setmetatable({ module = api_instance }, { __index = _G }); |
147 local pluginenv = setmetatable({ module = api_instance }, { __index = _G }); |
160 api_instance.environment = pluginenv; |
148 api_instance.environment = pluginenv; |
161 |
149 |