IMPORTANT: due to a drive failure, as of 13-Mar-2021, the Mercurial repository had to be re-mirrored, which changed every commit SHA. The old SHAs and trees are backed up in the vault branches. Please migrate to the new branches as soon as you can.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
prosody/plugins/mod_groups.lua

79 lines
2.2 KiB

local groups = { default = {} };
local members = {};
local groups_file;
local jid, datamanager = require "util.jid", require "util.datamanager";
local jid_bare, jid_prep = jid.bare, jid.prep;
local module_host = module:get_host();
function inject_roster_contacts(username, host, roster)
module:log("warn", "Injecting group members to roster");
local bare_jid = username.."@"..host;
if not members[bare_jid] then return; end -- Not a member of any groups
-- Find groups this JID is a member of
for _, group_name in ipairs(members[bare_jid]) do
-- Find other people in the same group
for jid in pairs(groups[group_name]) do
-- Add them to roster
--module:log("debug", "processing jid %s in group %s", tostring(jid), tostring(group_name));
if jid ~= bare_jid then
if not roster[jid] then roster[jid] = {}; end
roster[jid].subscription = "both";
if not roster[jid].groups then
roster[jid].groups = { [group_name] = true };
end
roster[jid].groups[group_name] = true;
roster[jid].persist = false;
end
end
end
end
function remove_virtual_contacts(username, host, datastore, data)
if host == module_host and datastore == "roster" then
local new_roster = {};
for jid, contact in pairs(data) do
if contact.persist ~= false then
new_roster[jid] = contact;
end
end
return username, host, datastore, new_roster;
end
return username, host, datastore, data;
end
function module.load()
groups_file = config.get(module:get_host(), "core", "groups_file");
if not groups_file then return; end
module:hook("roster-load", inject_roster_contacts);
datamanager.add_callback(remove_virtual_contacts);
groups = { default = {} };
local curr_group = "default";
for line in io.lines(groups_file) do
if line:match("^%[%w+%]$") then
curr_group = line:match("^%[(%w+)%]$");
groups[curr_group] = groups[curr_group] or {};
else
-- Add JID
local jid = jid_prep(line);
if jid then
groups[curr_group][jid] = true;
members[jid] = members[jid] or {};
members[jid][#members[jid]+1] = curr_group;
end
end
end
module:log("info", "Groups loaded successfully");
end
function module.unload()
datamanager.remove_callback(remove_virtual_contacts);
end