mod_muc_members_json/mod_muc_members_json.lua
author Kim Alvefur <zash@zash.se>
Sat, 02 Mar 2024 14:42:27 +0100
changeset 5854 0358fcf14cd6
parent 5661 80abda15a1e9
permissions -rw-r--r--
mod_debug_traceback: Remove direct POSIX signal handling, require Prosody 0.12+ Hooking an event is safer than directly hooking signals For context see Prosody trunk rev 69faf3552d52
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
5590
30b9f78b5058 mod_muc_members_json: New module to import MUC membership from a JSON URL
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     1
local http = require "net.http";
30b9f78b5058 mod_muc_members_json: New module to import MUC membership from a JSON URL
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     2
local json = require "util.json";
30b9f78b5058 mod_muc_members_json: New module to import MUC membership from a JSON URL
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     3
30b9f78b5058 mod_muc_members_json: New module to import MUC membership from a JSON URL
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     4
local json_url = assert(module:get_option_string("muc_members_json_url"), "muc_members_json_url required");
30b9f78b5058 mod_muc_members_json: New module to import MUC membership from a JSON URL
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     5
local managed_mucs = module:get_option("muc_members_json_mucs");
30b9f78b5058 mod_muc_members_json: New module to import MUC membership from a JSON URL
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     6
30b9f78b5058 mod_muc_members_json: New module to import MUC membership from a JSON URL
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     7
local mod_muc = module:depends("muc");
30b9f78b5058 mod_muc_members_json: New module to import MUC membership from a JSON URL
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     8
30b9f78b5058 mod_muc_members_json: New module to import MUC membership from a JSON URL
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     9
--[[
30b9f78b5058 mod_muc_members_json: New module to import MUC membership from a JSON URL
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    10
{
30b9f78b5058 mod_muc_members_json: New module to import MUC membership from a JSON URL
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    11
	xsf = {
30b9f78b5058 mod_muc_members_json: New module to import MUC membership from a JSON URL
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    12
		team_hats = {
30b9f78b5058 mod_muc_members_json: New module to import MUC membership from a JSON URL
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    13
			board = {
30b9f78b5058 mod_muc_members_json: New module to import MUC membership from a JSON URL
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    14
				id = "xmpp:xmpp.org/hats/board";
30b9f78b5058 mod_muc_members_json: New module to import MUC membership from a JSON URL
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    15
				title = "Board";
30b9f78b5058 mod_muc_members_json: New module to import MUC membership from a JSON URL
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    16
			};
30b9f78b5058 mod_muc_members_json: New module to import MUC membership from a JSON URL
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    17
		};
30b9f78b5058 mod_muc_members_json: New module to import MUC membership from a JSON URL
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    18
		member_hat = {
30b9f78b5058 mod_muc_members_json: New module to import MUC membership from a JSON URL
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    19
			id = "xmpp:xmpp.org/hats/member";
30b9f78b5058 mod_muc_members_json: New module to import MUC membership from a JSON URL
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    20
			title = "XSF member";
30b9f78b5058 mod_muc_members_json: New module to import MUC membership from a JSON URL
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    21
		};
30b9f78b5058 mod_muc_members_json: New module to import MUC membership from a JSON URL
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    22
	};
30b9f78b5058 mod_muc_members_json: New module to import MUC membership from a JSON URL
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    23
	iteam = {
30b9f78b5058 mod_muc_members_json: New module to import MUC membership from a JSON URL
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    24
		team_hats = {
30b9f78b5058 mod_muc_members_json: New module to import MUC membership from a JSON URL
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    25
			iteam = {
30b9f78b5058 mod_muc_members_json: New module to import MUC membership from a JSON URL
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    26
				id = "xmpp:xmpp.org/hats/iteam";
30b9f78b5058 mod_muc_members_json: New module to import MUC membership from a JSON URL
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    27
				title = "Infra team";
30b9f78b5058 mod_muc_members_json: New module to import MUC membership from a JSON URL
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    28
			};
30b9f78b5058 mod_muc_members_json: New module to import MUC membership from a JSON URL
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    29
		};
30b9f78b5058 mod_muc_members_json: New module to import MUC membership from a JSON URL
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    30
	};
30b9f78b5058 mod_muc_members_json: New module to import MUC membership from a JSON URL
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    31
}
30b9f78b5058 mod_muc_members_json: New module to import MUC membership from a JSON URL
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    32
--]]
30b9f78b5058 mod_muc_members_json: New module to import MUC membership from a JSON URL
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    33
30b9f78b5058 mod_muc_members_json: New module to import MUC membership from a JSON URL
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    34
local function get_hats(member_info, muc_config)
30b9f78b5058 mod_muc_members_json: New module to import MUC membership from a JSON URL
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    35
	local hats = {};
