# HG changeset patch # User Kim Alvefur # Date 1675010468 -3600 # Node ID e6324117f124fc6e87af87f7eebd7a226d996ebc # Parent 9f96333640441b1479eca152f11a7c3fc70d6053 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. diff -r 9f9633364044 -r e6324117f124 CHANGES --- 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 diff -r 9f9633364044 -r e6324117f124 plugins/mod_admin_shell.lua --- 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 = {};