author | Matthew Wild <mwild1@gmail.com> |
Sun, 07 Jun 2009 17:44:48 +0100 | |
changeset 1329 | 599a058d3961 |
parent 1289 | d0c38cac1687 |
child 1418 | d14de6cb8b5b |
permissions | -rw-r--r-- |
1232 | 1 |
|
2 |
local full_sessions = full_sessions; |
|
3 |
local bare_sessions = bare_sessions; |
|
4 |
||
1329
599a058d3961
mod_message: Require stanza lib to prevent traceback on error replies
Matthew Wild <mwild1@gmail.com>
parents:
1289
diff
changeset
|
5 |
local st = require "util.stanza"; |
1232 | 6 |
local jid_bare = require "util.jid".bare; |
1289
d0c38cac1687
mod_message: Fix global access
Waqas Hussain <waqas20@gmail.com>
parents:
1275
diff
changeset
|
7 |
local jid_split = require "util.jid".split; |
1232 | 8 |
local user_exists = require "core.usermanager".user_exists; |
1274
50babb72edac
mod_message: mod_message now handles all cases
Waqas Hussain <waqas20@gmail.com>
parents:
1272
diff
changeset
|
9 |
local offlinemanager = require "core.offlinemanager"; |
1289
d0c38cac1687
mod_message: Fix global access
Waqas Hussain <waqas20@gmail.com>
parents:
1275
diff
changeset
|
10 |
local t_insert = table.insert; |
1274
50babb72edac
mod_message: mod_message now handles all cases
Waqas Hussain <waqas20@gmail.com>
parents:
1272
diff
changeset
|
11 |
|
50babb72edac
mod_message: mod_message now handles all cases
Waqas Hussain <waqas20@gmail.com>
parents:
1272
diff
changeset
|
12 |
local function select_top_resources(user) |
50babb72edac
mod_message: mod_message now handles all cases
Waqas Hussain <waqas20@gmail.com>
parents:
1272
diff
changeset
|
13 |
local priority = 0; |
50babb72edac
mod_message: mod_message now handles all cases
Waqas Hussain <waqas20@gmail.com>
parents:
1272
diff
changeset
|
14 |
local recipients = {}; |
50babb72edac
mod_message: mod_message now handles all cases
Waqas Hussain <waqas20@gmail.com>
parents:
1272
diff
changeset
|
15 |
for _, session in pairs(user.sessions) do -- find resource with greatest priority |
50babb72edac
mod_message: mod_message now handles all cases
Waqas Hussain <waqas20@gmail.com>
parents:
1272
diff
changeset
|
16 |
if session.presence then |
1275
850cf92b8ad4
mod_message: A little cleanup
Waqas Hussain <waqas20@gmail.com>
parents:
1274
diff
changeset
|
17 |
-- TODO check active privacy list for session |
1274
50babb72edac
mod_message: mod_message now handles all cases
Waqas Hussain <waqas20@gmail.com>
parents:
1272
diff
changeset
|
18 |
local p = session.priority; |
50babb72edac
mod_message: mod_message now handles all cases
Waqas Hussain <waqas20@gmail.com>
parents:
1272
diff
changeset
|
19 |
if p > priority then |
50babb72edac
mod_message: mod_message now handles all cases
Waqas Hussain <waqas20@gmail.com>
parents:
1272
diff
changeset
|
20 |
priority = p; |
50babb72edac
mod_message: mod_message now handles all cases
Waqas Hussain <waqas20@gmail.com>
parents:
1272
diff
changeset
|
21 |
recipients = {session}; |
50babb72edac
mod_message: mod_message now handles all cases
Waqas Hussain <waqas20@gmail.com>
parents:
1272
diff
changeset
|
22 |
elseif p == priority then |
50babb72edac
mod_message: mod_message now handles all cases
Waqas Hussain <waqas20@gmail.com>
parents:
1272
diff
changeset
|
23 |
t_insert(recipients, session); |
50babb72edac
mod_message: mod_message now handles all cases
Waqas Hussain <waqas20@gmail.com>
parents:
1272
diff
changeset
|
24 |
end |
50babb72edac
mod_message: mod_message now handles all cases
Waqas Hussain <waqas20@gmail.com>
parents:
1272
diff
changeset
|
25 |
end |
50babb72edac
mod_message: mod_message now handles all cases
Waqas Hussain <waqas20@gmail.com>
parents:
1272
diff
changeset
|
26 |
end |
50babb72edac
mod_message: mod_message now handles all cases
Waqas Hussain <waqas20@gmail.com>
parents:
1272
diff
changeset
|
27 |
return recipients; |
50babb72edac
mod_message: mod_message now handles all cases
Waqas Hussain <waqas20@gmail.com>
parents:
1272
diff
changeset
|
28 |
end |
1232 | 29 |
|
1271
e78c161944ab
mod_message: Move bare JID processing to it's own function
Waqas Hussain <waqas20@gmail.com>
parents:
1234
diff
changeset
|
30 |
local function process_to_bare(bare, origin, stanza) |
1274
50babb72edac
mod_message: mod_message now handles all cases
Waqas Hussain <waqas20@gmail.com>
parents:
1272
diff
changeset
|
31 |
local user = bare_sessions[bare]; |
1232 | 32 |
|
1272
28f9041d8c55
mod_message: Added code to handle error groupchat and headline messages to bare JID
Waqas Hussain <waqas20@gmail.com>
parents:
1271
diff
changeset
|
33 |
local t = stanza.attr.type; |
1275
850cf92b8ad4
mod_message: A little cleanup
Waqas Hussain <waqas20@gmail.com>
parents:
1274
diff
changeset
|
34 |
if t == "error" then |
850cf92b8ad4
mod_message: A little cleanup
Waqas Hussain <waqas20@gmail.com>
parents:
1274
diff
changeset
|
35 |
-- discard |
850cf92b8ad4
mod_message: A little cleanup
Waqas Hussain <waqas20@gmail.com>
parents:
1274
diff
changeset
|
36 |
elseif t == "groupchat" then |
1272
28f9041d8c55
mod_message: Added code to handle error groupchat and headline messages to bare JID
Waqas Hussain <waqas20@gmail.com>
parents:
1271
diff
changeset
|
37 |
origin.send(st.error_reply(stanza, "cancel", "service-unavailable")); |
1275
850cf92b8ad4
mod_message: A little cleanup
Waqas Hussain <waqas20@gmail.com>
parents:
1274
diff
changeset
|
38 |
elseif t == "headline" then |
1274
50babb72edac
mod_message: mod_message now handles all cases
Waqas Hussain <waqas20@gmail.com>
parents:
1272
diff
changeset
|
39 |
if user then |
50babb72edac
mod_message: mod_message now handles all cases
Waqas Hussain <waqas20@gmail.com>
parents:
1272
diff
changeset
|
40 |
for _, session in pairs(user.sessions) do |
1272
28f9041d8c55
mod_message: Added code to handle error groupchat and headline messages to bare JID
Waqas Hussain <waqas20@gmail.com>
parents:
1271
diff
changeset
|
41 |
if session.presence and session.priority >= 0 then |
28f9041d8c55
mod_message: Added code to handle error groupchat and headline messages to bare JID
Waqas Hussain <waqas20@gmail.com>
parents:
1271
diff
changeset
|
42 |
session.send(stanza); |
28f9041d8c55
mod_message: Added code to handle error groupchat and headline messages to bare JID
Waqas Hussain <waqas20@gmail.com>
parents:
1271
diff
changeset
|
43 |
end |
28f9041d8c55
mod_message: Added code to handle error groupchat and headline messages to bare JID
Waqas Hussain <waqas20@gmail.com>
parents:
1271
diff
changeset
|
44 |
end |
1274
50babb72edac
mod_message: mod_message now handles all cases
Waqas Hussain <waqas20@gmail.com>
parents:
1272
diff
changeset
|
45 |
end -- current policy is to discard headlines if no recipient is available |
1275
850cf92b8ad4
mod_message: A little cleanup
Waqas Hussain <waqas20@gmail.com>
parents:
1274
diff
changeset
|
46 |
else -- chat or normal message |
850cf92b8ad4
mod_message: A little cleanup
Waqas Hussain <waqas20@gmail.com>
parents:
1274
diff
changeset
|
47 |
if user then -- some resources are connected |
850cf92b8ad4
mod_message: A little cleanup
Waqas Hussain <waqas20@gmail.com>
parents:
1274
diff
changeset
|
48 |
local recipients = select_top_resources(user); |
850cf92b8ad4
mod_message: A little cleanup
Waqas Hussain <waqas20@gmail.com>
parents:
1274
diff
changeset
|
49 |
if #recipients > 0 then |
850cf92b8ad4
mod_message: A little cleanup
Waqas Hussain <waqas20@gmail.com>
parents:
1274
diff
changeset
|
50 |
for i=1,#recipients do |
850cf92b8ad4
mod_message: A little cleanup
Waqas Hussain <waqas20@gmail.com>
parents:
1274
diff
changeset
|
51 |
recipients[i].send(stanza); |
850cf92b8ad4
mod_message: A little cleanup
Waqas Hussain <waqas20@gmail.com>
parents:
1274
diff
changeset
|
52 |
end |
850cf92b8ad4
mod_message: A little cleanup
Waqas Hussain <waqas20@gmail.com>
parents:
1274
diff
changeset
|
53 |
return true; |
1274
50babb72edac
mod_message: mod_message now handles all cases
Waqas Hussain <waqas20@gmail.com>
parents:
1272
diff
changeset
|
54 |
end |
1272
28f9041d8c55
mod_message: Added code to handle error groupchat and headline messages to bare JID
Waqas Hussain <waqas20@gmail.com>
parents:
1271
diff
changeset
|
55 |
end |
1275
850cf92b8ad4
mod_message: A little cleanup
Waqas Hussain <waqas20@gmail.com>
parents:
1274
diff
changeset
|
56 |
-- no resources are online |
850cf92b8ad4
mod_message: A little cleanup
Waqas Hussain <waqas20@gmail.com>
parents:
1274
diff
changeset
|
57 |
local node, host = jid_split(bare); |
850cf92b8ad4
mod_message: A little cleanup
Waqas Hussain <waqas20@gmail.com>
parents:
1274
diff
changeset
|
58 |
if user_exists(node, host) then |
850cf92b8ad4
mod_message: A little cleanup
Waqas Hussain <waqas20@gmail.com>
parents:
1274
diff
changeset
|
59 |
-- TODO apply the default privacy list |
850cf92b8ad4
mod_message: A little cleanup
Waqas Hussain <waqas20@gmail.com>
parents:
1274
diff
changeset
|
60 |
offlinemanager.store(node, host, stanza); |
850cf92b8ad4
mod_message: A little cleanup
Waqas Hussain <waqas20@gmail.com>
parents:
1274
diff
changeset
|
61 |
else |
850cf92b8ad4
mod_message: A little cleanup
Waqas Hussain <waqas20@gmail.com>
parents:
1274
diff
changeset
|
62 |
origin.send(st.error_reply(stanza, "cancel", "service-unavailable")); |
850cf92b8ad4
mod_message: A little cleanup
Waqas Hussain <waqas20@gmail.com>
parents:
1274
diff
changeset
|
63 |
end |
1274
50babb72edac
mod_message: mod_message now handles all cases
Waqas Hussain <waqas20@gmail.com>
parents:
1272
diff
changeset
|
64 |
end |
50babb72edac
mod_message: mod_message now handles all cases
Waqas Hussain <waqas20@gmail.com>
parents:
1272
diff
changeset
|
65 |
return true; |
1271
e78c161944ab
mod_message: Move bare JID processing to it's own function
Waqas Hussain <waqas20@gmail.com>
parents:
1234
diff
changeset
|
66 |
end |
e78c161944ab
mod_message: Move bare JID processing to it's own function
Waqas Hussain <waqas20@gmail.com>
parents:
1234
diff
changeset
|
67 |
|
e78c161944ab
mod_message: Move bare JID processing to it's own function
Waqas Hussain <waqas20@gmail.com>
parents:
1234
diff
changeset
|
68 |
module:hook("message/full", function(data) |
e78c161944ab
mod_message: Move bare JID processing to it's own function
Waqas Hussain <waqas20@gmail.com>
parents:
1234
diff
changeset
|
69 |
-- message to full JID recieved |
e78c161944ab
mod_message: Move bare JID processing to it's own function
Waqas Hussain <waqas20@gmail.com>
parents:
1234
diff
changeset
|
70 |
local origin, stanza = data.origin, data.stanza; |
e78c161944ab
mod_message: Move bare JID processing to it's own function
Waqas Hussain <waqas20@gmail.com>
parents:
1234
diff
changeset
|
71 |
|
e78c161944ab
mod_message: Move bare JID processing to it's own function
Waqas Hussain <waqas20@gmail.com>
parents:
1234
diff
changeset
|
72 |
local session = full_sessions[stanza.attr.to]; |
e78c161944ab
mod_message: Move bare JID processing to it's own function
Waqas Hussain <waqas20@gmail.com>
parents:
1234
diff
changeset
|
73 |
if session then |
e78c161944ab
mod_message: Move bare JID processing to it's own function
Waqas Hussain <waqas20@gmail.com>
parents:
1234
diff
changeset
|
74 |
-- TODO fire post processing event |
e78c161944ab
mod_message: Move bare JID processing to it's own function
Waqas Hussain <waqas20@gmail.com>
parents:
1234
diff
changeset
|
75 |
session.send(stanza); |
e78c161944ab
mod_message: Move bare JID processing to it's own function
Waqas Hussain <waqas20@gmail.com>
parents:
1234
diff
changeset
|
76 |
return true; |
e78c161944ab
mod_message: Move bare JID processing to it's own function
Waqas Hussain <waqas20@gmail.com>
parents:
1234
diff
changeset
|
77 |
else -- resource not online |
e78c161944ab
mod_message: Move bare JID processing to it's own function
Waqas Hussain <waqas20@gmail.com>
parents:
1234
diff
changeset
|
78 |
return process_to_bare(jid_bare(stanza.attr.to), origin, stanza); |
e78c161944ab
mod_message: Move bare JID processing to it's own function
Waqas Hussain <waqas20@gmail.com>
parents:
1234
diff
changeset
|
79 |
end |
1232 | 80 |
end); |
1271
e78c161944ab
mod_message: Move bare JID processing to it's own function
Waqas Hussain <waqas20@gmail.com>
parents:
1234
diff
changeset
|
81 |
|
e78c161944ab
mod_message: Move bare JID processing to it's own function
Waqas Hussain <waqas20@gmail.com>
parents:
1234
diff
changeset
|
82 |
module:hook("message/bare", function(data) |
e78c161944ab
mod_message: Move bare JID processing to it's own function
Waqas Hussain <waqas20@gmail.com>
parents:
1234
diff
changeset
|
83 |
-- message to bare JID recieved |
e78c161944ab
mod_message: Move bare JID processing to it's own function
Waqas Hussain <waqas20@gmail.com>
parents:
1234
diff
changeset
|
84 |
local origin, stanza = data.origin, data.stanza; |
e78c161944ab
mod_message: Move bare JID processing to it's own function
Waqas Hussain <waqas20@gmail.com>
parents:
1234
diff
changeset
|
85 |
|
e78c161944ab
mod_message: Move bare JID processing to it's own function
Waqas Hussain <waqas20@gmail.com>
parents:
1234
diff
changeset
|
86 |
return process_to_bare(stanza.attr.to or (origin.username..'@'..origin.host), origin, stanza); |
e78c161944ab
mod_message: Move bare JID processing to it's own function
Waqas Hussain <waqas20@gmail.com>
parents:
1234
diff
changeset
|
87 |
end); |