summaryrefslogtreecommitdiff
path: root/src/mod_mam.erl
diff options
context:
space:
mode:
authorEvgeny Khramtsov <ekhramtsov@process-one.net>2019-04-03 14:50:56 +0300
committerEvgeny Khramtsov <ekhramtsov@process-one.net>2019-04-03 14:50:56 +0300
commit17b9dc6035eab8b847ef746ce82e11f00e6f8287 (patch)
treef0d3afc778e67cb4122a26fb854722f6e4cb26a0 /src/mod_mam.erl
parentChange mucsub API for database backends (diff)
Decrease ugliness of the ugly code
Diffstat (limited to 'src/mod_mam.erl')
-rw-r--r--src/mod_mam.erl101
1 files changed, 53 insertions, 48 deletions
diff --git a/src/mod_mam.erl b/src/mod_mam.erl
index 63f089b9..3e02c594 100644
--- a/src/mod_mam.erl
+++ b/src/mod_mam.erl
@@ -1107,54 +1107,59 @@ select_with_mucsub(LServer, JidRequestor, JidArchive, Query, RSM) ->
true ->
Mod:select_with_mucsub(LServer, JidRequestor, JidArchive, Query, RSM);
false ->
- case Mod:select(LServer, JidRequestor, JidArchive, Query, RSM, chat) of
- {error, _} = Err ->
- Err;
- {Entries, All, Count} ->
- {Dir, Max} = case RSM of
- #rsm_set{max = M, before = V} when is_binary(V) ->
- {desc, M};
- #rsm_set{max = M} ->
- {asc, M};
- _ ->
- {asc, undefined}
- end,
- SubRooms = case mod_muc_admin:find_hosts(LServer) of
- [First|_] ->
- case mod_muc:get_subscribed_rooms(First, JidRequestor) of
- {ok, L} -> L;
- {error, _} -> []
- end;
- _ ->
- []
- end,
- SubRoomJids = [Jid || {Jid, _} <- SubRooms],
- {E2, A2, C2} = lists:foldl(
- fun(MucJid, {E0, A0, C0}) ->
- case select(LServer, JidRequestor, MucJid, Query, RSM,
- {groupchat, member, #state{config = #config{mam = true}}}) of
- {error, _} ->
- {E0, A0, C0};
- {E, A, C} ->
- {lists:keymerge(2, E0, wrap_as_mucsub(E, JidRequestor)),
- A0 andalso A, C0 + C}
- end
- end, {Entries, All, Count}, SubRoomJids),
- case {Dir, Max} of
- {_, undefined} ->
- {E2, A2, C2};
- {desc, _} ->
- Start = case length(E2) of
- Len when Len < Max -> 1;
- Len -> Len - Max + 1
- end,
- Sub = lists:sublist(E2, Start, Max),
- {Sub, if Sub == E2 -> A2; true -> false end, C2};
- _ ->
- Sub = lists:sublist(E2, 1, Max),
- {Sub, if Sub == E2 -> A2; true -> false end, C2}
- end
- end
+ select_with_mucsub_fallback(LServer, JidRequestor, JidArchive, Query, RSM)
+ end
+ end.
+
+select_with_mucsub_fallback(LServer, JidRequestor, JidArchive, Query, RSM) ->
+ Mod = gen_mod:db_mod(LServer, ?MODULE),
+ case Mod:select(LServer, JidRequestor, JidArchive, Query, RSM, chat) of
+ {error, _} = Err ->
+ Err;
+ {Entries, All, Count} ->
+ {Dir, Max} = case RSM of
+ #rsm_set{max = M, before = V} when is_binary(V) ->
+ {desc, M};
+ #rsm_set{max = M} ->
+ {asc, M};
+ _ ->
+ {asc, undefined}
+ end,
+ SubRooms = case mod_muc_admin:find_hosts(LServer) of
+ [First|_] ->
+ case mod_muc:get_subscribed_rooms(First, JidRequestor) of
+ {ok, L} -> L;
+ {error, _} -> []
+ end;
+ _ ->
+ []
+ end,
+ SubRoomJids = [Jid || {Jid, _} <- SubRooms],
+ {E2, A2, C2} =
+ lists:foldl(
+ fun(MucJid, {E0, A0, C0}) ->
+ case select(LServer, JidRequestor, MucJid, Query, RSM,
+ {groupchat, member, #state{config = #config{mam = true}}}) of
+ {error, _} ->
+ {E0, A0, C0};
+ {E, A, C} ->
+ {lists:keymerge(2, E0, wrap_as_mucsub(E, JidRequestor)),
+ A0 andalso A, C0 + C}
+ end
+ end, {Entries, All, Count}, SubRoomJids),
+ case {Dir, Max} of
+ {_, undefined} ->
+ {E2, A2, C2};
+ {desc, _} ->
+ Start = case length(E2) of
+ Len when Len < Max -> 1;
+ Len -> Len - Max + 1
+ end,
+ Sub = lists:sublist(E2, Start, Max),
+ {Sub, if Sub == E2 -> A2; true -> false end, C2};
+ _ ->
+ Sub = lists:sublist(E2, 1, Max),
+ {Sub, if Sub == E2 -> A2; true -> false end, C2}
end
end.