Comparison

plugins/mod_pep.lua @ 1430:39169cf8d36f

mod_pep: Broadcast only to available recipients with caps
author Waqas Hussain <waqas20@gmail.com>
date Fri, 26 Jun 2009 23:58:52 +0500
parent 1429:51cfb152cb38
child 1437:cf2eba9b1716
comparison
equal deleted inserted replaced
1429:51cfb152cb38 1430:39169cf8d36f
7 local is_contact_subscribed = require "core.rostermanager".is_contact_subscribed; 7 local is_contact_subscribed = require "core.rostermanager".is_contact_subscribed;
8 local pairs, ipairs = pairs, ipairs; 8 local pairs, ipairs = pairs, ipairs;
9 local next = next; 9 local next = next;
10 local load_roster = require "core.rostermanager".load_roster; 10 local load_roster = require "core.rostermanager".load_roster;
11 11
12 local NULL = {};
12 local data = {}; 13 local data = {};
13 local recipients = {}; 14 local recipients = {};
14 15
15 module:add_identity("pubsub", "pep"); 16 module:add_identity("pubsub", "pep");
16 module:add_feature("http://jabber.org/protocol/pubsub#publish"); 17 module:add_feature("http://jabber.org/protocol/pubsub#publish");
33 else 34 else
34 if not user_data then user_data = {}; data[bare] = user_data; end 35 if not user_data then user_data = {}; data[bare] = user_data; end
35 user_data[node] = stanza; 36 user_data[node] = stanza;
36 end 37 end
37 38
38 -- broadcast to resources 39 -- broadcast
39 stanza.attr.to = bare; 40 for recipient in pairs(recipients[user] or NULL) do
40 core_route_stanza(session, stanza); 41 stanza.attr.to = recipient;
41 42 core_post_stanza(session, stanza);
42 -- broadcast to contacts
43 for jid, item in pairs(session.roster) do
44 if jid and jid ~= "pending" and (item.subscription == 'from' or item.subscription == 'both') then
45 stanza.attr.to = jid;
46 core_route_stanza(session, stanza);
47 end
48 end 43 end
49 end 44 end
50 45
51 local function get_caps_hash_from_presence(stanza, current) 46 local function get_caps_hash_from_presence(stanza, current)
52 local t = stanza.attr.type; 47 local t = stanza.attr.type;
74 69
75 local user = stanza.attr.to or (origin.username..'@'..origin.host); 70 local user = stanza.attr.to or (origin.username..'@'..origin.host);
76 local bare = jid_bare(stanza.attr.from); 71 local bare = jid_bare(stanza.attr.from);
77 local item = load_roster(jid_split(user))[bare]; 72 local item = load_roster(jid_split(user))[bare];
78 if not stanza.attr.to or (item and (item.subscription == 'from' or item.subscription == 'both')) then 73 if not stanza.attr.to or (item and (item.subscription == 'from' or item.subscription == 'both')) then
79 local t = stanza.attr.type;
80 local recipient = stanza.attr.from; 74 local recipient = stanza.attr.from;
81 if t == "unavailable" or t == "error" then 75 local current = recipients[user] and recipients[user][recipient];
76 local hash = get_caps_hash_from_presence(stanza, current);
77 if current == hash then return; end
78 if not hash then
82 if recipients[user] then recipients[user][recipient] = nil; end 79 if recipients[user] then recipients[user][recipient] = nil; end
83 elseif not t then 80 else
84 recipients[user] = recipients[user] or {}; 81 recipients[user] = recipients[user] or {};
85 if not recipients[user][recipient] then 82 recipients[user][recipient] = hash;
86 recipients[user][recipient] = true; 83 for node, message in pairs(data[user] or NULL) do
87 for node, message in pairs(data[user] or {}) do 84 message.attr.to = stanza.attr.from;
88 message.attr.to = stanza.attr.from; 85 origin.send(message);
89 origin.send(message);
90 end
91 end 86 end
92 end 87 end
93 end 88 end
94 end, 10); 89 end, 10);
95 90