Software /
code /
prosody
Comparison
plugins/mod_message.lua @ 1274:50babb72edac
mod_message: mod_message now handles all cases
author | Waqas Hussain <waqas20@gmail.com> |
---|---|
date | Mon, 01 Jun 2009 18:11:01 +0500 |
parent | 1272:28f9041d8c55 |
child | 1275:850cf92b8ad4 |
comparison
equal
deleted
inserted
replaced
1273:85353014ff34 | 1274:50babb72edac |
---|---|
2 local full_sessions = full_sessions; | 2 local full_sessions = full_sessions; |
3 local bare_sessions = bare_sessions; | 3 local bare_sessions = bare_sessions; |
4 | 4 |
5 local jid_bare = require "util.jid".bare; | 5 local jid_bare = require "util.jid".bare; |
6 local user_exists = require "core.usermanager".user_exists; | 6 local user_exists = require "core.usermanager".user_exists; |
7 local offlinemanager = require "core.offlinemanager"; | |
8 | |
9 local function select_top_resources(user) | |
10 local priority = 0; | |
11 local recipients = {}; | |
12 for _, session in pairs(user.sessions) do -- find resource with greatest priority | |
13 if session.presence then | |
14 local p = session.priority; | |
15 if p > priority then | |
16 priority = p; | |
17 recipients = {session}; | |
18 elseif p == priority then | |
19 t_insert(recipients, session); | |
20 end | |
21 end | |
22 end | |
23 return recipients; | |
24 end | |
7 | 25 |
8 local function process_to_bare(bare, origin, stanza) | 26 local function process_to_bare(bare, origin, stanza) |
9 local sessions = bare_sessions[bare]; | 27 local user = bare_sessions[bare]; |
10 | 28 |
11 local t = stanza.attr.type; | 29 local t = stanza.attr.type; |
12 if t == "error" then return true; end | 30 if t == "error" then return true; end |
13 if t == "groupchat" then | 31 if t == "groupchat" then |
14 origin.send(st.error_reply(stanza, "cancel", "service-unavailable")); | 32 origin.send(st.error_reply(stanza, "cancel", "service-unavailable")); |
15 return true; | 33 return true; |
16 end | 34 end |
17 | 35 if t == "headline" then |
18 if sessions then | 36 if user then |
19 -- some resources are connected | 37 for _, session in pairs(user.sessions) do |
20 sessions = sessions.sessions; | |
21 | |
22 if t == "headline" then | |
23 for _, session in pairs(sessions) do | |
24 if session.presence and session.priority >= 0 then | 38 if session.presence and session.priority >= 0 then |
25 session.send(stanza); | 39 session.send(stanza); |
26 end | 40 end |
27 end | 41 end |
42 end -- current policy is to discard headlines if no recipient is available | |
43 return true; | |
44 end | |
45 -- chat or normal message | |
46 if user then -- some resources are connected | |
47 local recipients = select_top_resources(user); | |
48 if #recipients > 0 then | |
49 for i=1,#recipients do | |
50 recipients[i].send(stanza); | |
51 end | |
28 return true; | 52 return true; |
29 end | 53 end |
30 -- TODO find top resources willing to accept this message | |
31 -- TODO then send them each the stanza | |
32 return; | |
33 end | 54 end |
34 -- no resources are online | 55 -- no resources are online |
35 if t == "headline" then return true; end -- current policy is to discard headlines | 56 local node, host = jid_split(bare); |
36 -- chat or normal message | 57 if user_exists(node, host) then |
37 -- TODO check if the user exists | 58 -- TODO apply the default privacy list |
38 -- TODO if it doesn't, return an error reply | 59 offlinemanager.store(node, host, stanza); |
39 -- TODO otherwise, apply the default privacy list | 60 else |
40 -- TODO and store into offline storage | 61 origin.send(st.error_reply(stanza, "cancel", "service-unavailable")); |
41 -- TODO or maybe the offline store can apply privacy lists | 62 end |
63 return true; | |
42 end | 64 end |
43 | 65 |
44 module:hook("message/full", function(data) | 66 module:hook("message/full", function(data) |
45 -- message to full JID recieved | 67 -- message to full JID recieved |
46 local origin, stanza = data.origin, data.stanza; | 68 local origin, stanza = data.origin, data.stanza; |