Software / code / prosody
Comparison
plugins/mod_admin_shell.lua @ 12870:56397f3b58c1
mod_admin_shell: Sort MUC users by relation and JID
Suggested by MattJ, our resident UI expert :)
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Sun, 29 Jan 2023 21:37:13 +0100 |
| parent | 12869:70ee82579076 |
| child | 12871:885323e2a1ce |
comparison
equal
deleted
inserted
replaced
| 12869:70ee82579076 | 12870:56397f3b58c1 |
|---|---|
| 1359 return nil, "No such room: "..room_jid; | 1359 return nil, "No such room: "..room_jid; |
| 1360 end | 1360 end |
| 1361 return room_obj; | 1361 return room_obj; |
| 1362 end | 1362 end |
| 1363 | 1363 |
| 1364 local muc_util = module:require"muc/util"; | |
| 1365 | |
| 1364 function def_env.muc:create(room_jid, config) | 1366 function def_env.muc:create(room_jid, config) |
| 1365 local room_name, host = check_muc(room_jid); | 1367 local room_name, host = check_muc(room_jid); |
| 1366 if not room_name then | 1368 if not room_name then |
| 1367 return room_name, host; | 1369 return room_name, host; |
| 1368 end | 1370 end |
| 1404 local row = format_table({ | 1406 local row = format_table({ |
| 1405 { title = "Role"; width = 12; key = "role" }; -- longest role name | 1407 { title = "Role"; width = 12; key = "role" }; -- longest role name |
| 1406 { title = "JID"; width = "75%"; key = "bare_jid" }; | 1408 { title = "JID"; width = "75%"; key = "bare_jid" }; |
| 1407 { title = "Nickname"; width = "25%"; key = "nick"; mapper = jid_resource }; | 1409 { title = "Nickname"; width = "25%"; key = "nick"; mapper = jid_resource }; |
| 1408 }, self.session.width); | 1410 }, self.session.width); |
| 1409 local total, displayed = 0, 0; | 1411 local occupants = array.collect(iterators.select(2, room_obj:each_occupant())); |
| 1410 for nick_jid, occupant in room_obj:each_occupant() do | 1412 local total = #occupants; |
| 1411 if total == 0 then | 1413 if filter then |
| 1412 print(row()); | 1414 occupants:filter(function(occupant) |
| 1413 end | 1415 return occupant.role == filter or jid_resource(occupant.nick):find(filter, 1, true); |
| 1414 local nick = jid_resource(nick_jid); | 1416 end); |
| 1415 if filter == nil or occupant.role == filter or nick:find(filter, 1, true) then | 1417 end |
| 1416 print(row(occupant)); | 1418 local displayed = #occupants; |
| 1417 displayed = displayed + 1; | 1419 occupants:sort(function(a, b) |
| 1418 end | 1420 if a.role ~= b.role then |
| 1419 total = total + 1 | 1421 return muc_util.valid_roles[a.role] > muc_util.valid_roles[b.role]; |
| 1422 else | |
| 1423 return a.bare_jid < b.bare_jid; | |
| 1424 end | |
| 1425 end); | |
| 1426 | |
| 1427 if displayed == 0 then | |
| 1428 return true, ("%d out of %d occupant%s listed"):format(displayed, total, total ~= 1 and "s" or "") | |
| 1429 end | |
| 1430 | |
| 1431 print(row()); | |
| 1432 for _, occupant in ipairs(occupants) do | |
| 1433 print(row(occupant)); | |
| 1420 end | 1434 end |
| 1421 | 1435 |
| 1422 if total == displayed then | 1436 if total == displayed then |
| 1423 return true, ("%d occupant%s listed"):format(total, total ~= 1 and "s" or "") | 1437 return true, ("%d occupant%s listed"):format(total, total ~= 1 and "s" or "") |
| 1424 else | 1438 else |
| 1436 local row = format_table({ | 1450 local row = format_table({ |
| 1437 { title = "Affiliation"; width = 12 }; -- longest affiliation name | 1451 { title = "Affiliation"; width = 12 }; -- longest affiliation name |
| 1438 { title = "JID"; width = "75%" }; | 1452 { title = "JID"; width = "75%" }; |
| 1439 { title = "Nickname"; width = "25%"; key = "reserved_nickname" }; | 1453 { title = "Nickname"; width = "25%"; key = "reserved_nickname" }; |
| 1440 }, self.session.width); | 1454 }, self.session.width); |
| 1441 local total, displayed = 0, 0; | 1455 local affiliated = array(); |
| 1442 for affiliated_jid, affiliation, affiliation_data in room_obj:each_affiliation() do | 1456 for affiliated_jid, affiliation, affiliation_data in room_obj:each_affiliation() do |
| 1443 if total == 0 then | 1457 affiliated:push(setmetatable({ affiliation; affiliated_jid }, { __index = affiliation_data })); |
| 1444 print(row()); | 1458 end |
| 1445 end | 1459 |
| 1446 if filter == nil or affiliation == filter or affiliated_jid:find(filter, 1, true) then | 1460 local total = #affiliated; |
| 1447 print(row(setmetatable({ affiliation; affiliated_jid }, { __index = affiliation_data }))) | 1461 if filter then |
| 1448 displayed = displayed + 1; | 1462 affiliated:filter(function(affiliation) |
| 1449 end | 1463 return filter == affiliation[1] or filter == affiliation[2]; |
| 1450 total = total + 1 | 1464 end); |
| 1451 end | 1465 end |
| 1466 local displayed = #affiliated; | |
| 1467 local aff_ranking = muc_util.valid_affiliations; | |
| 1468 affiliated:sort(function(a, b) | |
| 1469 if a[1] ~= b[1] then | |
| 1470 return aff_ranking[a[1]] > aff_ranking[b[1]]; | |
| 1471 else | |
| 1472 return a[2] < b[2]; | |
| 1473 end | |
| 1474 end); | |
| 1475 | |
| 1476 if displayed == 0 then | |
| 1477 return true, ("%d out of %d affiliations%s listed"):format(displayed, total, total ~= 1 and "s" or "") | |
| 1478 end | |
| 1479 | |
| 1480 print(row()); | |
| 1481 for _, affiliation in ipairs(affiliated) do | |
| 1482 print(row(affiliation)); | |
| 1483 end | |
| 1484 | |
| 1452 | 1485 |
| 1453 if total == displayed then | 1486 if total == displayed then |
| 1454 return true, ("%d affiliation%s listed"):format(total, total ~= 1 and "s" or "") | 1487 return true, ("%d affiliation%s listed"):format(total, total ~= 1 and "s" or "") |
| 1455 else | 1488 else |
| 1456 return true, ("%d out of %d affiliation%s listed"):format(displayed, total, total ~= 1 and "s" or "") | 1489 return true, ("%d out of %d affiliation%s listed"):format(displayed, total, total ~= 1 and "s" or "") |