mod_admin_shell: Add muc:occupants(room) command to list occupants
authorKim Alvefur <zash@zash.se>
Sun, 29 Jan 2023 17:41:08 +0100
changeset 12869 e6324117f124
parent 12868 9f9633364044
child 12870 54aea2622459
mod_admin_shell: Add muc:occupants(room) command to list occupants Easier than going trough muc:room():each_occupant() since you have to do fiddly things to reach the print() function.
CHANGES
plugins/mod_admin_shell.lua
--- a/CHANGES	Sun Jan 22 15:43:44 2023 +0100
+++ b/CHANGES	Sun Jan 29 17:41:08 2023 +0100
@@ -23,6 +23,7 @@
     - muc_room_allow_persistent = false restricts to admins
   - Public rooms can only be created by local users (parent host) by default
     - muc_room_allow_public = false restricts to admins
+- Commands to show occupants in the Shell
 
 ### Security and authentication
 
--- a/plugins/mod_admin_shell.lua	Sun Jan 22 15:43:44 2023 +0100
+++ b/plugins/mod_admin_shell.lua	Sun Jan 29 17:41:08 2023 +0100
@@ -25,7 +25,7 @@
 local unpack = table.unpack;
 local iterators = require "util.iterators";
 local keys, values = iterators.keys, iterators.values;
-local jid_bare, jid_split, jid_join = import("util.jid", "bare", "prepped_split", "join");
+local jid_bare, jid_split, jid_join, jid_resource = import("util.jid", "bare", "prepped_split", "join", "resource");
 local set, array = require "util.set", require "util.array";
 local cert_verify_identity = require "util.x509".verify_identity;
 local envload = require "util.envload".envload;
@@ -289,6 +289,7 @@
 		print [[muc:create(roomjid, { config }) - Create the specified MUC room with the given config]]
 		print [[muc:list(host) - List rooms on the specified MUC component]]
 		print [[muc:room(roomjid) - Reference the specified MUC room to access MUC API methods]]
+		print [[muc:occupants(roomjid, filter) - List room occupants, optionally filtered on substring or role]]
 	elseif section == "server" then
 		print [[server:version() - Show the server's version number]]
 		print [[server:uptime() - Show how long the server has been running]]
@@ -1384,6 +1385,34 @@
 	return true, c.." rooms";
 end
 
+function def_env.muc:occupants(room_jid, filter)
+	local room_name, host = check_muc(room_jid);
+	if not room_name then
+		return room_name, host;
+	end
+	local room_obj = prosody.hosts[host].modules.muc.get_room_from_jid(room_jid);
+	if not room_obj then
+		return nil, "No such room: " .. room_jid;
+	end
+
+	local print = self.session.print;
+	local total, displayed = 0, 0;
+	for nick_jid, occupant in room_obj:each_occupant() do
+		local nick = jid_resource(nick_jid);
+		if filter == nil or occupant.role == filter or nick:find(filter, 1, true) then
+			print(occupant.role, nick);
+			displayed = displayed + 1;
+		end
+		total = total + 1
+	end
+
+	if total == displayed then
+		return true, ("%d occupant%s listed"):format(total, total ~= 1 and "s" or "")
+	else
+		return true, ("%d out of %d occupant%s listed"):format(displayed, total, total ~= 1 and "s" or "")
+	end
+end
+
 local um = require"core.usermanager";
 
 def_env.user = {};