1
0
Fork 0
mirror of https://github.com/processone/ejabberd synced 2025-10-03 01:39:35 +02:00

Make rsm handling in disco items mod_muc, correctly count skipped rooms

This commit is contained in:
Paweł Chmielowski 2024-12-18 15:07:13 +01:00
parent 2aa673e780
commit 26e8679359

View file

@ -994,15 +994,38 @@ iq_disco_items(ServerHost, Host, From, Lang, MaxRoomsDiscoItems, Node, RSM)
#rsm_set{max = Max} ->
Max
end,
{Items, HitMax} = lists:foldr(
fun(_, {Acc, _}) when length(Acc) >= MaxItems ->
{Acc, true};
(R, {Acc, _}) ->
RMod = gen_mod:ram_db_mod(ServerHost, ?MODULE),
RsmSupported = RMod:rsm_supported(),
GetRooms =
fun GetRooms(AccInit, Rooms) ->
{Items, HitMax, DidSkip, Last, First} = lists:foldr(
fun(_, {Acc, _, Skip, F, L}) when length(Acc) >= MaxItems ->
{Acc, true, Skip, F, L};
({RN, _, _} = R, {Acc, _, Skip, F, _}) ->
F2 = if F == undefined -> RN; true -> F end,
case get_room_disco_item(R, Query) of
{ok, Item} -> {[Item | Acc], false};
{error, _} -> {Acc, false}
{ok, Item} -> {[Item | Acc], false, Skip, F2, RN};
{error, _} -> {Acc, false, true, F2, RN}
end
end, {[], false}, get_online_rooms(ServerHost, Host, RSM)),
end, AccInit, Rooms),
if RsmSupported andalso not HitMax andalso DidSkip ->
RSM2 = case RSM of
#rsm_set{'after' = undefined, before = undefined} ->
#rsm_set{max = MaxItems - length(Items), 'after' = Last};
#rsm_set{'after' = undefined} ->
#rsm_set{max = MaxItems - length(Items), 'before' = First};
_ ->
#rsm_set{max = MaxItems - length(Items), 'after' = Last}
end,
GetRooms({Items, false, false, undefined, undefined},
get_online_rooms(ServerHost, Host, RSM2));
true -> {Items, HitMax}
end
end,
{Items, HitMax} =
GetRooms({[], false, false, undefined, undefined},
get_online_rooms(ServerHost, Host, RSM)),
ResRSM = case Items of
[_|_] when RSM /= undefined; HitMax ->
#disco_item{jid = #jid{luser = First}} = hd(Items),