diff --git a/fluxer_gateway/src/guild/guild_dispatch.erl b/fluxer_gateway/src/guild/guild_dispatch.erl index aced1d91..3634d1d8 100644 --- a/fluxer_gateway/src/guild/guild_dispatch.erl +++ b/fluxer_gateway/src/guild/guild_dispatch.erl @@ -130,7 +130,19 @@ filter_sessions_for_event(Event, FinalData, SessionIdOpt, Sessions, UpdatedState ) end; false -> - guild_sessions:filter_sessions_exclude_session(Sessions, SessionIdOpt) + FilteredSessions = guild_sessions:filter_sessions_exclude_session( + Sessions, SessionIdOpt + ), + case Event of + guild_member_add -> + [ + {Sid, SessionData} + || {Sid, SessionData} <- FilteredSessions, + maps:get(bot, SessionData, false) =:= true + ]; + _ -> + FilteredSessions + end end end. @@ -1149,9 +1161,17 @@ filter_sessions_for_event_guild_wide_goes_to_all_sessions_test() -> S2 = #{session_id => <<"s2">>, user_id => 11, pid => self()}, Sessions = #{<<"s1">> => S1, <<"s2">> => S2}, State = #{sessions => Sessions, data => #{<<"members">> => #{}}}, - Result = filter_sessions_for_event(guild_member_add, #{}, undefined, Sessions, State), + Result = filter_sessions_for_event(guild_update, #{}, undefined, Sessions, State), ?assertEqual(2, length(Result)). +filter_sessions_for_event_guild_member_add_bots_only_test() -> + S1 = #{session_id => <<"s1">>, user_id => 10, pid => self(), bot => false}, + S2 = #{session_id => <<"s2">>, user_id => 11, pid => self(), bot => true}, + Sessions = #{<<"s1">> => S1, <<"s2">> => S2}, + State = #{sessions => Sessions, data => #{<<"members">> => #{}}}, + Result = filter_sessions_for_event(guild_member_add, #{}, undefined, Sessions, State), + ?assertEqual([{<<"s2">>, S2}], Result). + extract_channel_id_message_create_uses_channel_id_field_test() -> Data = #{<<"channel_id">> => <<"42">>}, ?assertEqual(42, extract_channel_id(message_create, Data)). diff --git a/fluxer_gateway/src/guild/guild_member_list.erl b/fluxer_gateway/src/guild/guild_member_list.erl index 43ec5a1b..97e17116 100644 --- a/fluxer_gateway/src/guild/guild_member_list.erl +++ b/fluxer_gateway/src/guild/guild_member_list.erl @@ -373,12 +373,9 @@ get_sorted_members_for_list(ListId, State) -> Data = maps:get(data, State, #{}), Members = guild_data_index:member_values(Data), FilteredMembers = guild_member_list_common:filter_members_for_list(ListId, Members, State), - lists:sort( - fun(A, B) -> - guild_member_list_common:get_member_sort_key(A) =< guild_member_list_common:get_member_sort_key(B) - end, - FilteredMembers - ). + Decorated = [{guild_member_list_common:get_member_sort_key(M), M} || M <- FilteredMembers], + Sorted = lists:sort(fun({KeyA, _}, {KeyB, _}) -> KeyA =< KeyB end, Decorated), + [M || {_, M} <- Sorted]. -spec build_full_items(list_id(), guild_state(), [map()]) -> [list_item()]. build_full_items(ListId, State, SortedMembers) -> diff --git a/fluxer_gateway/src/push/push.erl b/fluxer_gateway/src/push/push.erl index 200babd1..c381ad98 100644 --- a/fluxer_gateway/src/push/push.erl +++ b/fluxer_gateway/src/push/push.erl @@ -228,6 +228,11 @@ get_cache_stats() -> -spec do_handle_message_create(map(), state()) -> state(). do_handle_message_create(Params, State) -> + spawn(fun() -> run_eligibility_and_dispatch(Params, State) end), + State. + +-spec run_eligibility_and_dispatch(map(), state()) -> ok. +run_eligibility_and_dispatch(Params, State) -> MessageData = maps:get(message_data, Params), UserIds = maps:get(user_ids, Params), GuildId = maps:get(guild_id, Params), @@ -274,7 +279,7 @@ do_handle_message_create(Params, State) -> ), case EligibleUsers of [] -> - State; + ok; _ -> push_dispatcher:enqueue_send_notifications( EligibleUsers, @@ -286,5 +291,5 @@ do_handle_message_create(Params, State) -> ChannelName, State ), - State + ok end.