aboutsummaryrefslogtreecommitdiff
path: root/src/mod_mam.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/mod_mam.erl')
-rw-r--r--src/mod_mam.erl60
1 files changed, 35 insertions, 25 deletions
diff --git a/src/mod_mam.erl b/src/mod_mam.erl
index 58108fb1e..32c13c875 100644
--- a/src/mod_mam.erl
+++ b/src/mod_mam.erl
@@ -40,7 +40,8 @@
muc_process_iq/2, muc_filter_message/3, message_is_archived/3,
delete_old_messages/2, get_commands_spec/0, msg_to_el/4,
get_room_config/4, set_room_option/3, offline_message/1, export/1,
- mod_options/1, remove_mam_for_user_with_peer/3, remove_mam_for_user/2]).
+ mod_options/1, remove_mam_for_user_with_peer/3, remove_mam_for_user/2,
+ process_iq/3, store_mam_message/7, make_id/0]).
-include("xmpp.hrl").
-include("logger.hrl").
@@ -116,6 +117,8 @@ start(Host, Opts) ->
get_room_config, 50),
ejabberd_hooks:add(set_room_option, Host, ?MODULE,
set_room_option, 50),
+ ejabberd_hooks:add(store_mam_message, Host, ?MODULE,
+ store_mam_message, 100),
case gen_mod:get_opt(assume_mam_usage, Opts) of
true ->
ejabberd_hooks:add(message_is_archived, Host, ?MODULE,
@@ -181,6 +184,8 @@ stop(Host) ->
get_room_config, 50),
ejabberd_hooks:delete(set_room_option, Host, ?MODULE,
set_room_option, 50),
+ ejabberd_hooks:delete(store_mam_message, Host, ?MODULE,
+ store_mam_message, 100),
case gen_mod:get_module_opt(Host, ?MODULE, assume_mam_usage) of
true ->
ejabberd_hooks:delete(message_is_archived, Host, ?MODULE,
@@ -412,6 +417,10 @@ muc_filter_message(#message{from = From} = Pkt,
muc_filter_message(Acc, _MUCState, _FromNick) ->
Acc.
+-spec make_id() -> binary().
+make_id() ->
+ p1_time_compat:system_time(micro_seconds).
+
-spec get_stanza_id(stanza()) -> integer().
get_stanza_id(#message{meta = #{stanza_id := ID}}) ->
ID.
@@ -422,7 +431,7 @@ init_stanza_id(#message{meta = #{stanza_id := _ID}} = Pkt, _LServer) ->
init_stanza_id(#message{meta = #{from_offline := true}} = Pkt, _LServer) ->
Pkt;
init_stanza_id(Pkt, LServer) ->
- ID = p1_time_compat:system_time(micro_seconds),
+ ID = make_id(),
Pkt1 = strip_my_stanza_id(Pkt, LServer),
xmpp:put_meta(Pkt1, stanza_id, ID).
@@ -526,7 +535,7 @@ message_is_archived(false, #{lserver := LServer}, Pkt) ->
delete_old_messages(TypeBin, Days) when TypeBin == <<"chat">>;
TypeBin == <<"groupchat">>;
TypeBin == <<"all">> ->
- CurrentTime = p1_time_compat:system_time(micro_seconds),
+ CurrentTime = make_id(),
Diff = Days * 24 * 60 * 60 * 1000000,
TimeStamp = misc:usec_to_now(CurrentTime - Diff),
Type = misc:binary_to_atom(TypeBin),
@@ -610,7 +619,7 @@ process_iq(LServer, #iq{from = #jid{luser = LUser}, lang = Lang,
case MsgType of
chat ->
maybe_activate_mam(LUser, LServer);
- {groupchat, _Role, _MUCState} ->
+ _ ->
ok
end,
case SubEl of
@@ -824,15 +833,9 @@ store_msg(Pkt, LUser, LServer, Peer, Dir) ->
ok; % Already stored.
{true, _} ->
case ejabberd_hooks:run_fold(store_mam_message, LServer, Pkt,
- [LUser, LServer, Peer, chat, Dir]) of
- drop ->
- pass;
- Pkt1 ->
- US = {LUser, LServer},
- ID = get_stanza_id(Pkt1),
- El = xmpp:encode(Pkt1),
- Mod = gen_mod:db_mod(LServer, ?MODULE),
- Mod:store(El, LServer, US, chat, Peer, <<"">>, Dir, ID)
+ [LUser, LServer, Peer, <<"">>, chat, Dir]) of
+ #message{} -> ok;
+ _ -> pass
end;
{false, _} ->
pass
@@ -846,20 +849,23 @@ store_muc(MUCState, Pkt, RoomJID, Peer, Nick) ->
{U, S, _} = jid:tolower(RoomJID),
LServer = MUCState#state.server_host,
case ejabberd_hooks:run_fold(store_mam_message, LServer, Pkt,
- [U, S, Peer, groupchat, recv]) of
- drop ->
- pass;
- Pkt1 ->
- US = {U, S},
- ID = get_stanza_id(Pkt1),
- El = xmpp:encode(Pkt1),
- Mod = gen_mod:db_mod(LServer, ?MODULE),
- Mod:store(El, LServer, US, groupchat, Peer, Nick, recv, ID)
+ [U, S, Peer, Nick, groupchat, recv]) of
+ #message{} -> ok;
+ _ -> pass
end;
false ->
pass
end.
+store_mam_message(Pkt, U, S, Peer, Nick, Type, Dir) ->
+ LServer = ejabberd_router:host_of_route(S),
+ US = {U, S},
+ ID = get_stanza_id(Pkt),
+ El = xmpp:encode(Pkt),
+ Mod = gen_mod:db_mod(LServer, ?MODULE),
+ Mod:store(El, LServer, US, Type, Peer, Nick, Dir, ID),
+ Pkt.
+
write_prefs(LUser, LServer, Host, Default, Always, Never) ->
Prefs = #archive_prefs{us = {LUser, LServer},
default = Default,
@@ -944,7 +950,7 @@ select_and_send(LServer, Query, RSM, #iq{from = From, to = To} = IQ, MsgType) ->
case MsgType of
chat ->
select(LServer, From, From, Query, RSM, MsgType);
- {groupchat, _Role, _MUCState} ->
+ _ ->
select(LServer, From, To, Query, RSM, MsgType)
end,
SortedMsgs = lists:keysort(2, Msgs),
@@ -1006,7 +1012,11 @@ msg_to_el(#archive_msg{timestamp = TS, packet = El, nick = Nick,
CodecOpts = ejabberd_config:codec_options(LServer),
try xmpp:decode(El, ?NS_CLIENT, CodecOpts) of
Pkt1 ->
- Pkt2 = set_stanza_id(Pkt1, JidArchive, ID),
+ Pkt2 = case MsgType of
+ chat -> set_stanza_id(Pkt1, JidArchive, ID);
+ {groupchat, _, _} -> set_stanza_id(Pkt1, JidArchive, ID);
+ _ -> Pkt1
+ end,
Pkt3 = maybe_update_from_to(
Pkt2, JidRequestor, JidArchive, Peer, MsgType, Nick),
Delay = #delay{stamp = TS, from = jid:make(LServer)},
@@ -1041,7 +1051,7 @@ maybe_update_from_to(#message{sub_els = Els} = Pkt, JidRequestor, JidArchive,
Pkt#message{from = jid:replace_resource(JidArchive, Nick),
to = undefined,
sub_els = Items ++ Els};
-maybe_update_from_to(Pkt, _JidRequestor, _JidArchive, _Peer, chat, _Nick) ->
+maybe_update_from_to(Pkt, _JidRequestor, _JidArchive, _Peer, _MsgType, _Nick) ->
Pkt.
-spec send([{binary(), integer(), xmlel()}],