diff options
Diffstat (limited to 'core/rostermanager.lua')
-rw-r--r-- | core/rostermanager.lua | 82 |
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 |