3 local function log(type, message)
4 mainlog(type, "rostermanager", message);
7 local setmetatable = setmetatable;
8 local format = string.format;
9 local loadfile, setfenv, pcall = loadfile, setfenv, pcall;
10 local pairs, ipairs = pairs, ipairs;
14 require "util.datamanager"
16 local datamanager = datamanager;
17 local st = require "util.stanza";
19 module "rostermanager"
21 --[[function getroster(username, host)
23 ["mattj@localhost"] = true,
24 ["tobias@getjabber.ath.cx"] = true,
25 ["waqas@getjabber.ath.cx"] = true,
26 ["thorns@getjabber.ath.cx"] = true,
27 ["idw@getjabber.ath.cx"] = true,
29 --return datamanager.load(username, host, "roster") or {};
32 function add_to_roster(session, jid, item)
33 if session.roster then
34 local old_item = session.roster[jid];
35 session.roster[jid] = item;
36 if save_roster(session.username, session.host) then
39 session.roster[jid] = old_item;
40 return nil, "wait", "internal-server-error", "Unable to save roster";
43 return nil, "auth", "not-authorized", "Session's roster not loaded";
47 function remove_from_roster(session, jid)
48 if session.roster then
49 local old_item = session.roster[jid];
50 session.roster[jid] = nil;
51 if save_roster(session.username, session.host) then
54 session.roster[jid] = old_item;
55 return nil, "wait", "internal-server-error", "Unable to save roster";
58 return nil, "auth", "not-authorized", "Session's roster not loaded";
62 function roster_push(username, host, jid)
63 if hosts[host] and hosts[host].sessions[username] and hosts[host].sessions[username].roster then
64 local item = hosts[host].sessions[username].roster[jid];
65 local stanza = st.iq({type="set"});
66 stanza:tag("query", {xmlns = "jabber:iq:roster"});
68 stanza:tag("item", {jid = jid, subscription = item.subscription, name = item.name});
69 for group in pairs(item.groups) do
70 stanza:tag("group"):text(group):up();
73 stanza:tag("item", {jid = jid, subscription = "remove"});
78 for _, session in pairs(hosts[host].sessions[username].sessions) do
79 if session.interested then
80 -- FIXME do we need to set stanza.attr.to?
87 function load_roster(username, host)
88 if hosts[host] and hosts[host].sessions[username] then
89 local roster = hosts[host].sessions[username].roster;
91 roster = datamanager.load(username, host, "roster") or {};
92 hosts[host].sessions[username].roster = roster;
96 -- Attempt to load roster for non-loaded user
99 function save_roster(username, host)
100 if hosts[host] and hosts[host].sessions[username] and hosts[host].sessions[username].roster then
101 return datamanager.store(username, host, "roster", hosts[host].sessions[username].roster);