2 local full_sessions = full_sessions;
3 local bare_sessions = bare_sessions;
5 local jid_bare = require "util.jid".bare;
6 local user_exists = require "core.usermanager".user_exists;
7 local offlinemanager = require "core.offlinemanager";
9 local function select_top_resources(user)
11 local recipients = {};
12 for _, session in pairs(user.sessions) do -- find resource with greatest priority
13 if session.presence then
14 -- TODO check active privacy list for session
15 local p = session.priority;
18 recipients = {session};
19 elseif p == priority then
20 t_insert(recipients, session);
27 local function process_to_bare(bare, origin, stanza)
28 local user = bare_sessions[bare];
30 local t = stanza.attr.type;
33 elseif t == "groupchat" then
34 origin.send(st.error_reply(stanza, "cancel", "service-unavailable"));
35 elseif t == "headline" then
37 for _, session in pairs(user.sessions) do
38 if session.presence and session.priority >= 0 then
42 end -- current policy is to discard headlines if no recipient is available
43 else -- chat or normal message
44 if user then -- some resources are connected
45 local recipients = select_top_resources(user);
46 if #recipients > 0 then
47 for i=1,#recipients do
48 recipients[i].send(stanza);
53 -- no resources are online
54 local node, host = jid_split(bare);
55 if user_exists(node, host) then
56 -- TODO apply the default privacy list
57 offlinemanager.store(node, host, stanza);
59 origin.send(st.error_reply(stanza, "cancel", "service-unavailable"));
65 module:hook("message/full", function(data)
66 -- message to full JID recieved
67 local origin, stanza = data.origin, data.stanza;
69 local session = full_sessions[stanza.attr.to];
71 -- TODO fire post processing event
74 else -- resource not online
75 return process_to_bare(jid_bare(stanza.attr.to), origin, stanza);
79 module:hook("message/bare", function(data)
80 -- message to bare JID recieved
81 local origin, stanza = data.origin, data.stanza;
83 return process_to_bare(stanza.attr.to or (origin.username..'@'..origin.host), origin, stanza);