diff -r b02b22f77326 -r d14de6cb8b5b plugins/mod_presence.lua --- a/plugins/mod_presence.lua Fri Jun 26 08:52:26 2009 +0500 +++ b/plugins/mod_presence.lua Fri Jun 26 08:54:22 2009 +0500 @@ -52,6 +52,29 @@ end end +local function select_top_resources(user) + local priority = 0; + local recipients = {}; + for _, session in pairs(user.sessions) do -- find resource with greatest priority + if session.presence then + -- TODO check active privacy list for session + local p = session.priority; + if p > priority then + priority = p; + recipients = {session}; + elseif p == priority then + t_insert(recipients, session); + end + end + end + return recipients; +end +local function recalc_resource_map(origin) + local user = hosts[origin.host].sessions[origin.username]; + user.top_resources = select_top_resources(user); + if #user.top_resources == 0 then user.top_resources = nil; end +end + function handle_normal_presence(origin, stanza, core_route_stanza) if origin.roster then for jid in pairs(origin.roster) do -- broadcast to all interested contacts @@ -104,9 +127,12 @@ offlinemanager.deleteAll(node, host); end end - origin.priority = 0; if stanza.attr.type == "unavailable" then origin.presence = nil; + if origin.priority then + origin.priority = nil; + recalc_resource_map(origin); + end if origin.directed then local old_from = stanza.attr.from; stanza.attr.from = origin.full_jid; @@ -126,8 +152,11 @@ priority = tonumber(priority); if priority < -128 then priority = -128 end if priority > 127 then priority = 127 end - origin.priority = priority; - end + else priority = 0; end + else priority = 0; end + if origin.priority ~= priority then + origin.priority = priority; + recalc_resource_map(origin); end end stanza.attr.to = nil; -- reset it