diff --git a/src/mod_caps.erl b/src/mod_caps.erl index 50f7882de65..ccbe5675794 100644 --- a/src/mod_caps.erl +++ b/src/mod_caps.erl @@ -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]). @@ -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()}, @@ -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">>) @@ -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, @@ -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) @@ -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},