./ct_report/coverage/mod_event_pusher_hook_translator.COVER.html

1 %%==============================================================================
2 %% Copyright 2016 Erlang Solutions Ltd.
3 %%
4 %% Licensed under the Apache License, Version 2.0 (the "License");
5 %% you may not use this file except in compliance with the License.
6 %% You may obtain a copy of the License at
7 %%
8 %% http://www.apache.org/licenses/LICENSE-2.0
9 %%
10 %% Unless required by applicable law or agreed to in writing, software
11 %% distributed under the License is distributed on an "AS IS" BASIS,
12 %% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 %% See the License for the specific language governing permissions and
14 %% limitations under the License.
15 %%==============================================================================
16
17 -module(mod_event_pusher_hook_translator).
18 -author('konrad.zemek@erlang-solutions.com').
19
20 -include("jlib.hrl").
21 -include("mod_event_pusher_events.hrl").
22
23 -export([add_hooks/1, delete_hooks/1]).
24
25 -export([user_send_packet/4,
26 filter_local_packet/1,
27 user_present/2,
28 user_not_present/5,
29 unacknowledged_message/2]).
30
31 -ignore_xref([filter_local_packet/1, unacknowledged_message/2, user_not_present/5,
32 user_present/2, user_send_packet/4]).
33
34 %%--------------------------------------------------------------------
35 %% gen_mod API
36 %%--------------------------------------------------------------------
37
38 -spec add_hooks(mongooseim:host_type()) -> ok.
39 add_hooks(HostType) ->
40
:-(
ejabberd_hooks:add(hooks(HostType)).
41
42 -spec delete_hooks(mongooseim:host_type()) -> ok.
43 delete_hooks(HostType) ->
44
:-(
ejabberd_hooks:delete(hooks(HostType)).
45
46 %%--------------------------------------------------------------------
47 %% Hook callbacks
48 %%--------------------------------------------------------------------
49 -type routing_data() :: {jid:jid(), jid:jid(), mongoose_acc:t(), exml:element()}.
50 -spec filter_local_packet(drop) -> drop;
51 (routing_data()) -> routing_data().
52 filter_local_packet(drop) ->
53
:-(
drop;
54 filter_local_packet({From, To, Acc0, Packet}) ->
55
:-(
Acc = case chat_type(Acc0) of
56
:-(
false -> Acc0;
57 Type ->
58
:-(
Event = #chat_event{type = Type, direction = out,
59 from = From, to = To, packet = Packet},
60
:-(
NewAcc = mod_event_pusher:push_event(Acc0, Event),
61
:-(
merge_acc(Acc0, NewAcc)
62 end,
63
:-(
{From, To, Acc, Packet}.
64
65 -spec user_send_packet(mongoose_acc:t(), From :: jid:jid(), To :: jid:jid(),
66 Packet :: exml:element()) -> mongoose_acc:t().
67 user_send_packet(Acc, From, To, Packet = #xmlel{name = <<"message">>}) ->
68
:-(
case chat_type(Acc) of
69
:-(
false -> Acc;
70 Type ->
71
:-(
Event = #chat_event{type = Type, direction = in,
72 from = From, to = To, packet = Packet},
73
:-(
NewAcc = mod_event_pusher:push_event(Acc, Event),
74
:-(
merge_acc(Acc, NewAcc)
75 end;
76 user_send_packet(Acc, _From, _To, _Packet) ->
77
:-(
Acc.
78
79 -spec user_present(mongoose_acc:t(), UserJID :: jid:jid()) -> mongoose_acc:t().
80 user_present(Acc, #jid{} = UserJID) ->
81
:-(
Event = #user_status_event{jid = UserJID, status = online},
82
:-(
NewAcc = mod_event_pusher:push_event(Acc, Event),
83
:-(
merge_acc(Acc, NewAcc).
84
85 -spec user_not_present(mongoose_acc:t(), User :: jid:luser(), Server :: jid:lserver(),
86 Resource :: jid:lresource(), Status :: any()) -> mongoose_acc:t().
87 user_not_present(Acc, LUser, LServer, LResource, _Status) ->
88
:-(
UserJID = jid:make_noprep(LUser, LServer, LResource),
89
:-(
Event = #user_status_event{jid = UserJID, status = offline},
90
:-(
NewAcc = mod_event_pusher:push_event(Acc, Event),
91
:-(
merge_acc(Acc, NewAcc).
92
93 unacknowledged_message(Acc, Jid) ->
94
:-(
Event = #unack_msg_event{to = Jid},
95
:-(
NewAcc = mod_event_pusher:push_event(Acc, Event),
96
:-(
merge_acc(Acc, NewAcc).
97
98 %%--------------------------------------------------------------------
99 %% Helpers
100 %%--------------------------------------------------------------------
101
102 -spec chat_type(mongoose_acc:t()) -> chat | groupchat | headline | normal | false.
103 chat_type(Acc) ->
104
:-(
case mongoose_acc:stanza_type(Acc) of
105
:-(
<<"chat">> -> chat;
106
:-(
<<"groupchat">> -> groupchat;
107
:-(
<<"headline">> -> headline;
108
:-(
<<"normal">> -> normal;
109
:-(
undefined -> normal;
110
:-(
_ -> false
111 end.
112
113 -spec merge_acc(mongoose_acc:t(), mongoose_acc:t()) -> mongoose_acc:t().
114 merge_acc(Acc, EventPusherAcc) ->
115
:-(
NS = mongoose_acc:get(event_pusher, EventPusherAcc),
116
:-(
mongoose_acc:set_permanent(event_pusher, NS, Acc).
117
118 -spec hooks(mongooseim:host_type()) -> [ejabberd_hooks:hook()].
119 hooks(HostType) ->
120
:-(
[
121 {filter_local_packet, HostType, ?MODULE, filter_local_packet, 80},
122 {unset_presence_hook, HostType, ?MODULE, user_not_present, 90},
123 {user_available_hook, HostType, ?MODULE, user_present, 90},
124 {user_send_packet, HostType, ?MODULE, user_send_packet, 90},
125 {rest_user_send_packet, HostType, ?MODULE, user_send_packet, 90},
126 {unacknowledged_message, HostType, ?MODULE, unacknowledged_message, 90}
127 ].
Line Hits Source