From 1dad9316bde6055f879cfcd2e95019ad41a11a00 Mon Sep 17 00:00:00 2001 From: Dmitry Popov Date: Mon, 20 Oct 2025 11:32:32 +0200 Subject: [PATCH] fix(Core): Fixed 'viewer' map access & characters tracking --- lib/wanderer_app/character/tracking_utils.ex | 16 ++++++++------- .../map_characters_event_handler.ex | 20 +++++++++++-------- .../event_handlers/map_core_event_handler.ex | 14 +++++++++++-- .../presence_grace_period_manager.ex | 6 +----- 4 files changed, 34 insertions(+), 22 deletions(-) diff --git a/lib/wanderer_app/character/tracking_utils.ex b/lib/wanderer_app/character/tracking_utils.ex index 50879a5d..7c3f512a 100644 --- a/lib/wanderer_app/character/tracking_utils.ex +++ b/lib/wanderer_app/character/tracking_utils.ex @@ -173,12 +173,11 @@ defmodule WandererApp.Character.TrackingUtils do %{ id: character_id, eve_id: eve_id - }, + } = _character, map_id, is_track_allowed, caller_pid - ) - when not is_nil(caller_pid) do + ) do WandererAppWeb.Presence.update(caller_pid, map_id, character_id, %{ tracked: is_track_allowed, from: DateTime.utc_now() @@ -217,13 +216,16 @@ defmodule WandererApp.Character.TrackingUtils do end defp track_character( - _character, + character, _map_id, _is_track_allowed, _caller_pid ) do - Logger.error("caller_pid is required for tracking characters") - {:error, "caller_pid is required"} + Logger.error( + "Invalid character data for tracking - character must have :id and :eve_id fields, got: #{inspect(character)}" + ) + + {:error, "Invalid character data"} end def untrack(characters, map_id, caller_pid) do @@ -243,7 +245,7 @@ defmodule WandererApp.Character.TrackingUtils do :ok else true -> - Logger.error("caller_pid is required for untracking characters") + Logger.error("caller_pid is required for untracking characters 2") {:error, "caller_pid is required"} end end diff --git a/lib/wanderer_app_web/live/map/event_handlers/map_characters_event_handler.ex b/lib/wanderer_app_web/live/map/event_handlers/map_characters_event_handler.ex index 822b0551..fab02f4d 100644 --- a/lib/wanderer_app_web/live/map/event_handlers/map_characters_event_handler.ex +++ b/lib/wanderer_app_web/live/map/event_handlers/map_characters_event_handler.ex @@ -365,15 +365,19 @@ defmodule WandererAppWeb.MapCharactersEventHandler do end defp handle_tracking_event({:track_characters, map_characters, track_character}, socket, map_id) do - :ok = - WandererApp.Character.TrackingUtils.track( - map_characters, - map_id, - track_character, - self() - ) + case WandererApp.Character.TrackingUtils.track( + map_characters, + map_id, + track_character, + self() + ) do + :ok -> + socket - socket + {:error, reason} -> + Logger.error("Failed to track characters: #{inspect(reason)}") + socket + end end defp handle_tracking_event(:invalid_token_message, socket, _map_id) do diff --git a/lib/wanderer_app_web/live/map/event_handlers/map_core_event_handler.ex b/lib/wanderer_app_web/live/map/event_handlers/map_core_event_handler.ex index 0bb82211..ea134552 100644 --- a/lib/wanderer_app_web/live/map/event_handlers/map_core_event_handler.ex +++ b/lib/wanderer_app_web/live/map/event_handlers/map_core_event_handler.ex @@ -557,7 +557,12 @@ defmodule WandererAppWeb.MapCoreEventHandler do # in case user has not tracked any character track his main character as viewer track_character && not has_tracked_characters? -> main_character = Enum.find(current_user.characters, &(&1.id == main_character_id)) - events ++ [{:track_characters, [main_character], false}] + + if main_character do + events ++ [{:track_characters, [main_character], false}] + else + events + end track_character && not character_limit_reached? -> events ++ [{:track_characters, tracked_characters, track_character}] @@ -568,7 +573,12 @@ defmodule WandererAppWeb.MapCoreEventHandler do # in case user has view only permissions track his main character as viewer not track_character -> main_character = Enum.find(current_user.characters, &(&1.id == main_character_id)) - events ++ [{:track_characters, [main_character], track_character}] + + if main_character do + events ++ [{:track_characters, [main_character], track_character}] + else + events + end true -> events diff --git a/lib/wanderer_app_web/presence_grace_period_manager.ex b/lib/wanderer_app_web/presence_grace_period_manager.ex index f34fa798..03164d80 100644 --- a/lib/wanderer_app_web/presence_grace_period_manager.ex +++ b/lib/wanderer_app_web/presence_grace_period_manager.ex @@ -73,11 +73,7 @@ defmodule WandererAppWeb.PresenceGracePeriodManager do # Update cache with final character IDs (includes grace period logic) WandererApp.Cache.insert("map_#{map_id}:presence_character_ids", final_character_ids) - # Only update presence_data if the character IDs actually changed - if final_character_ids != previous_tracked_character_ids do - WandererApp.Cache.insert("map_#{map_id}:presence_data", presence_data) - end - + WandererApp.Cache.insert("map_#{map_id}:presence_data", presence_data) WandererApp.Cache.insert("map_#{map_id}:presence_updated", true) {:noreply, state}