diff --git a/doc/modules/mod_mam.md b/doc/modules/mod_mam.md index 969230d8efe..e789f7ebad4 100644 --- a/doc/modules/mod_mam.md +++ b/doc/modules/mod_mam.md @@ -66,6 +66,14 @@ Do not add a `` element from MAM v0.6. Name of a module implementing [`is_archivable_message/3` callback](#is_archivable_message) that determines if the message should be archived. +### `modules.mod_mam_meta.send_message` +* **Syntax:** non-empty string +* **Default:** `"mod_mam_utils"` +* **Example:** `send_message = "mod_mam_utils"` + +Name of a module implementing `send_message/4` callback that routes a message during lookup operation. +Consult with `mod_mam_utils:send_message/4` code for more information. + ### `modules.mod_mam_meta.archive_chat_markers` * **Syntax:** boolean * **Default:** `false` diff --git a/src/mam/mod_mam.erl b/src/mam/mod_mam.erl index c5acbb98f2c..c96296df6fb 100644 --- a/src/mam/mod_mam.erl +++ b/src/mam/mod_mam.erl @@ -95,8 +95,7 @@ %% ejabberd -import(mod_mam_utils, - [send_message/3, - is_jid_in_user_roster/2]). + [is_jid_in_user_roster/2]). -include("mongoose.hrl"). @@ -450,12 +449,16 @@ forward_messages(From, ArcJID, MamNs, QueryID, MessageRows, SetClientNs) -> [_|_] -> {message_row_to_ext_id(hd(MessageRows)), message_row_to_ext_id(lists:last(MessageRows))} end, - - [send_message(ArcJID, From, - message_row_to_xml(MamNs, M, QueryID, SetClientNs)) - || M <- MessageRows], + Host = ArcJID#jid.lserver, + SendModule = mod_mam_params:send_message_mod(?MODULE, Host), + [send_message(SendModule, Row, ArcJID, From, + message_row_to_xml(MamNs, Row, QueryID, SetClientNs)) + || Row <- MessageRows], {FirstMessID, LastMessID}. +send_message(SendModule, Row, ArcJID, From, Packet) -> + SendModule:send_message(Row, ArcJID, From, Packet). + -spec handle_get_message_form(jid:jid(), jid:jid(), jlib:iq()) -> jlib:iq(). handle_get_message_form(_From=#jid{lserver = Host}, _ArcJID=#jid{}, IQ=#iq{}) -> diff --git a/src/mam/mod_mam_meta.erl b/src/mam/mod_mam_meta.erl index 857a47d6e84..158807f54c6 100644 --- a/src/mam/mod_mam_meta.erl +++ b/src/mam/mod_mam_meta.erl @@ -56,6 +56,8 @@ config_items() -> <<"no_stanzaid_element">> => #option{type = boolean}, <<"is_archivable_message">> => #option{type = atom, validate = module}, + <<"send_message">> => #option{type = atom, + validate = module}, <<"archive_chat_markers">> => #option{type = boolean}, <<"message_retraction">> => #option{type = boolean}, @@ -202,6 +204,7 @@ valid_core_mod_opts(mod_mam_muc) -> common_opts() -> [is_archivable_message, + send_message, archive_chat_markers, extra_lookup_params, full_text_search, diff --git a/src/mam/mod_mam_muc.erl b/src/mam/mod_mam_muc.erl index 6ef9165dd6a..eee50182a45 100644 --- a/src/mam/mod_mam_muc.erl +++ b/src/mam/mod_mam_muc.erl @@ -90,11 +90,6 @@ [mess_id_to_external_binary/1, is_complete_result_page/4]). -%% ejabberd --import(mod_mam_utils, - [send_message/3]). - - -include_lib("mongoose.hrl"). -include_lib("jlib.hrl"). -include_lib("exml/include/exml.hrl"). @@ -422,11 +417,17 @@ forward_messages(From, ArcJID, MamNs, QueryID, MessageRows, SetClientNs) -> message_row_to_ext_id(lists:last(MessageRows)), is_user_identity_hidden(From, ArcJID)} end, - [send_message(ArcJID, From, message_row_to_xml(MamNs, From, HideUser, SetClientNs, Row, - QueryID)) + {ok, Host} = mongoose_subhosts:get_host(ArcJID#jid.lserver), + SendModule = mod_mam_params:send_message_mod(?MODULE, Host), + [send_message(SendModule, Row, ArcJID, From, + message_row_to_xml(MamNs, From, HideUser, SetClientNs, Row, + QueryID)) || Row <- MessageRows], {FirstMessID, LastMessID}. +send_message(SendModule, Row, ArcJID, From, Packet) -> + SendModule:send_message(Row, ArcJID, From, Packet). + -spec handle_get_message_form(jid:jid(), jid:jid(), jlib:iq()) -> jlib:iq(). handle_get_message_form(_From = #jid{lserver = Host}, _ArcJID = #jid{}, IQ = #iq{}) -> diff --git a/src/mam/mod_mam_params.erl b/src/mam/mod_mam_params.erl index 0fe986742ad..c31ad34edd6 100644 --- a/src/mam/mod_mam_params.erl +++ b/src/mam/mod_mam_params.erl @@ -19,8 +19,8 @@ -type mam_module() :: mod_mam | mod_mam_muc. -export([extra_params_module/2, max_result_limit/2, default_result_limit/2, - has_full_text_search/2, is_archivable_message_fun/2, archive_chat_markers/2, - add_stanzaid_element/2]). + has_full_text_search/2, is_archivable_message_fun/2, send_message_mod/2, + archive_chat_markers/2, add_stanzaid_element/2]). %%-------------------------------------------------------------------- %% API @@ -58,6 +58,10 @@ is_archivable_message_fun(Module, Host) -> end, {IsArchivableModule, IsArchivableFunction}. +-spec send_message_mod(mam_module(), Host :: jid:lserver()) -> module(). +send_message_mod(Module, Host) -> + param(Module, Host, send_message, mod_mam_utils). + -spec archive_chat_markers(mam_module(), Host :: jid:lserver()) -> boolean(). archive_chat_markers(Module, Host) -> param(Module, Host, archive_chat_markers, false). diff --git a/src/mam/mod_mam_utils.erl b/src/mam/mod_mam_utils.erl index 70cfcdf496c..cb10f6956e5 100644 --- a/src/mam/mod_mam_utils.erl +++ b/src/mam/mod_mam_utils.erl @@ -85,7 +85,7 @@ check_for_item_not_found/3]). %% Ejabberd --export([send_message/3, +-export([send_message/4, maybe_set_client_xmlns/2, is_jid_in_user_roster/2]). @@ -1061,23 +1061,10 @@ wait_shaper(Host, Action, From) -> %% ----------------------------------------------------------------------- %% Ejabberd --spec send_message(jid:jid(), jid:jid(), exml:element() - ) -> mongoose_acc:t(). - --ifdef(MAM_COMPACT_FORWARDED). - -send_message(_From, To, Mess) -> - From = jid:from_binary(exml_query:attr(Mess, <<"from">>)), - ejabberd_sm:route(From, To, Mess). - --else. - -send_message(From, To, Mess) -> +-spec send_message(mod_mam:message_row(), jid:jid(), jid:jid(), exml:element()) -> mongoose_acc:t(). +send_message(_Row, From, To, Mess) -> ejabberd_sm:route(From, To, Mess). --endif. - - -spec is_jid_in_user_roster(jid:jid(), jid:jid()) -> boolean(). is_jid_in_user_roster(#jid{lserver = LServer} = ToJID, #jid{} = RemJID) ->