Add support for listing chats and users.
Description
Add support for listing users end endpoints.
Proposal
module code (version beta)
-- Module for Prosody IM
-- Copyright (C) 2020 CI Task
--
local json = require "util.json";
local iterators = require "util.iterators";
local array = require"util.array";
local wrap_async_run = module:require "util".wrap_async_run;
local get_room_from_jid = module:require "util".get_room_from_jid;
function get_field(data, field_name)
if data[field_name] then
return data[field_name];
end;
return {}
end;
function handle_get_rooms (event)
local rooms = {};
rooms["rooms"] = {};
for key, value in pairs(prosody.full_sessions) do
for key, value in pairs(get_field(value, 'directed')) do
rooms["rooms"][string.gmatch(key, "(.*)/")()] = {};
end
end
rooms["rooms_count"] = iterators.count(pairs(rooms["rooms"]));
for key, value in pairs(rooms["rooms"]) do
local room = get_room_from_jid(key);
local occupants = room._occupants;
value["users"] = array();
if occupants then
value["user_count"] = iterators.count(room:each_occupant());
for _, occupant in room:each_occupant() do
local nick;
local email;
local jid;
local affiliation;
for pr_jid, pr in occupant:each_session() do
jid = pr_jid;
affiliation = room:get_affiliation(occupant.nick);
nick = pr:get_child_text("nick", "http://jabber.org/protocol/nick");
email = pr:get_child_text("email");
end
value["users"]:push({
jid = occupant.nick,
jid2 = jid,
affiliation = affiliation,
email = email,
display_name = nick
})
end
end
end
return json.encode(rooms);
end;
function module.load()
module:depends("http");
module:provides("http", {
default_path = "/";
route = {
["GET rooms"] = function (event) return wrap_async_run(event,handle_get_rooms); end;
};
});
end
example output
{
"rooms": {
"app1@muc.meet.jitsi": {
"user_count": 2,
"users": [
{
"display_name": "korthalsp",
"email": "adres@ustawiony.w.gui",
"jid": "app1@muc.meet.jitsi/04ec24f7",
"jid2": "sqmg1whvfajs8sna@guest.meet.jitsi/AyRhCDW9"
},
{
"jid": "app1@muc.meet.jitsi/focus",
"jid2": "focus@auth.meet.jitsi/focus92606046946366"
}
]
},
"app3@muc.meet.jitsi": {
"user_count": 2,
"users": [
{
"jid": "app3@muc.meet.jitsi/focus",
"jid2": "focus@auth.meet.jitsi/focus92606046946366"
},
{
"display_name": "gosc",
"jid": "app3@muc.meet.jitsi/5722ea9d",
"jid2": "bofurpwrrotym3vg@guest.meet.jitsi/XeriJisT"
}
]
},
"app@muc.meet.jitsi": {
"user_count": 2,
"users": [
{
"jid": "app@muc.meet.jitsi/focus",
"jid2": "focus@auth.meet.jitsi/focus92606046946366"
},
{
"display_name": "korthalsp",
"email": "adres@ustawiony.w.gui",
"jid": "app@muc.meet.jitsi/10c31110",
"jid2": "pdzxeocm93wfxexe@guest.meet.jitsi/n17V_qbq"
}
]
},
"jvbbrewery@internal-muc.meet.jitsi": {
"user_count": 2,
"users": [
{
"jid": "jvbbrewery@internal-muc.meet.jitsi/focus",
"jid2": "focus@auth.meet.jitsi/focus92606046946366"
},
{
"jid": "jvbbrewery@internal-muc.meet.jitsi/b89beabb4f9e",
"jid2": "jvb@auth.meet.jitsi/flmelkY2"
}
]
}
},
"rooms_count": 4
}
Personal suggetion to output:
- We should filter
*@internal-muc.meet.jitsi
(may be needed only for debuging during scaling of JVB) - We should filter
focus
user (Increases number of room members by 1) - We should display
jid2
asjid
(this is user's login in jitsi, may be usefull if we somehow solve issue with logged users use "their" guest account in conference - we should not display
jid
since it is only id in chat
Links / references
Edited by Piotr Korthals