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 |