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 |
24 |
ejabberd_hooks:add(hooks(HostType)). |
41 |
|
|
42 |
|
-spec delete_hooks(mongooseim:host_type()) -> ok. |
43 |
|
delete_hooks(HostType) -> |
44 |
24 |
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 |
1403 |
Acc = case chat_type(Acc0) of |
56 |
921 |
false -> Acc0; |
57 |
|
Type -> |
58 |
482 |
Event = #chat_event{type = Type, direction = out, |
59 |
|
from = From, to = To, packet = Packet}, |
60 |
482 |
NewAcc = mod_event_pusher:push_event(Acc0, Event), |
61 |
482 |
merge_acc(Acc0, NewAcc) |
62 |
|
end, |
63 |
1403 |
{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 |
100 |
case chat_type(Acc) of |
69 |
:-( |
false -> Acc; |
70 |
|
Type -> |
71 |
100 |
Event = #chat_event{type = Type, direction = in, |
72 |
|
from = From, to = To, packet = Packet}, |
73 |
100 |
NewAcc = mod_event_pusher:push_event(Acc, Event), |
74 |
100 |
merge_acc(Acc, NewAcc) |
75 |
|
end; |
76 |
|
user_send_packet(Acc, _From, _To, _Packet) -> |
77 |
489 |
Acc. |
78 |
|
|
79 |
|
-spec user_present(mongoose_acc:t(), UserJID :: jid:jid()) -> mongoose_acc:t(). |
80 |
|
user_present(Acc, #jid{} = UserJID) -> |
81 |
216 |
Event = #user_status_event{jid = UserJID, status = online}, |
82 |
216 |
NewAcc = mod_event_pusher:push_event(Acc, Event), |
83 |
216 |
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 |
216 |
UserJID = jid:make_noprep(LUser, LServer, LResource), |
89 |
216 |
Event = #user_status_event{jid = UserJID, status = offline}, |
90 |
216 |
NewAcc = mod_event_pusher:push_event(Acc, Event), |
91 |
216 |
merge_acc(Acc, NewAcc). |
92 |
|
|
93 |
|
unacknowledged_message(Acc, Jid) -> |
94 |
10 |
Event = #unack_msg_event{to = Jid}, |
95 |
10 |
NewAcc = mod_event_pusher:push_event(Acc, Event), |
96 |
10 |
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 |
1503 |
case mongoose_acc:stanza_type(Acc) of |
105 |
151 |
<<"chat">> -> chat; |
106 |
191 |
<<"groupchat">> -> groupchat; |
107 |
:-( |
<<"headline">> -> headline; |
108 |
:-( |
<<"normal">> -> normal; |
109 |
240 |
undefined -> normal; |
110 |
921 |
_ -> false |
111 |
|
end. |
112 |
|
|
113 |
|
-spec merge_acc(mongoose_acc:t(), mongoose_acc:t()) -> mongoose_acc:t(). |
114 |
|
merge_acc(Acc, EventPusherAcc) -> |
115 |
1024 |
NS = mongoose_acc:get(event_pusher, EventPusherAcc), |
116 |
1024 |
mongoose_acc:set_permanent(event_pusher, NS, Acc). |
117 |
|
|
118 |
|
-spec hooks(mongooseim:host_type()) -> [ejabberd_hooks:hook()]. |
119 |
|
hooks(HostType) -> |
120 |
48 |
[ |
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 |
|
]. |