Skip to content

Commit

Permalink
Unify user receive packet and presence for mod_caps
Browse files Browse the repository at this point in the history
  • Loading branch information
NelsonVides committed Nov 15, 2022
1 parent 5905aca commit 936c5c8
Showing 1 changed file with 27 additions and 44 deletions.
71 changes: 27 additions & 44 deletions src/mod_caps.erl
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,6 @@
handle_cast/2, terminate/2, code_change/3]).

-export([user_send_presence/3,
user_receive_packet/3,
user_receive_presence/3,
c2s_broadcast_recipients/3]).

Expand Down Expand Up @@ -187,41 +186,6 @@ user_send_presence(Acc,
Type = xml:get_attr_s(<<"type">>, Attrs),
handle_presence(Acc, LServer, From, Type, Elements).

-spec user_receive_packet(Acc, Params, Extra) -> {ok, Acc} when
Acc :: mongoose_acc:t(),
Params :: #{jid := jid:jid()},
Extra :: map().
user_receive_packet(Acc, #{jid := #jid{lserver = LServer}}, _) ->
{From, _, Packet} = mongoose_acc:packet(Acc),
{ok, user_receive_packet(Acc, LServer, From, Packet)}.

-spec user_receive_packet(mongoose_acc:t(), jid:lserver(), jid:jid(), exml:element()) ->
mongoose_acc:t().
user_receive_packet(Acc, LServer, From,
#xmlel{name = <<"presence">>, attrs = Attrs, children = Elements}) ->
Type = xml:get_attr_s(<<"type">>, Attrs),
case mongoose_domain_api:get_host_type(From#jid.lserver) of
{error, not_found} ->
handle_presence(Acc, LServer, From, Type, Elements);
{ok, _} ->
Acc %% it was already handled in 'user_send_presence'
end;
user_receive_packet(Acc, _, _, _) ->
Acc.

-spec handle_presence(mongoose_acc:t(), jid:lserver(), jid:jid(), binary(), [exml:element()]) ->
mongoose_acc:t().
handle_presence(Acc, LServer, From, Type, Elements) when Type =:= <<>>;
Type =:= <<"available">> ->
case read_caps(Elements) of
nothing ->
Acc;
#caps{version = Version, exts = Exts} = Caps ->
feature_request(Acc, LServer, From, Caps, [Version | Exts])
end;
handle_presence(Acc, _LServer, _From, _Type, _Elements) ->
Acc.

-spec caps_stream_features(Acc, Params, Extra) -> {ok, Acc} when
Acc :: [exml:element()],
Params :: #{lserver := jid:lserver()},
Expand Down Expand Up @@ -271,15 +235,35 @@ disco_info(Acc = #{node := Node}, _, _) ->
end,
{ok, NewAcc}.

-spec handle_presence(mongoose_acc:t(), jid:lserver(), jid:jid(), binary(), [exml:element()]) ->
mongoose_acc:t().
handle_presence(Acc, LServer, From, Type, Elements) when Type =:= <<>>;
Type =:= <<"available">> ->
case read_caps(Elements) of
nothing ->
Acc;
#caps{version = Version, exts = Exts} = Caps ->
feature_request(Acc, LServer, From, Caps, [Version | Exts])
end;
handle_presence(Acc, _LServer, _From, _Type, _Elements) ->
Acc.

-spec user_receive_presence(mongoose_acc:t(), mongoose_c2s_hooks:params(), gen_hook:extra()) ->
mongoose_c2s_hooks:result().
user_receive_presence(Acc, #{c2s_data := StateData}, _Extra) ->
{From, To, #xmlel{attrs = Attrs, children = Els} = Packet} = mongoose_acc:packet(Acc),
user_receive_presence(Acc0, #{c2s_data := C2SData}, _Extra) ->
{From, To, #xmlel{attrs = Attrs, children = Els} = Packet} = mongoose_acc:packet(Acc0),
?LOG_DEBUG(#{what => user_receive_presence,
to => jid:to_binary(To), from => jid:to_binary(From),
exml_packet => Packet, c2s_state => StateData}),
exml_packet => Packet, c2s_state => C2SData}),
Type = xml:get_attr_s(<<"type">>, Attrs),
case mongoose_c2s:get_mod_state(StateData, mod_presence) of
#jid{lserver = LServer} = mongoose_c2s:get_jid(C2SData),
Acc = case mongoose_domain_api:get_host_type(From#jid.lserver) of
{error, not_found} ->
handle_presence(Acc0, LServer, From, Type, Els);
{ok, _} ->
Acc0 %% it was already handled in 'user_send_presence'
end,
case mongoose_c2s:get_mod_state(C2SData, mod_presence) of
{ok, Presences} ->
Subscription = get_subscription(From, Presences),
Insert = (Type == <<>> orelse Type == <<"available">>)
Expand All @@ -288,7 +272,7 @@ user_receive_presence(Acc, #{c2s_data := StateData}, _Extra) ->
case Insert orelse Delete of
true ->
LFrom = jid:to_lower(From),
Rs = case mongoose_c2s:get_mod_state(StateData, ?MODULE) of
Rs = case mongoose_c2s:get_mod_state(C2SData, ?MODULE) of
{ok, Rs1} -> Rs1;
{error, not_found} -> gb_trees:empty()
end,
Expand All @@ -302,7 +286,7 @@ user_receive_presence(Acc, #{c2s_data := StateData}, _Extra) ->
to => jid:to_binary(To),
from => jid:to_binary(From),
exml_packet => Packet,
c2s_state => StateData}),
c2s_state => C2SData}),
upsert_caps(LFrom, Caps, Rs);
_ ->
gb_trees:delete_any(LFrom, Rs)
Expand Down Expand Up @@ -404,10 +388,9 @@ terminate(_Reason, #state{host_type = HostType}) ->

hooks(HostType) ->
[{disco_local_features, HostType, fun ?MODULE:disco_local_features/3, #{}, 1},
{user_receive_presence, HostType, fun ?MODULE:user_receive_presence/3, #{}, 1},
{c2s_broadcast_recipients, HostType, fun ?MODULE:c2s_broadcast_recipients/3, #{}, 75},
{user_send_presence, HostType, fun ?MODULE:user_send_presence/3, #{}, 75},
{user_receive_packet, HostType, fun ?MODULE:user_receive_packet/3, #{}, 75},
{user_receive_presence, HostType, fun ?MODULE:user_receive_presence/3, #{}, 1},
{c2s_stream_features, HostType, fun ?MODULE:caps_stream_features/3, #{}, 75},
{s2s_stream_features, HostType, fun ?MODULE:caps_stream_features/3, #{}, 75},
{disco_local_identity, HostType, fun ?MODULE:disco_local_identity/3, #{}, 1},
Expand Down

0 comments on commit 936c5c8

Please sign in to comment.