Software /
code /
prosody
Changeset
12866:54aea2622459
mod_admin_shell: Add muc:affiliations(room) command to list memberships
Easier than going trough muc:room():each_affiliation() since you have to
do fiddly things to reach the print() function.
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Sun, 29 Jan 2023 17:53:21 +0100 |
parents | 12865:e6324117f124 |
children | 12867:2defb0fc2be9 |
files | CHANGES plugins/mod_admin_shell.lua |
diffstat | 2 files changed, 29 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/CHANGES Sun Jan 29 17:41:08 2023 +0100 +++ b/CHANGES Sun Jan 29 17:53:21 2023 +0100 @@ -23,7 +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 +- Commands to show occupants and affiliations in the Shell ### Security and authentication
--- a/plugins/mod_admin_shell.lua Sun Jan 29 17:41:08 2023 +0100 +++ b/plugins/mod_admin_shell.lua Sun Jan 29 17:53:21 2023 +0100 @@ -290,6 +290,7 @@ 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]] + print [[muc:affiliations(roomjid, filter) - List affiliated members of the room, optionally filtered on substring or affiliation]] elseif section == "server" then print [[server:version() - Show the server's version number]] print [[server:uptime() - Show how long the server has been running]] @@ -1413,6 +1414,33 @@ end end +function def_env.muc:affiliations(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 affiliated_jid, affiliation, affiliation_data in room_obj:each_affiliation() do + if filter == nil or affiliation == filter or affiliated_jid:find(filter, 1, true) then + print(affiliation, affiliated_jid, affiliation_data and affiliation_data.reserved_nickname or "") + displayed = displayed + 1; + end + total = total + 1 + end + + if total == displayed then + return true, ("%d affiliation%s listed"):format(total, total ~= 1 and "s" or "") + else + return true, ("%d out of %d affiliation%s listed"):format(displayed, total, total ~= 1 and "s" or "") + end +end + local um = require"core.usermanager"; def_env.user = {};