30b9f78b5058 mod_muc_members_json: New module to import MUC membership from a JSON URL
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    36
	if muc_config.member_hat then
30b9f78b5058 mod_muc_members_json: New module to import MUC membership from a JSON URL
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    37
		hats[muc_config.member_hat.id] = {
30b9f78b5058 mod_muc_members_json: New module to import MUC membership from a JSON URL
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    38
			title = muc_config.member_hat.title;
5591
dd4df71166ea mod_muc_members_json: Set imported hats to active by default
Matthew Wild <mwild1@gmail.com>
parents: 5590
diff changeset
    39
			active = true;
5590
30b9f78b5058 mod_muc_members_json: New module to import MUC membership from a JSON URL
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    40
		};
30b9f78b5058 mod_muc_members_json: New module to import MUC membership from a JSON URL
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    41
	end
30b9f78b5058 mod_muc_members_json: New module to import MUC membership from a JSON URL
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    42
	if muc_config.team_hats and member_info.roles then
30b9f78b5058 mod_muc_members_json: New module to import MUC membership from a JSON URL
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    43
		for _, role in ipairs(member_info.roles) do
30b9f78b5058 mod_muc_members_json: New module to import MUC membership from a JSON URL
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    44
			local hat = muc_config.team_hats[role];
30b9f78b5058 mod_muc_members_json: New module to import MUC membership from a JSON URL
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    45
			if hat then
30b9f78b5058 mod_muc_members_json: New module to import MUC membership from a JSON URL
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    46
				hats[hat.id] = {
30b9f78b5058 mod_muc_members_json: New module to import MUC membership from a JSON URL
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    47
					title = hat.title;
5591
dd4df71166ea mod_muc_members_json: Set imported hats to active by default
Matthew Wild <mwild1@gmail.com>
parents: 5590
diff changeset
    48
					active = true;
5590
30b9f78b5058 mod_muc_members_json: New module to import MUC membership from a JSON URL
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    49
				};
30b9f78b5058 mod_muc_members_json: New module to import MUC membership from a JSON URL
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    50
			end
30b9f78b5058 mod_muc_members_json: New module to import MUC membership from a JSON URL
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    51
		end
30b9f78b5058 mod_muc_members_json: New module to import MUC membership from a JSON URL
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    52
	end
30b9f78b5058 mod_muc_members_json: New module to import MUC membership from a JSON URL
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    53
	return hats;
30b9f78b5058 mod_muc_members_json: New module to import MUC membership from a JSON URL
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    54
end
30b9f78b5058 mod_muc_members_json: New module to import MUC membership from a JSON URL
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    55
30b9f78b5058 mod_muc_members_json: New module to import MUC membership from a JSON URL
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    56
function module.load()
30b9f78b5058 mod_muc_members_json: New module to import MUC membership from a JSON URL
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    57
	http.request(json_url)
30b9f78b5058 mod_muc_members_json: New module to import MUC membership from a JSON URL
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    58
		:next(function (result)
30b9f78b5058 mod_muc_members_json: New module to import MUC membership from a JSON URL
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    59
			return json.decode(result.body);
30b9f78b5058 mod_muc_members_json: New module to import MUC membership from a JSON URL
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    60
		end)
30b9f78b5058 mod_muc_members_json: New module to import MUC membership from a JSON URL
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    61
		:next(function (data)
30b9f78b5058 mod_muc_members_json: New module to import MUC membership from a JSON URL
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    62
			module:log("debug", "DATA: %s", require "util.serialization".serialize(data, "debug"));
30b9f78b5058 mod_muc_members_json: New module to import MUC membership from a JSON URL
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    63
30b9f78b5058 mod_muc_members_json: New module to import MUC membership from a JSON URL
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    64
			for name, muc_config in pairs(managed_mucs) do
30b9f78b5058 mod_muc_members_json: New module to import MUC membership from a JSON URL
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    65
				local muc_jid = name.."@"..module.host;
30b9f78b5058 mod_muc_members_json: New module to import MUC membership from a JSON URL
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    66
				local muc = mod_muc.get_room_from_jid(muc_jid);
30b9f78b5058 mod_muc_members_json: New module to import MUC membership from a JSON URL
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    67
				module:log("warn", "%s -> %s -> %s", name, muc_jid, muc);
30b9f78b5058 mod_muc_members_json: New module to import MUC membership from a JSON URL
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    68
				if muc then
30b9f78b5058 mod_muc_members_json: New module to import MUC membership from a JSON URL
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    69
					local jids = {};
30b9f78b5058 mod_muc_members_json: New module to import MUC membership from a JSON URL
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    70
					for _, member_info in ipairs(data.members) do
30b9f78b5058 mod_muc_members_json: New module to import MUC membership from a JSON URL
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    71
						for _, member_jid in ipairs(member_info.jids) do
30b9f78b5058 mod_muc_members_json: New module to import MUC membership from a JSON URL
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    72
							jids[member_jid] = true;
30b9f78b5058 mod_muc_members_json: New module to import MUC membership from a JSON URL
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    73
							local affiliation = muc:get_affiliation(member_jid);
30b9f78b5058 mod_muc_members_json: New module to import MUC membership from a JSON URL
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    74
							if not affiliation then
30b9f78b5058 mod_muc_members_json: New module to import MUC membership from a JSON URL
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    75
								muc:set_affiliation(true, member_jid, "member", "imported membership");
30b9f78b5058 mod_muc_members_json: New module to import MUC membership from a JSON URL
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    76
								muc:set_affiliation_data(member_jid, "source", module.name);
30b9f78b5058 mod_muc_members_json: New module to import MUC membership from a JSON URL
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    77
							end
30b9f78b5058 mod_muc_members_json: New module to import MUC membership from a JSON URL
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    78
							muc:set_affiliation_data(member_jid, "hats", get_hats(member_info, muc_config));
30b9f78b5058 mod_muc_members_json: New module to import MUC membership from a JSON URL
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    79
						end
30b9f78b5058 mod_muc_members_json: New module to import MUC membership from a JSON URL
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    80
					end
30b9f78b5058 mod_muc_members_json: New module to import MUC membership from a JSON URL
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    81
					-- Remove affiliation from folk who weren't in the source data but previously were
30b9f78b5058 mod_muc_members_json: New module to import MUC membership from a JSON URL
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    82
					for jid, aff, data in muc:each_affiliation() do
5661
80abda15a1e9 mod_muc_members_json: Fix potential error when removing old affiliations
Kim Alvefur <zash@zash.se>
parents: 5591
diff changeset
    83
						if not jids[jid] and data and data.source == module.name then
5590
30b9f78b5058 mod_muc_members_json: New module to import MUC membership from a JSON URL
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    84
							muc:set_affiliation(true, jid, "none", "imported membership lost");
30b9f78b5058 mod_muc_members_json: New module to import MUC membership from a JSON URL
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    85
						end
30b9f78b5058 mod_muc_members_json: New module to import MUC membership from a JSON URL
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    86
					end
30b9f78b5058 mod_muc_members_json: New module to import MUC membership from a JSON URL
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    87
				end
30b9f78b5058 mod_muc_members_json: New module to import MUC membership from a JSON URL
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    88
			end
30b9f78b5058 mod_muc_members_json: New module to import MUC membership from a JSON URL
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    89
30b9f78b5058 mod_muc_members_json: New module to import MUC membership from a JSON URL
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    90
		end):catch(function (err)
30b9f78b5058 mod_muc_members_json: New module to import MUC membership from a JSON URL
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    91
			module:log("error", "FAILED: %s", err);
30b9f78b5058 mod_muc_members_json: New module to import MUC membership from a JSON URL
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    92
		end);
30b9f78b5058 mod_muc_members_json: New module to import MUC membership from a JSON URL
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    93
end