Mercurial > prosody-hg
comparison core/moduleapi.lua @ 6666:42fdc8dddf04
Merge 0.10->trunk
| author | Matthew Wild <mwild1@gmail.com> |
|---|---|
| date | Wed, 06 May 2015 19:26:53 +0100 |
| parents | 0c363fddcdd9 0a494394cd3e |
| children | e813e8cf6046 |
comparison
equal
deleted
inserted
replaced
| 6650:cf15b18e9810 | 6666:42fdc8dddf04 |
|---|---|
| 8 | 8 |
| 9 local config = require "core.configmanager"; | 9 local config = require "core.configmanager"; |
| 10 local modulemanager; -- This gets set from modulemanager | 10 local modulemanager; -- This gets set from modulemanager |
| 11 local array = require "util.array"; | 11 local array = require "util.array"; |
| 12 local set = require "util.set"; | 12 local set = require "util.set"; |
| 13 local it = require "util.iterators"; | |
| 13 local logger = require "util.logger"; | 14 local logger = require "util.logger"; |
| 14 local pluginloader = require "util.pluginloader"; | 15 local pluginloader = require "util.pluginloader"; |
| 15 local timer = require "util.timer"; | 16 local timer = require "util.timer"; |
| 16 local resolve_relative_path = require"util.paths".resolve_relative_path; | 17 local resolve_relative_path = require"util.paths".resolve_relative_path; |
| 17 local measure = require "core.statsmanager".measure; | 18 local measure = require "core.statsmanager".measure; |
| 19 local st = require "util.stanza"; | |
| 18 | 20 |
| 19 local t_insert, t_remove, t_concat = table.insert, table.remove, table.concat; | 21 local t_insert, t_remove, t_concat = table.insert, table.remove, table.concat; |
| 20 local error, setmetatable, type = error, setmetatable, type; | 22 local error, setmetatable, type = error, setmetatable, type; |
| 21 local ipairs, pairs, select = ipairs, pairs, select; | 23 local ipairs, pairs, select = ipairs, pairs, select; |
| 22 local tonumber, tostring = tonumber, tostring; | 24 local tonumber, tostring = tonumber, tostring; |
| 54 | 56 |
| 55 function api:set_global() | 57 function api:set_global() |
| 56 self.host = "*"; | 58 self.host = "*"; |
| 57 -- Update the logger | 59 -- Update the logger |
| 58 local _log = logger.init("mod_"..self.name); | 60 local _log = logger.init("mod_"..self.name); |
| 59 self.log = function (self, ...) return _log(...); end; | 61 self.log = function (self, ...) return _log(...); end; --luacheck: ignore self |
| 60 self._log = _log; | 62 self._log = _log; |
| 61 self.global = true; | 63 self.global = true; |
| 62 end | 64 end |
| 63 | 65 |
| 64 function api:add_feature(xmlns) | 66 function api:add_feature(xmlns) |
| 65 self:add_item("feature", xmlns); | 67 self:add_item("feature", xmlns); |
| 66 end | 68 end |
| 67 function api:add_identity(category, type, name) | 69 function api:add_identity(category, identity_type, name) |
| 68 self:add_item("identity", {category = category, type = type, name = name}); | 70 self:add_item("identity", {category = category, type = identity_type, name = name}); |
| 69 end | 71 end |
| 70 function api:add_extension(data) | 72 function api:add_extension(data) |
| 71 self:add_item("extension", data); | 73 self:add_item("extension", data); |
| 72 end | 74 end |
| 73 function api:has_feature(xmlns) | 75 function api:has_feature(xmlns) |
| 74 for _, feature in ipairs(self:get_host_items("feature")) do | 76 for _, feature in ipairs(self:get_host_items("feature")) do |
| 75 if feature == xmlns then return true; end | 77 if feature == xmlns then return true; end |
| 76 end | 78 end |
| 77 return false; | 79 return false; |
| 78 end | 80 end |
| 79 function api:has_identity(category, type, name) | 81 function api:has_identity(category, identity_type, name) |
| 80 for _, id in ipairs(self:get_host_items("identity")) do | 82 for _, id in ipairs(self:get_host_items("identity")) do |
| 81 if id.category == category and id.type == type and id.name == name then | 83 if id.category == category and id.type == identity_type and id.name == name then |
| 82 return true; | 84 return true; |
| 83 end | 85 end |
| 84 end | 86 end |
| 85 return false; | 87 return false; |
| 86 end | 88 end |
| 93 self.event_handlers:set(object, event, handler, true); | 95 self.event_handlers:set(object, event, handler, true); |
| 94 return object.add_handler(event, handler, priority); | 96 return object.add_handler(event, handler, priority); |
| 95 end | 97 end |
| 96 | 98 |
| 97 function api:unhook_object_event(object, event, handler) | 99 function api:unhook_object_event(object, event, handler) |
| 100 self.event_handlers:set(object, event, handler, nil); | |
| 98 return object.remove_handler(event, handler); | 101 return object.remove_handler(event, handler); |
| 99 end | 102 end |
| 100 | 103 |
| 101 function api:hook(event, handler, priority) | 104 function api:hook(event, handler, priority) |
| 102 return self:hook_object_event((hosts[self.host] or prosody).events, event, handler, priority); | 105 return self:hook_object_event((hosts[self.host] or prosody).events, event, handler, priority); |
| 129 function api:wrap_event(event, handler) | 132 function api:wrap_event(event, handler) |
| 130 return self:wrap_object_event((hosts[self.host] or prosody).events, event, handler); | 133 return self:wrap_object_event((hosts[self.host] or prosody).events, event, handler); |
| 131 end | 134 end |
| 132 | 135 |
| 133 function api:wrap_global(event, handler) | 136 function api:wrap_global(event, handler) |
| 134 return self:hook_object_event(prosody.events, event, handler, priority); | 137 return self:hook_object_event(prosody.events, event, handler); |
| 135 end | 138 end |
| 136 | 139 |
| 137 function api:require(lib) | 140 function api:require(lib) |
| 138 local f, n = pluginloader.load_code(self.name, lib..".lib.lua", self.environment); | 141 local f, n = pluginloader.load_code(self.name, lib..".lib.lua", self.environment); |
| 139 if not f then | 142 if not f then |
| 327 function api:get_host_items(key) | 330 function api:get_host_items(key) |
| 328 local result = modulemanager.get_items(key, self.host) or {}; | 331 local result = modulemanager.get_items(key, self.host) or {}; |
| 329 return result; | 332 return result; |
| 330 end | 333 end |
| 331 | 334 |
| 332 function api:handle_items(type, added_cb, removed_cb, existing) | 335 function api:handle_items(item_type, added_cb, removed_cb, existing) |
| 333 self:hook("item-added/"..type, added_cb); | 336 self:hook("item-added/"..item_type, added_cb); |
| 334 self:hook("item-removed/"..type, removed_cb); | 337 self:hook("item-removed/"..item_type, removed_cb); |
| 335 if existing ~= false then | 338 if existing ~= false then |
| 336 for _, item in ipairs(self:get_host_items(type)) do | 339 for _, item in ipairs(self:get_host_items(item_type)) do |
| 337 added_cb({ item = item }); | 340 added_cb({ item = item }); |
| 338 end | 341 end |
| 339 end | 342 end |
| 340 end | 343 end |
| 341 | 344 |
| 362 | 365 |
| 363 function api:send(stanza) | 366 function api:send(stanza) |
| 364 return core_post_stanza(hosts[self.host], stanza); | 367 return core_post_stanza(hosts[self.host], stanza); |
| 365 end | 368 end |
| 366 | 369 |
| 370 function api:broadcast(jids, stanza, iter) | |
| 371 for jid in (iter or it.values)(jids) do | |
| 372 local new_stanza = st.clone(stanza); | |
| 373 new_stanza.attr.to = jid; | |
| 374 core_post_stanza(hosts[self.host], new_stanza); | |
| 375 end | |
| 376 end | |
| 377 | |
| 367 local timer_methods = { } | 378 local timer_methods = { } |
| 368 local timer_mt = { | 379 local timer_mt = { |
| 369 __index = timer_methods; | 380 __index = timer_methods; |
| 370 } | 381 } |
| 371 function timer_methods:stop( ) | 382 function timer_methods:stop( ) |
| 397 function api:load_resource(path, mode) | 408 function api:load_resource(path, mode) |
| 398 path = resolve_relative_path(self:get_directory(), path); | 409 path = resolve_relative_path(self:get_directory(), path); |
| 399 return io.open(path, mode); | 410 return io.open(path, mode); |
| 400 end | 411 end |
| 401 | 412 |
| 402 function api:open_store(name, type) | 413 function api:open_store(name, store_type) |
| 403 return require"core.storagemanager".open(self.host, name or self.name, type); | 414 return require"core.storagemanager".open(self.host, name or self.name, store_type); |
| 404 end | 415 end |
| 405 | 416 |
| 406 function api:measure(name, type) | 417 function api:measure(name, stat_type) |
| 407 return measure(type, "/"..self.host.."/mod_"..self.name.."/"..name); | 418 return measure(stat_type, "/"..self.host.."/mod_"..self.name.."/"..name); |
| 408 end | 419 end |
| 409 | 420 |
| 410 function api:measure_object_event(events_object, event_name, stat_name) | 421 function api:measure_object_event(events_object, event_name, stat_name) |
| 411 local m = self:measure(stat_name or event_name, "duration"); | 422 local m = self:measure(stat_name or event_name, "duration"); |
| 412 local function handler(handlers, event_name, event_data) | 423 local function handler(handlers, _event_name, _event_data) |
| 413 local finished = m(); | 424 local finished = m(); |
| 414 local ret = handlers(event_name, event_data); | 425 local ret = handlers(_event_name, _event_data); |
| 415 finished(); | 426 finished(); |
| 416 return ret; | 427 return ret; |
| 417 end | 428 end |
| 418 return self:hook_object_event(events_object, event_name, handler); | 429 return self:hook_object_event(events_object, event_name, handler); |
| 419 end | 430 end |
| 420 | 431 |
| 421 function api:measure_event(event_name, stat_name) | 432 function api:measure_event(event_name, stat_name) |
| 422 return self:hook_object_event((hosts[self.host] or prosody).events.wrappers, event_name, handler); | 433 return self:measure_object_event((hosts[self.host] or prosody).events.wrappers, event_name, stat_name); |
| 423 end | 434 end |
| 424 | 435 |
| 425 function api:measure_global_event(event_name, stat_name) | 436 function api:measure_global_event(event_name, stat_name) |
| 426 return self:hook_object_event(prosody.events.wrappers, event_name, handler); | 437 return self:measure_object_event(prosody.events.wrappers, event_name, stat_name); |
| 427 end | 438 end |
| 428 | 439 |
| 429 function api.init(mm) | 440 function api.init(mm) |
| 430 modulemanager = mm; | 441 modulemanager = mm; |
| 431 return api; | 442 return api; |
