Mercurial > prosody-hg
comparison util/pubsub.lua @ 6437:3f1f11dfdf10
util.pubsub: Add support for node configuration
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Sun, 28 Sep 2014 01:45:59 +0200 |
| parents | 31ca87ea8d46 |
| children | d58ad8bd244b |
comparison
equal
deleted
inserted
replaced
| 6436:31ca87ea8d46 | 6437:3f1f11dfdf10 |
|---|---|
| 9 local default_config = { __index = { | 9 local default_config = { __index = { |
| 10 broadcaster = function () end; | 10 broadcaster = function () end; |
| 11 get_affiliation = function () end; | 11 get_affiliation = function () end; |
| 12 capabilities = {}; | 12 capabilities = {}; |
| 13 } }; | 13 } }; |
| 14 local default_node_config = { __index = { | |
| 15 } }; | |
| 14 | 16 |
| 15 function new(config) | 17 function new(config) |
| 16 config = config or {}; | 18 config = config or {}; |
| 17 return setmetatable({ | 19 return setmetatable({ |
| 18 config = setmetatable(config, default_config); | 20 config = setmetatable(config, default_config); |
| 21 node_defaults = setmetatable(config.node_defaults or {}, default_node_config); | |
| 19 affiliations = {}; | 22 affiliations = {}; |
| 20 subscriptions = {}; | 23 subscriptions = {}; |
| 21 nodes = {}; | 24 nodes = {}; |
| 22 data = {}; | 25 data = {}; |
| 23 events = events.new(); | 26 events = events.new(); |
| 202 return false, "item-not-found"; | 205 return false, "item-not-found"; |
| 203 end | 206 end |
| 204 return true, node_obj.subscribers[jid]; | 207 return true, node_obj.subscribers[jid]; |
| 205 end | 208 end |
| 206 | 209 |
| 207 function service:create(node, actor) | 210 function service:create(node, actor, options) |
| 208 -- Access checking | 211 -- Access checking |
| 209 if not self:may(node, actor, "create") then | 212 if not self:may(node, actor, "create") then |
| 210 return false, "forbidden"; | 213 return false, "forbidden"; |
| 211 end | 214 end |
| 212 -- | 215 -- |
| 216 | 219 |
| 217 self.data[node] = {}; | 220 self.data[node] = {}; |
| 218 self.nodes[node] = { | 221 self.nodes[node] = { |
| 219 name = node; | 222 name = node; |
| 220 subscribers = {}; | 223 subscribers = {}; |
| 221 config = {}; | 224 config = setmetatable(options or {}, {__index=self.node_defaults}); |
| 222 affiliations = {}; | 225 affiliations = {}; |
| 223 }; | 226 }; |
| 224 setmetatable(self.nodes[node], { __index = { data = self.data[node] } }); -- COMPAT | 227 setmetatable(self.nodes[node], { __index = { data = self.data[node] } }); -- COMPAT |
| 225 self.events.fire_event("node-created", { node = node, actor = actor }); | 228 self.events.fire_event("node-created", { node = node, actor = actor }); |
| 226 local ok, err = self:set_affiliation(node, true, actor, "owner"); | 229 local ok, err = self:set_affiliation(node, true, actor, "owner"); |
| 409 end | 412 end |
| 410 node_obj.capabilities = capabilities; | 413 node_obj.capabilities = capabilities; |
| 411 return true; | 414 return true; |
| 412 end | 415 end |
| 413 | 416 |
| 417 function service:set_node_config(node, actor, new_config) | |
| 418 if not self:may(node, actor, "configure") then | |
| 419 return false, "forbidden"; | |
| 420 end | |
| 421 | |
| 422 local node_obj = self.nodes[node]; | |
| 423 if not node_obj then | |
| 424 return false, "item-not-found"; | |
| 425 end | |
| 426 | |
| 427 for k,v in pairs(new_config) do | |
| 428 node_obj.config[k] = v; | |
| 429 end | |
| 430 | |
| 431 return true; | |
| 432 end | |
| 433 | |
| 414 return _M; | 434 return _M; |
