Mercurial > prosody-hg
comparison util/pubsub.lua @ 6439:d58ad8bd244b
util.pubsub: Add support for limiting the number of item in a node (default to 20)
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Sun, 28 Sep 2014 01:50:00 +0200 |
| parents | 3f1f11dfdf10 |
| children | 0f4025abbe8f c9a72c64c3e2 |
comparison
equal
deleted
inserted
replaced
| 6438:b1c40054b59d | 6439:d58ad8bd244b |
|---|---|
| 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 = { | 14 local default_node_config = { __index = { |
| 15 ["pubsub#max_items"] = "20"; | |
| 15 } }; | 16 } }; |
| 16 | 17 |
| 17 function new(config) | 18 function new(config) |
| 18 config = config or {}; | 19 config = config or {}; |
| 19 return setmetatable({ | 20 return setmetatable({ |
| 260 return i; | 261 return i; |
| 261 end | 262 end |
| 262 end | 263 end |
| 263 end | 264 end |
| 264 | 265 |
| 266 local function trim_items(data, max) | |
| 267 max = tonumber(max); | |
| 268 if not max or #data <= max then return end | |
| 269 repeat | |
| 270 data[t_remove(data, 1)] = nil; | |
| 271 until #data <= max | |
| 272 end | |
| 273 | |
| 265 function service:publish(node, actor, id, item) | 274 function service:publish(node, actor, id, item) |
| 266 -- Access checking | 275 -- Access checking |
| 267 if not self:may(node, actor, "publish") then | 276 if not self:may(node, actor, "publish") then |
| 268 return false, "forbidden"; | 277 return false, "forbidden"; |
| 269 end | 278 end |
| 281 end | 290 end |
| 282 local node_data = self.data[node]; | 291 local node_data = self.data[node]; |
| 283 remove_item_by_id(node_data, id); | 292 remove_item_by_id(node_data, id); |
| 284 node_data[#node_data + 1] = id; | 293 node_data[#node_data + 1] = id; |
| 285 node_data[id] = item; | 294 node_data[id] = item; |
| 295 trim_items(node_data, node_obj.config["pubsub#max_items"]); | |
| 286 self.events.fire_event("item-published", { node = node, actor = actor, id = id, item = item }); | 296 self.events.fire_event("item-published", { node = node, actor = actor, id = id, item = item }); |
| 287 self.config.broadcaster("items", node, node_obj.subscribers, item); | 297 self.config.broadcaster("items", node, node_obj.subscribers, item); |
| 288 return true; | 298 return true; |
| 289 end | 299 end |
| 290 | 300 |
| 425 end | 435 end |
| 426 | 436 |
| 427 for k,v in pairs(new_config) do | 437 for k,v in pairs(new_config) do |
| 428 node_obj.config[k] = v; | 438 node_obj.config[k] = v; |
| 429 end | 439 end |
| 440 trim_items(self.data[node], node_obj.config["pubsub#max_items"]); | |
| 430 | 441 |
| 431 return true; | 442 return true; |
| 432 end | 443 end |
| 433 | 444 |
| 434 return _M; | 445 return _M; |
