summaryrefslogtreecommitdiff
path: root/src/mod_caps.erl
diff options
context:
space:
mode:
authorPaweł Chmielowski <pchmielowski@process-one.net>2021-02-16 10:13:29 +0100
committerPaweł Chmielowski <pchmielowski@process-one.net>2021-02-16 10:13:29 +0100
commit96929a508436dca0319ce5500bc1154afd1fd883 (patch)
tree8daa70b811d51422d03ecaed85527e14b8b0f668 /src/mod_caps.erl
parentfix eldap certificate verification (#3528) (diff)
Don't request roster in mod_caps when not needed
Diffstat (limited to 'src/mod_caps.erl')
-rw-r--r--src/mod_caps.erl19
1 files changed, 12 insertions, 7 deletions
diff --git a/src/mod_caps.erl b/src/mod_caps.erl
index 7c69c934..122081b4 100644
--- a/src/mod_caps.erl
+++ b/src/mod_caps.erl
@@ -226,15 +226,20 @@ disco_info(Acc, _, _, _Node, _Lang) ->
-spec c2s_presence_in(ejabberd_c2s:state(), presence()) -> ejabberd_c2s:state().
c2s_presence_in(C2SState,
#presence{from = From, to = To, type = Type} = Presence) ->
- {Subscription, _, _} = ejabberd_hooks:run_fold(
- roster_get_jid_info, To#jid.lserver,
- {none, none, []},
- [To#jid.luser, To#jid.lserver, From]),
ToSelf = (From#jid.luser == To#jid.luser)
and (From#jid.lserver == To#jid.lserver),
- Insert = (Type == available)
- and ((Subscription == both) or (Subscription == from) or ToSelf),
- Delete = (Type == unavailable) or (Type == error),
+ {Insert, Delete} =
+ case {Type, ToSelf} of
+ {unavailable, _} -> {false, true};
+ {error, _} -> {false, true};
+ {available, true} -> {true, false};
+ {available, _} ->
+ {Subscription, _, _} = ejabberd_hooks:run_fold(
+ roster_get_jid_info, To#jid.lserver,
+ {none, none, []},
+ [To#jid.luser, To#jid.lserver, From]),
+ {Subscription == both orelse Subscription == from, false}
+ end,
if Insert or Delete ->
LFrom = jid:tolower(From),
Rs = maps:get(caps_resources, C2SState, gb_trees:empty()),