perf(gateway): skip member list resync on inert presence deltas (#2180)

This commit is contained in:
Hampus authored and GitHub committed 2026-08-30 23:05:13 +02:00
1 parent 43d6c85f7e
commit 6c9afcc734
2 files changed
+137 -4

No files matched your search

@@ -45,17 +45,55 @@ broadcast_member_list_updates(
_NewPresence
) ->
{ok, UpdatedState};
broadcast_member_list_updates(UserId, OldState, UpdatedState, _OldPresence, _NewPresence) ->
broadcast_member_list_updates(UserId, OldState, UpdatedState, OldPresence, NewPresence) ->
guild_member_list_write_context:with_guild_id(UpdatedState, fun(_GuildId) ->
SubsTab = maps:get(member_list_subscriptions, UpdatedState),
OldMember = find_member_in_state_data(UserId, OldState),
NewMember = find_member_in_state_data(UserId, UpdatedState),
State1 = dispatch_user_change_to_subscribed_lists(
UserId, OldMember, NewMember, SubsTab, UpdatedState
State1 = dispatch_presence_delta(
UserId, OldMember, NewMember, OldPresence, NewPresence, UpdatedState
),
{ok, State1}
end).
-spec dispatch_presence_delta(
user_id(),
map() | undefined,
map() | undefined,
map() | undefined,
map() | undefined,
guild_state()
) -> guild_state().
dispatch_presence_delta(UserId, OldMember, NewMember, OldPresence, NewPresence, State) ->
case presence_delta_is_inert(OldPresence, NewPresence, OldMember, NewMember) of
true ->
State;
false ->
SubsTab = maps:get(member_list_subscriptions, State),
dispatch_user_change_to_subscribed_lists(
UserId, OldMember, NewMember, SubsTab, State
)
end.
-spec presence_delta_is_inert(
map() | undefined,
map() | undefined,
map() | undefined,
map() | undefined
) -> boolean().
presence_delta_is_inert(OldPresence, NewPresence, Member, Member) when
is_map(OldPresence), is_map(NewPresence), is_map(Member)
->
member_list_presence_fields(OldPresence) =:= member_list_presence_fields(NewPresence);
presence_delta_is_inert(_OldPresence, _NewPresence, _OldMember, _NewMember) ->
false.
-spec member_list_presence_fields(map()) -> {binary(), term()}.
member_list_presence_fields(Presence) ->
{
maps:get(<<"status">>, Presence, <<"offline">>),
maps:get(<<"custom_status">>, Presence, null)
}.
-spec find_member_in_state_data(user_id(), guild_state()) -> map() | undefined.
find_member_in_state_data(UserId, State) ->
guild_data_index:get_member(UserId, maps:get(data, State, #{})).