diff --git a/lib/wanderer_app/map/map_zkb_data_fetcher.ex b/lib/wanderer_app/map/map_zkb_data_fetcher.ex index e8872107..39bb0e1d 100644 --- a/lib/wanderer_app/map/map_zkb_data_fetcher.ex +++ b/lib/wanderer_app/map/map_zkb_data_fetcher.ex @@ -118,7 +118,10 @@ defmodule WandererApp.Map.ZkbDataFetcher do |> Enum.map(&elem(&1, 0)) if changed_systems == [] do - Logger.debug(fn -> "[ZkbDataFetcher] No changes in detailed kills for map_id=#{map_id}" end) + Logger.debug(fn -> + "[ZkbDataFetcher] No changes in detailed kills for map_id=#{map_id}" + end) + :ok else # Build new details for each changed system @@ -153,10 +156,7 @@ defmodule WandererApp.Map.ZkbDataFetcher do changed_data = Map.take(updated_details_map, changed_systems) - @pubsub_client.broadcast!(WandererApp.PubSub, map_id, %{ - event: :detailed_kills_updated, - payload: changed_data - }) + WandererApp.Map.Server.Impl.broadcast!(map_id, :detailed_kills_updated, changed_data) :ok end @@ -173,6 +173,7 @@ defmodule WandererApp.Map.ZkbDataFetcher do Enum.filter(all_system_ids, fn system_id -> new_kills_count = Map.get(new_kills_map, system_id, 0) old_kills_count = Map.get(old_kills_map, system_id, 0) + new_kills_count != old_kills_count and (new_kills_count > 0 or (old_kills_count > 0 and new_kills_count == 0)) end) @@ -187,10 +188,7 @@ defmodule WandererApp.Map.ZkbDataFetcher do payload = Map.take(new_kills_map, changed_system_ids) - @pubsub_client.broadcast!(WandererApp.PubSub, map_id, %{ - event: :kills_updated, - payload: payload - }) + WandererApp.Map.Server.Impl.broadcast!(map_id, :kills_updated, payload) :ok end diff --git a/lib/wanderer_app/map/server/map_server_impl.ex b/lib/wanderer_app/map/server/map_server_impl.ex index e0b6bb65..265d1957 100644 --- a/lib/wanderer_app/map/server/map_server_impl.ex +++ b/lib/wanderer_app/map/server/map_server_impl.ex @@ -324,7 +324,11 @@ defmodule WandererApp.Map.Server.Impl do def broadcast!(map_id, event, payload \\ nil) do if can_broadcast?(map_id) do - @pubsub_client.broadcast!(WandererApp.PubSub, map_id, %{event: event, payload: payload}) + @pubsub_client.broadcast!(WandererApp.PubSub, map_id, %{ + event: event, + payload: payload, + timestamp: DateTime.utc_now() + }) end :ok diff --git a/lib/wanderer_app_web/live/map/event_handlers/map_signatures_event_handler.ex b/lib/wanderer_app_web/live/map/event_handlers/map_signatures_event_handler.ex index 44edfc63..656f464b 100644 --- a/lib/wanderer_app_web/live/map/event_handlers/map_signatures_event_handler.ex +++ b/lib/wanderer_app_web/live/map/event_handlers/map_signatures_event_handler.ex @@ -211,10 +211,7 @@ defmodule WandererAppWeb.MapSignaturesEventHandler do }) end - Phoenix.PubSub.broadcast!(WandererApp.PubSub, map_id, %{ - event: :signatures_updated, - payload: solar_system_source - }) + WandererApp.Map.Server.Impl.broadcast!(map_id, :signatures_updated, solar_system_source) {:noreply, socket} @@ -261,10 +258,7 @@ defmodule WandererAppWeb.MapSignaturesEventHandler do }) end) - Phoenix.PubSub.broadcast!(WandererApp.PubSub, map_id, %{ - event: :signatures_updated, - payload: solar_system_source - }) + WandererApp.Map.Server.Impl.broadcast!(map_id, :signatures_updated, solar_system_source) {:noreply, socket} diff --git a/lib/wanderer_app_web/live/map/map_live.ex b/lib/wanderer_app_web/live/map/map_live.ex index 99d6bd96..3d429283 100644 --- a/lib/wanderer_app_web/live/map/map_live.ex +++ b/lib/wanderer_app_web/live/map/map_live.ex @@ -4,6 +4,8 @@ defmodule WandererAppWeb.MapLive do require Logger + @server_event_unsync_timeout :timer.minutes(5) + @impl true def mount(%{"slug" => map_slug} = _params, _session, socket) when is_connected?(socket) do Process.send_after(self(), %{event: :load_map}, Enum.random(10..800)) @@ -93,6 +95,19 @@ defmodule WandererAppWeb.MapLive do ) |> push_navigate(to: ~p"/tracking/#{map_slug}")} + @impl true + def handle_info(%{timestamp: timestamp} = info, %{assigns: %{map_slug: map_slug}} = socket) do + duration = DateTime.diff(DateTime.utc_now(), timestamp, :millisecond) + + if duration > @server_event_unsync_timeout do + {:noreply, socket |> push_navigate(to: ~p"/#{map_slug}")} + else + {:noreply, + socket + |> WandererAppWeb.MapEventHandler.handle_event(info)} + end + end + @impl true def handle_info(info, socket), do: