Diff

mod_invites/mod_invites.lua @ 4421:94805a7e7b30

mod_invites: rework CLI parsing to support groups To make this sensible, the code had to move from rather simple parsing to something which looks more like getopt or your typical shell script.
author Jonas Schäfer <jonas@wielicki.name>
date Sun, 31 Jan 2021 19:16:36 +0100
parent 4377:a0f1fb5e7829
child 4422:2047dd56cc40
line wrap: on
line diff
--- a/mod_invites/mod_invites.lua	Sun Jan 31 16:12:47 2021 +0100
+++ b/mod_invites/mod_invites.lua	Sun Jan 31 19:16:36 2021 +0100
@@ -234,7 +234,7 @@
 function module.command(arg)
 	if #arg < 2 or arg[1] ~= "generate" then
 		print("usage: prosodyctl mod_"..module.name.." generate example.com");
-		return;
+		return 2;
 	end
 	table.remove(arg, 1); -- pop command
 
@@ -255,23 +255,60 @@
 		module:depends(invites_page_module);
 	end
 
+	local allow_reset;
+	local roles;
+	local groups = {};
 
-	local invite, roles;
-	if arg[1] == "--reset" then
-		local nodeprep = require "util.encodings".stringprep.nodeprep;
-		local username = nodeprep(arg[2]);
-		if not username then
-			print("Please supply a valid username to generate a reset link for");
-			return;
+	while #arg > 0 do
+		local value = arg[1];
+		table.remove(arg, 1);
+		if value == "--reset" then
+			local nodeprep = require "util.encodings".stringprep.nodeprep;
+			local username = nodeprep(arg[1])
+			table.remove(arg, 1);
+			if not username then
+				print("Please supply a valid username to generate a reset link for");
+				return 2;
+			end
+			allow_reset = username;
+		elseif value == "--admin" then
+			roles = { ["prosody:admin"] = true };
+		elseif value == "--role" then
+			local rolename = arg[1];
+			if not rolename then
+				print("Please supply a role name");
+				return 2;
+			end
+			roles = { [rolename] = true };
+			table.remove(arg, 1);
+		elseif value == "--group" or value == "-g" then
+			local groupid = arg[1];
+			if not groupid then
+				print("Please supply a group ID")
+				return 2;
+			end
+			table.insert(groups, groupid);
+			table.remove(arg, 1);
+		else
+			print("unexpected argument: "..value)
 		end
-		invite = assert(invites.create_account_reset(username));
+	end
+
+	local invite;
+	if allow_reset then
+		if roles then
+			print("--role/--admin and --reset are mutually exclusive")
+			return 2;
+		end
+		if #groups > 0 then
+			print("--group and --reset are mutually exclusive")
+		end
+		invite = assert(invites.create_account_reset(allow_reset));
 	else
-		if arg[1] == "--admin" then
-			roles = { ["prosody:admin"] = true };
-		elseif arg[1] == "--role" then
-			roles = { [arg[2]] = true };
-		end
-		invite = assert(invites.create_account(nil, { roles = roles }));
+		invite = assert(invites.create_account(nil, {
+			roles = roles,
+			groups = groups
+		}));
 	end
 
 	print(invite.landing_page or invite.uri);