Comparison

plugins/mod_presence.lua @ 1418:d14de6cb8b5b

mod_message, mod_presence: Maintain list of top resources. Less work in routing messages to bare JIDs. - #optimization
author Waqas Hussain <waqas20@gmail.com>
date Fri, 26 Jun 2009 08:54:22 +0500
parent 1287:ac82c7b9c76b
child 1463:4ad920999cfa
comparison
equal deleted inserted replaced
1417:b02b22f77326 1418:d14de6cb8b5b
50 else 50 else
51 core_route_stanza(origin, stanza); 51 core_route_stanza(origin, stanza);
52 end 52 end
53 end 53 end
54 54
55 local function select_top_resources(user)
56 local priority = 0;
57 local recipients = {};
58 for _, session in pairs(user.sessions) do -- find resource with greatest priority
59 if session.presence then
60 -- TODO check active privacy list for session
61 local p = session.priority;
62 if p > priority then
63 priority = p;
64 recipients = {session};
65 elseif p == priority then
66 t_insert(recipients, session);
67 end
68 end
69 end
70 return recipients;
71 end
72 local function recalc_resource_map(origin)
73 local user = hosts[origin.host].sessions[origin.username];
74 user.top_resources = select_top_resources(user);
75 if #user.top_resources == 0 then user.top_resources = nil; end
76 end
77
55 function handle_normal_presence(origin, stanza, core_route_stanza) 78 function handle_normal_presence(origin, stanza, core_route_stanza)
56 if origin.roster then 79 if origin.roster then
57 for jid in pairs(origin.roster) do -- broadcast to all interested contacts 80 for jid in pairs(origin.roster) do -- broadcast to all interested contacts
58 local subscription = origin.roster[jid].subscription; 81 local subscription = origin.roster[jid].subscription;
59 if subscription == "both" or subscription == "from" then 82 if subscription == "both" or subscription == "from" then
102 origin.send(msg); -- FIXME do we need to modify to/from in any way? 125 origin.send(msg); -- FIXME do we need to modify to/from in any way?
103 end 126 end
104 offlinemanager.deleteAll(node, host); 127 offlinemanager.deleteAll(node, host);
105 end 128 end
106 end 129 end
107 origin.priority = 0;
108 if stanza.attr.type == "unavailable" then 130 if stanza.attr.type == "unavailable" then
109 origin.presence = nil; 131 origin.presence = nil;
132 if origin.priority then
133 origin.priority = nil;
134 recalc_resource_map(origin);
135 end
110 if origin.directed then 136 if origin.directed then
111 local old_from = stanza.attr.from; 137 local old_from = stanza.attr.from;
112 stanza.attr.from = origin.full_jid; 138 stanza.attr.from = origin.full_jid;
113 for jid in pairs(origin.directed) do 139 for jid in pairs(origin.directed) do
114 stanza.attr.to = jid; 140 stanza.attr.to = jid;
124 priority = t_concat(priority); 150 priority = t_concat(priority);
125 if s_find(priority, "^[+-]?[0-9]+$") then 151 if s_find(priority, "^[+-]?[0-9]+$") then
126 priority = tonumber(priority); 152 priority = tonumber(priority);
127 if priority < -128 then priority = -128 end 153 if priority < -128 then priority = -128 end
128 if priority > 127 then priority = 127 end 154 if priority > 127 then priority = 127 end
129 origin.priority = priority; 155 else priority = 0; end
130 end 156 else priority = 0; end
157 if origin.priority ~= priority then
158 origin.priority = priority;
159 recalc_resource_map(origin);
131 end 160 end
132 end 161 end
133 stanza.attr.to = nil; -- reset it 162 stanza.attr.to = nil; -- reset it
134 else 163 else
135 log("warn", "presence recieved from client with no roster"); 164 log("warn", "presence recieved from client with no roster");