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:
parent
7522c29f25
commit
2782430887
@ -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,16 +522,21 @@ 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
|
||||||
Item = #ps_item{sub_els = [#push_notification{xdata = Summary}]},
|
{undefined, messages} ->
|
||||||
PubSub = #pubsub{publish = #ps_publish{node = Node, items = [Item]},
|
?DEBUG("Suppressing notification for stanza without payload", []),
|
||||||
publish_options = XData},
|
ok;
|
||||||
IQ = #iq{type = set,
|
{Summary, _NotifyOn} ->
|
||||||
from = From,
|
Item = #ps_item{sub_els = [#push_notification{xdata = Summary}]},
|
||||||
to = jid:make(PushLJID),
|
PubSub = #pubsub{publish = #ps_publish{node = Node, items = [Item]},
|
||||||
id = p1_rand:get_string(),
|
publish_options = XData},
|
||||||
sub_els = [PubSub]},
|
IQ = #iq{type = set,
|
||||||
ejabberd_router:route_iq(IQ, HandleResponse).
|
from = From,
|
||||||
|
to = jid:make(PushLJID),
|
||||||
|
id = p1_rand:get_string(),
|
||||||
|
sub_els = [PubSub]},
|
||||||
|
ejabberd_router:route_iq(IQ, HandleResponse)
|
||||||
|
end.
|
||||||
|
|
||||||
%%--------------------------------------------------------------------
|
%%--------------------------------------------------------------------
|
||||||
%% Miscellaneous.
|
%% Miscellaneous.
|
||||||
|
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user