diff --git a/fluxer_gateway/src/guild/guild_state_threads.erl b/fluxer_gateway/src/guild/guild_state_threads.erl index 21cde3b78..733c847f7 100644 --- a/fluxer_gateway/src/guild/guild_state_threads.erl +++ b/fluxer_gateway/src/guild/guild_state_threads.erl @@ -293,12 +293,16 @@ after_store_event(channel_delete, Data, Tab, State) -> end, State; after_store_event(guild_member_remove, Data, Tab, State) -> - _ = - case guild_state_member:extract_user_id(Data) of - UserId when is_integer(UserId) -> guild_thread_store:remove_user(Tab, UserId); - _ -> [] - end, - State; + case guild_state_member:extract_user_id(Data) of + UserId when is_integer(UserId) -> + lists:foldl( + fun guild_thread_subscriptions:member_lists_changed/2, + State, + guild_thread_store:remove_user(Tab, UserId) + ); + _ -> + State + end; after_store_event(guild_member_update, Data, _Tab, State) -> case guild_state_member:extract_user_id(Data) of UserId when is_integer(UserId) -> diff --git a/fluxer_gateway/src/guild/guild_thread_subscriptions.erl b/fluxer_gateway/src/guild/guild_thread_subscriptions.erl index 47894e82f..a5c4d2000 100644 --- a/fluxer_gateway/src/guild/guild_thread_subscriptions.erl +++ b/fluxer_gateway/src/guild/guild_thread_subscriptions.erl @@ -75,7 +75,6 @@ apply_threads_flag(_Other, Session) -> -spec apply_member_lists(term(), map(), guild_state()) -> {map(), [integer()]}. apply_member_lists(Ids, Session, State) when is_list(Ids) -> - Previous = maps:get(thread_member_lists, Session, []), Viewable = lists:sublist( [Id || Id <- lists:usort(Ids), viewable_thread(Session, Id, State)], ?MAX_MEMBER_LISTS ), @@ -84,7 +83,7 @@ apply_member_lists(Ids, Session, State) when is_list(Ids) -> [] -> maps:remove(thread_member_lists, Session); _ -> Session#{thread_member_lists => Viewable} end, - {Updated, Viewable -- Previous}; + {Updated, Viewable}; apply_member_lists(_Other, Session, _State) -> {Session, []}. diff --git a/fluxer_gateway/test/guild_threads_tests.erl b/fluxer_gateway/test/guild_threads_tests.erl index ac7d1ddbf..3bfc15b2e 100644 --- a/fluxer_gateway/test/guild_threads_tests.erl +++ b/fluxer_gateway/test/guild_threads_tests.erl @@ -1515,6 +1515,45 @@ thread_member_list_follows_member_updates_test() -> ?assertNot(maps:is_key(thread_list_dirty, Unlisted)) end). +thread_member_list_resubscribe_resends_snapshot_test() -> + with_guild(fun(State) -> + Subscribed = guild_thread_subscriptions:update( + <<"a">>, #{member_lists => [?T1]}, State + ), + [_] = received(a, thread_member_list_update, drain()), + Again = guild_thread_subscriptions:update( + <<"a">>, #{member_lists => [?T1]}, Subscribed + ), + [_] = received(a, thread_member_list_update, drain()), + _ = guild_thread_subscriptions:update(<<"a">>, #{threads => true}, Again), + ?assertEqual([], received(a, thread_member_list_update, drain())) + end). + +thread_member_list_drops_removed_guild_members_test() -> + with_guild(fun(State0) -> + Added = #{ + <<"id">> => integer_to_binary(?T1), + <<"member_count">> => 2, + <<"added_members">> => [thread_member(?T1, ?V)] + }, + State1 = dispatch(thread_members_update, Added, State0), + Subscribed = guild_thread_subscriptions:update( + <<"a">>, #{member_lists => [?T1]}, State1 + ), + _ = drain(), + Removed = dispatch( + guild_member_remove, + #{<<"user">> => #{<<"id">> => integer_to_binary(?V)}}, + Subscribed + ), + ?assertEqual(#{?T1 => true}, maps:get(thread_list_dirty, Removed)), + _ = guild_thread_subscriptions:handle_list_flush(Removed), + [#{<<"members">> := Members}] = received(a, thread_member_list_update, drain()), + ?assertEqual( + [integer_to_binary(?A)], [maps:get(<<"user_id">>, M) || M <- Members] + ) + end). + handoff_through_an_old_node_round_trips_test() -> with_guild(fun(State) -> Exported = guild_handoff:export_handoff_state(State),