From 46df025200e2665c48b439dfd59274502fd286f3 Mon Sep 17 00:00:00 2001 From: Dmitry Popov Date: Tue, 18 Nov 2025 12:46:42 +0100 Subject: [PATCH] fix(core): fixed character tracking issues --- lib/wanderer_app/map.ex | 23 +++++++++++++------ .../map/server/map_server_characters_impl.ex | 6 ++--- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/lib/wanderer_app/map.ex b/lib/wanderer_app/map.ex index b929bd85..8ed9da3a 100644 --- a/lib/wanderer_app/map.ex +++ b/lib/wanderer_app/map.ex @@ -134,12 +134,21 @@ defmodule WandererApp.Map do def get_options(map_id), do: {:ok, map_id |> get_map!() |> Map.get(:options, Map.new())} - def get_character_ids(map_id), - do: - {:ok, - map_id - |> get_map!() - |> Map.get(:characters, [])} + def get_tracked_character_ids(map_id) do + {:ok, + map_id + |> get_map!() + |> Map.get(:characters, []) + |> Enum.filter(fn character_id -> + {:ok, tracking_start_time} = + WandererApp.Cache.lookup( + "character:#{character_id}:map:#{map_id}:tracking_start_time", + nil + ) + + not is_nil(tracking_start_time) + end)} + end @doc """ Returns a full list of characters in the map @@ -233,7 +242,7 @@ defmodule WandererApp.Map do :ok _ -> - {:error, :already_exists} + :ok end end diff --git a/lib/wanderer_app/map/server/map_server_characters_impl.ex b/lib/wanderer_app/map/server/map_server_characters_impl.ex index ce597d96..6a0cd4cc 100644 --- a/lib/wanderer_app/map/server/map_server_characters_impl.ex +++ b/lib/wanderer_app/map/server/map_server_characters_impl.ex @@ -214,9 +214,9 @@ defmodule WandererApp.Map.Server.CharactersImpl do start_time = System.monotonic_time(:microsecond) try do - {:ok, active_character_ids} = WandererApp.Map.get_character_ids(map_id) + {:ok, tracked_character_ids} = WandererApp.Map.get_tracked_character_ids(map_id) - character_count = length(active_character_ids) + character_count = length(tracked_character_ids) # Emit telemetry for tracking update cycle start :telemetry.execute( @@ -229,7 +229,7 @@ defmodule WandererApp.Map.Server.CharactersImpl do max_concurrency = calculate_max_concurrency(character_count) updated_characters = - active_character_ids + tracked_character_ids |> Task.async_stream( fn character_id -> # Use batch cache operations for all character tracking data