summaryrefslogtreecommitdiff
path: root/src/mod_mam.erl
diff options
context:
space:
mode:
authorEvgeny Khramtsov <ekhramtsov@process-one.net>2019-02-21 12:36:33 +0300
committerEvgeny Khramtsov <ekhramtsov@process-one.net>2019-02-21 12:36:33 +0300
commit1684436bfe397d6d7e52f6bf88050328ea23649c (patch)
treeefd3720a895155c88dc41e3923afe9f280d5f938 /src/mod_mam.erl
parentTravis CI: Update MySQL APT repository key (diff)
parentMerge branch 'master' into mix (diff)
Merge branch 'mix'
Diffstat (limited to 'src/mod_mam.erl')
-rw-r--r--src/mod_mam.erl66
1 files changed, 37 insertions, 29 deletions
diff --git a/src/mod_mam.erl b/src/mod_mam.erl
index 7dc80e46..f1f48126 100644
--- a/src/mod_mam.erl
+++ b/src/mod_mam.erl
@@ -41,7 +41,8 @@
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,
- is_empty_for_user/2, is_empty_for_room/3, check_create_room/4]).
+ is_empty_for_user/2, is_empty_for_room/3, check_create_room/4,
+ process_iq/3, store_mam_message/7, make_id/0]).
-include("xmpp.hrl").
-include("logger.hrl").
@@ -120,6 +121,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,
@@ -135,14 +138,12 @@ start(Host, Opts) ->
ejabberd_hooks:add(check_create_room, Host, ?MODULE,
check_create_room, 50)
end,
- ejabberd_commands:register_commands(get_commands_spec());
+ ejabberd_commands:register_commands(get_commands_spec()),
+ ok;
Err ->
Err
end.
-
-
-
use_cache(Mod, Host) ->
case erlang:function_exported(Mod, use_cache, 2) of
true -> Mod:use_cache(Host);
@@ -196,6 +197,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,
@@ -435,6 +438,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.
@@ -445,7 +452,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).
@@ -549,7 +556,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),
@@ -656,7 +663,7 @@ process_iq(LServer, #iq{from = #jid{luser = LUser}, lang = Lang,
Ret = case MsgType of
chat ->
maybe_activate_mam(LUser, LServer);
- {groupchat, _Role, _MUCState} ->
+ _ ->
ok
end,
case Ret of
@@ -877,15 +884,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
@@ -902,20 +903,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,
@@ -1003,7 +1007,7 @@ select_and_send(LServer, Query, RSM, #iq{from = From, to = To} = IQ, MsgType) ->
Ret = case MsgType of
chat ->
select(LServer, From, From, Query, RSM, MsgType);
- {groupchat, _Role, _MUCState} ->
+ _ ->
select(LServer, From, To, Query, RSM, MsgType)
end,
case Ret of
@@ -1072,7 +1076,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)},
@@ -1107,7 +1115,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()}],