Files
wanderer/lib/wanderer_app/map/server/map_server_pings_impl.ex
Dmitry Popov 585de15e6b
Build Test / 🚀 Deploy to test env (fly.io) (push) Has been cancelled
Build Test / 🛠 Build (1.17, 18.x, 27) (push) Has been cancelled
🧪 Test Suite / Test Suite (push) Has been cancelled
chore: fixed compile errors
2025-07-18 17:41:38 +02:00

112 lines
2.9 KiB
Elixir

defmodule WandererApp.Map.Server.PingsImpl do
@moduledoc false
require Logger
alias WandererApp.Map.Server.Impl
@ping_auto_expire_timeout :timer.minutes(15)
def add_ping(
%{map_id: map_id} = state,
%{
solar_system_id: solar_system_id,
type: type,
message: message,
character_id: character_id,
user_id: user_id
} = ping_info
) do
{:ok, character} = WandererApp.Character.get_character(character_id)
system =
WandererApp.Map.find_system_by_location(map_id, %{
solar_system_id: solar_system_id |> String.to_integer()
})
{:ok, ping} =
WandererApp.MapPingsRepo.create(%{
map_id: map_id,
character_id: character_id,
system_id: system.id,
message: message,
type: type
})
Impl.broadcast!(
map_id,
:ping_added,
ping |> Map.merge(%{character_eve_id: character.eve_id, solar_system_id: solar_system_id})
)
# Broadcast rally point events to external clients (webhooks/SSE)
if type == 1 do
WandererApp.ExternalEvents.broadcast(map_id, :rally_point_added, %{
rally_point_id: ping.id,
solar_system_id: solar_system_id,
system_id: system.id,
character_id: character_id,
character_name: character.name,
character_eve_id: character.eve_id,
system_name: system.name,
message: message,
created_at: ping.inserted_at
})
end
WandererApp.User.ActivityTracker.track_map_event(:map_rally_added, %{
character_id: character_id,
user_id: user_id,
map_id: map_id,
solar_system_id: "#{solar_system_id}"
})
state
end
def cancel_ping(
%{map_id: map_id} = state,
%{
id: ping_id,
character_id: character_id,
user_id: user_id,
type: type
} = ping_info
) do
{:ok, character} = WandererApp.Character.get_character(character_id)
{:ok, %{system: %{id: system_id, name: system_name, solar_system_id: solar_system_id}} = ping} =
WandererApp.MapPingsRepo.get_by_id(ping_id)
:ok = WandererApp.MapPingsRepo.destroy(ping)
Impl.broadcast!(map_id, :ping_cancelled, %{
id: ping_id,
solar_system_id: solar_system_id,
type: type
})
# Broadcast rally point removal events to external clients (webhooks/SSE)
if type == 1 do
WandererApp.ExternalEvents.broadcast(map_id, :rally_point_removed, %{
id: ping_id,
solar_system_id: solar_system_id,
system_id: system_id,
character_id: character_id,
character_name: character.name,
character_eve_id: character.eve_id,
system_name: system_name
})
end
WandererApp.User.ActivityTracker.track_map_event(:map_rally_cancelled, %{
character_id: character_id,
user_id: user_id,
map_id: map_id,
solar_system_id: solar_system_id
})
state
end
end