core/stanza_router.lua

changeset 783
defb0119f80f
parent 781
191b9f0e5485
child 784
1de8a32f81e9
equal deleted inserted replaced
782:6f9b2a9d6d45 783:defb0119f80f
32 local tostring = tostring; 32 local tostring = tostring;
33 local t_concat = table.concat; 33 local t_concat = table.concat;
34 local t_insert = table.insert; 34 local t_insert = table.insert;
35 local tonumber = tonumber; 35 local tonumber = tonumber;
36 local s_find = string.find; 36 local s_find = string.find;
37 local pairs = pairs;
38 local ipairs = ipairs;
37 39
38 local jid_split = require "util.jid".split; 40 local jid_split = require "util.jid".split;
39 local jid_prepped_split = require "util.jid".prepped_split; 41 local jid_prepped_split = require "util.jid".prepped_split;
40 local print = print; 42 local print = print;
41 local function checked_error_reply(origin, stanza) 43 local function checked_error_reply(origin, stanza)
206 session.send(stanza); 208 session.send(stanza);
207 end 209 end
208 end 210 end
209 end 211 end
210 elseif stanza.name == "message" then -- select a resource to recieve message 212 elseif stanza.name == "message" then -- select a resource to recieve message
211 local priority = 0; 213 if message.attr.type == 'headline' then
212 local recipients = {}; 214 for _, session in pairs(user.sessions) do -- find resource with greatest priority
213 for _, session in pairs(user.sessions) do -- find resource with greatest priority 215 if session.presence and session.priority >= 0 then
214 local p = session.priority; 216 stanza.attr.to = session.full_jid;
215 if p > priority then 217 session.send(stanza);
216 priority = p; 218 end
217 recipients = {session}; 219 end
218 elseif p == priority then 220 else
219 t_insert(recipients, session); 221 local priority = 0;
220 end 222 local recipients = {};
221 end 223 for _, session in pairs(user.sessions) do -- find resource with greatest priority
222 local count = 0; 224 if session.presence then
223 for _, session in pairs(recipients) do 225 local p = session.priority;
224 session.send(stanza); 226 if p > priority then
225 count = count + 1; 227 priority = p;
226 end 228 recipients = {session};
227 if count == 0 then 229 elseif p == priority then
228 offlinemanager.store(node, host, stanza); 230 t_insert(recipients, session);
229 -- TODO deal with storage errors 231 end
232 end
233 end
234 local count = 0;
235 for _, session in ipairs(recipients) do
236 session.send(stanza);
237 count = count + 1;
238 end
239 if count == 0 and (stanza.attr.type == "chat" or stanza.attr.type == "normal" or not stanza.attr.type) then
240 offlinemanager.store(node, host, stanza);
241 -- TODO deal with storage errors
242 end
230 end 243 end
231 else 244 else
232 -- TODO send IQ error 245 -- TODO send IQ error
233 end 246 end
234 else 247 else

mercurial