aboutsummaryrefslogtreecommitdiffstats
path: root/core/rostermanager.lua
diff options
context:
space:
mode:
Diffstat (limited to 'core/rostermanager.lua')
-rw-r--r--core/rostermanager.lua82
1 files changed, 80 insertions, 2 deletions
diff --git a/core/rostermanager.lua b/core/rostermanager.lua
index 5f06a308..26a14256 100644
--- a/core/rostermanager.lua
+++ b/core/rostermanager.lua
@@ -7,14 +7,18 @@ end
local setmetatable = setmetatable;
local format = string.format;
local loadfile, setfenv, pcall = loadfile, setfenv, pcall;
+local pairs, ipairs = pairs, ipairs;
+
+local hosts = hosts;
require "util.datamanager"
local datamanager = datamanager;
+local st = require "util.stanza";
module "rostermanager"
-function getroster(username, host)
+--[[function getroster(username, host)
return {
["mattj@localhost"] = true,
["tobias@getjabber.ath.cx"] = true,
@@ -22,7 +26,81 @@ function getroster(username, host)
["thorns@getjabber.ath.cx"] = true,
["idw@getjabber.ath.cx"] = true,
}
--- return datamanager.load(username, host, "roster") or {};
+ --return datamanager.load(username, host, "roster") or {};
+end]]
+
+function add_to_roster(session, jid, item)
+ if session.roster then
+ local old_item = session.roster[jid];
+ session.roster[jid] = item;
+ if save_roster(session.username, session.host) then
+ return true;
+ else
+ session.roster[jid] = old_item;
+ return nil, "wait", "internal-server-error", "Unable to save roster";
+ end
+ else
+ return nil, "auth", "not-authorized", "Session's roster not loaded";
+ end
+end
+
+function remove_from_roster(session, jid)
+ if session.roster then
+ local old_item = session.roster[jid];
+ session.roster[jid] = nil;
+ if save_roster(session.username, session.host) then
+ return true;
+ else
+ session.roster[jid] = old_item;
+ return nil, "wait", "internal-server-error", "Unable to save roster";
+ end
+ else
+ return nil, "auth", "not-authorized", "Session's roster not loaded";
+ end
+end
+
+function roster_push(username, host, jid)
+ if hosts[host] and hosts[host].sessions[username] and hosts[host].sessions[username].roster then
+ local item = hosts[host].sessions[username].roster[jid];
+ local stanza = st.iq({type="set"});
+ stanza:tag("query", {xmlns = "jabber:iq:roster"});
+ if item then
+ stanza:tag("item", {jid = jid, subscription = item.subscription, name = item.name});
+ for group in pairs(item.groups) do
+ stanza:tag("group"):text(group):up();
+ end
+ else
+ stanza:tag("item", {jid = jid, subscription = "remove"});
+ end
+ stanza:up();
+ stanza:up();
+ -- stanza ready
+ for _, session in pairs(hosts[host].sessions[username].sessions) do
+ if session.interested then
+ -- FIXME do we need to set stanza.attr.to?
+ session.send(stanza);
+ end
+ end
+ end
+end
+
+function load_roster(username, host)
+ if hosts[host] and hosts[host].sessions[username] then
+ local roster = hosts[host].sessions[username].roster;
+ if not roster then
+ roster = datamanager.load(username, host, "roster") or {};
+ hosts[host].sessions[username].roster = roster;
+ end
+ return roster;
+ end
+ -- Attempt to load roster for non-loaded user
+end
+
+function save_roster(username, host)
+ if hosts[host] and hosts[host].sessions[username] and hosts[host].sessions[username].roster then
+ return datamanager.store(username, host, "roster", hosts[host].sessions[username].roster);
+ end
+ return nil;
end
return _M; \ No newline at end of file