mirror of
https://github.com/fluxerapp/fluxer
synced 2026-10-17 13:05:32 +09:00
fix(gateway): resend thread member lists on resume and leave (#3372)
This commit is contained in:
1 parent
70fd9e6331
commit
7197371123
3 files changed
+50
-8
No files matched your search
@@ -293,12 +293,16 @@ after_store_event(channel_delete, Data, Tab, State) ->
|
|||||||
end,
|
end,
|
||||||
State;
|
State;
|
||||||
after_store_event(guild_member_remove, Data, Tab, State) ->
|
after_store_event(guild_member_remove, Data, Tab, State) ->
|
||||||
_ =
|
case guild_state_member:extract_user_id(Data) of
|
||||||
case guild_state_member:extract_user_id(Data) of
|
UserId when is_integer(UserId) ->
|
||||||
UserId when is_integer(UserId) -> guild_thread_store:remove_user(Tab, UserId);
|
lists:foldl(
|
||||||
_ -> []
|
fun guild_thread_subscriptions:member_lists_changed/2,
|
||||||
end,
|
State,
|
||||||
State;
|
guild_thread_store:remove_user(Tab, UserId)
|
||||||
|
);
|
||||||
|
_ ->
|
||||||
|
State
|
||||||
|
end;
|
||||||
after_store_event(guild_member_update, Data, _Tab, State) ->
|
after_store_event(guild_member_update, Data, _Tab, State) ->
|
||||||
case guild_state_member:extract_user_id(Data) of
|
case guild_state_member:extract_user_id(Data) of
|
||||||
UserId when is_integer(UserId) ->
|
UserId when is_integer(UserId) ->
|
||||||
|
|||||||
@@ -75,7 +75,6 @@ apply_threads_flag(_Other, Session) ->
|
|||||||
|
|
||||||
-spec apply_member_lists(term(), map(), guild_state()) -> {map(), [integer()]}.
|
-spec apply_member_lists(term(), map(), guild_state()) -> {map(), [integer()]}.
|
||||||
apply_member_lists(Ids, Session, State) when is_list(Ids) ->
|
apply_member_lists(Ids, Session, State) when is_list(Ids) ->
|
||||||
Previous = maps:get(thread_member_lists, Session, []),
|
|
||||||
Viewable = lists:sublist(
|
Viewable = lists:sublist(
|
||||||
[Id || Id <- lists:usort(Ids), viewable_thread(Session, Id, State)], ?MAX_MEMBER_LISTS
|
[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);
|
[] -> maps:remove(thread_member_lists, Session);
|
||||||
_ -> Session#{thread_member_lists => Viewable}
|
_ -> Session#{thread_member_lists => Viewable}
|
||||||
end,
|
end,
|
||||||
{Updated, Viewable -- Previous};
|
{Updated, Viewable};
|
||||||
apply_member_lists(_Other, Session, _State) ->
|
apply_member_lists(_Other, Session, _State) ->
|
||||||
{Session, []}.
|
{Session, []}.
|
||||||
|
|
||||||
|
|||||||
@@ -1515,6 +1515,45 @@ thread_member_list_follows_member_updates_test() ->
|
|||||||
?assertNot(maps:is_key(thread_list_dirty, Unlisted))
|
?assertNot(maps:is_key(thread_list_dirty, Unlisted))
|
||||||
end).
|
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() ->
|
handoff_through_an_old_node_round_trips_test() ->
|
||||||
with_guild(fun(State) ->
|
with_guild(fun(State) ->
|
||||||
Exported = guild_handoff:export_handoff_state(State),
|
Exported = guild_handoff:export_handoff_state(State),
|
||||||
|
|||||||
Reference in new issue
Block a user