local http = require "net.http";
local json = require "util.json";
local json_url = assert(module:get_option_string("muc_members_json_url"), "muc_members_json_url required");
local managed_mucs = module:get_option("muc_members_json_mucs");
local mod_muc = module:depends("muc");
--[[
{
xsf = {
team_hats = {
board = {
id = "xmpp:xmpp.org/hats/board";
title = "Board";
};
};
member_hat = {
id = "xmpp:xmpp.org/hats/member";
title = "XSF member";
};
};
iteam = {
team_hats = {
iteam = {
id = "xmpp:xmpp.org/hats/iteam";
title = "Infra team";
};
};
};
}
--]]
local function get_hats(member_info, muc_config)
local hats = {};
if muc_config.member_hat then
hats[muc_config.member_hat.id] = {
title = muc_config.member_hat.title;
active = true;
};
end
if muc_config.team_hats and member_info.roles then
for _, role in ipairs(member_info.roles) do
local hat = muc_config.team_hats[role];
if hat then
hats[hat.id] = {
title = hat.title;
active = true;
};
end
end
end
return hats;
end
function module.load()
http.request(json_url)
:next(function (result)
return json.decode(result.body);
end)
:next(function (data)
module:log("debug", "DATA: %s", require "util.serialization".serialize(data, "debug"));
for name, muc_config in pairs(managed_mucs) do
local muc_jid = name.."@"..module.host;
local muc = mod_muc.get_room_from_jid(muc_jid);
module:log("warn", "%s -> %s -> %s", name, muc_jid, muc);
if muc then
local jids = {};
for _, member_info in ipairs(data.members) do
for _, member_jid in ipairs(member_info.jids) do
jids[member_jid] = true;
local affiliation = muc:get_affiliation(member_jid);
if not affiliation then
muc:set_affiliation(true, member_jid, "member", "imported membership");
muc:set_affiliation_data(member_jid, "source", module.name);
end
muc:set_affiliation_data(member_jid, "hats", get_hats(member_info, muc_config));
end
end
-- Remove affiliation from folk who weren't in the source data but previously were
for jid, aff, data in muc:each_affiliation() do
if not jids[jid] and data and data.source == module.name then
muc:set_affiliation(true, jid, "none", "imported membership lost");
end
end
end
end
end):catch(function (err)
module:log("error", "FAILED: %s", err);
end);
end