25
1
mirror of https://github.com/processone/ejabberd.git synced 2024-11-24 16:23:40 +01:00

mod_push: Add 'notify_on' option

If the new 'notify_on' option is set to 'messages', notifications are
only triggered by actual chat messages with a body (or encrypted
payload).  The default behavior remains to generate a notification on
any kind of stanzas.

Thanks to EISST International Ltd for sponsoring this work.
This commit is contained in:
Holger Weiss 2023-09-08 19:49:17 +02:00
parent 7522c29f25
commit 2782430887
2 changed files with 36 additions and 12 deletions

View File

@ -135,6 +135,8 @@ depends(_Host, _Opts) ->
[]. [].
-spec mod_opt_type(atom()) -> econf:validator(). -spec mod_opt_type(atom()) -> econf:validator().
mod_opt_type(notify_on) ->
econf:enum([messages, all]);
mod_opt_type(include_sender) -> mod_opt_type(include_sender) ->
econf:bool(); econf:bool();
mod_opt_type(include_body) -> mod_opt_type(include_body) ->
@ -154,7 +156,8 @@ mod_opt_type(cache_life_time) ->
-spec mod_options(binary()) -> [{atom(), any()}]. -spec mod_options(binary()) -> [{atom(), any()}].
mod_options(Host) -> mod_options(Host) ->
[{include_sender, false}, [{notify_on, all},
{include_sender, false},
{include_body, <<"New message">>}, {include_body, <<"New message">>},
{db_type, ejabberd_config:default_db(Host, ?MODULE)}, {db_type, ejabberd_config:default_db(Host, ?MODULE)},
{use_cache, ejabberd_option:use_cache(Host)}, {use_cache, ejabberd_option:use_cache(Host)},
@ -175,7 +178,16 @@ mod_doc() ->
"notification delivery to the user's mobile device using " "notification delivery to the user's mobile device using "
"platform-dependant backend services such as FCM or APNS."), "platform-dependant backend services such as FCM or APNS."),
opts => opts =>
[{include_sender, [{notify_on,
#{value => "messages | all",
desc =>
?T("If this option is set to 'messages', notifications are "
"generated only for actual chat messages with a body text "
"(or some encrypted payload). If it's set to 'all', any "
"kind of XMPP stanza will trigger a notification. If "
"unsure, it's strongly recommended to stick to 'all', "
"which is the default value.")}},
{include_sender,
#{value => "true | false", #{value => "true | false",
desc => desc =>
?T("If this option is set to 'true', the sender's JID " ?T("If this option is set to 'true', the sender's JID "
@ -510,7 +522,11 @@ notify(LUser, LServer, Clients, Pkt, Dir) ->
notify(LServer, PushLJID, Node, XData, Pkt0, Dir, HandleResponse) -> notify(LServer, PushLJID, Node, XData, Pkt0, Dir, HandleResponse) ->
Pkt = unwrap_message(Pkt0), Pkt = unwrap_message(Pkt0),
From = jid:make(LServer), From = jid:make(LServer),
Summary = make_summary(LServer, Pkt, Dir), case {make_summary(LServer, Pkt, Dir), mod_push_opt:notify_on(LServer)} of
{undefined, messages} ->
?DEBUG("Suppressing notification for stanza without payload", []),
ok;
{Summary, _NotifyOn} ->
Item = #ps_item{sub_els = [#push_notification{xdata = Summary}]}, Item = #ps_item{sub_els = [#push_notification{xdata = Summary}]},
PubSub = #pubsub{publish = #ps_publish{node = Node, items = [Item]}, PubSub = #pubsub{publish = #ps_publish{node = Node, items = [Item]},
publish_options = XData}, publish_options = XData},
@ -519,7 +535,8 @@ notify(LServer, PushLJID, Node, XData, Pkt0, Dir, HandleResponse) ->
to = jid:make(PushLJID), to = jid:make(PushLJID),
id = p1_rand:get_string(), id = p1_rand:get_string(),
sub_els = [PubSub]}, sub_els = [PubSub]},
ejabberd_router:route_iq(IQ, HandleResponse). ejabberd_router:route_iq(IQ, HandleResponse)
end.
%%-------------------------------------------------------------------- %%--------------------------------------------------------------------
%% Miscellaneous. %% Miscellaneous.

View File

@ -9,6 +9,7 @@
-export([db_type/1]). -export([db_type/1]).
-export([include_body/1]). -export([include_body/1]).
-export([include_sender/1]). -export([include_sender/1]).
-export([notify_on/1]).
-export([use_cache/1]). -export([use_cache/1]).
-spec cache_life_time(gen_mod:opts() | global | binary()) -> 'infinity' | pos_integer(). -spec cache_life_time(gen_mod:opts() | global | binary()) -> 'infinity' | pos_integer().
@ -47,6 +48,12 @@ include_sender(Opts) when is_map(Opts) ->
include_sender(Host) -> include_sender(Host) ->
gen_mod:get_module_opt(Host, mod_push, include_sender). gen_mod:get_module_opt(Host, mod_push, include_sender).
-spec notify_on(gen_mod:opts() | global | binary()) -> 'all' | 'messages'.
notify_on(Opts) when is_map(Opts) ->
gen_mod:get_opt(notify_on, Opts);
notify_on(Host) ->
gen_mod:get_module_opt(Host, mod_push, notify_on).
-spec use_cache(gen_mod:opts() | global | binary()) -> boolean(). -spec use_cache(gen_mod:opts() | global | binary()) -> boolean().
use_cache(Opts) when is_map(Opts) -> use_cache(Opts) when is_map(Opts) ->
gen_mod:get_opt(use_cache, Opts); gen_mod:get_opt(use_cache, Opts);