not reseting state on browser disconnect or reconnect
This commit is contained in:
@@ -20,6 +20,11 @@ defmodule BackendWeb.ConnectedUserChannel do
|
||||
:new_browser_connection
|
||||
)
|
||||
|
||||
socket =
|
||||
socket
|
||||
|> assign(:player_name, socket_user)
|
||||
|> assign(:keys_pressed, MapSet.new())
|
||||
|
||||
current_state = Backend.GameRunner.get_state()
|
||||
{:ok, %{game_state: current_state}, socket}
|
||||
end
|
||||
@@ -47,74 +52,42 @@ defmodule BackendWeb.ConnectedUserChannel do
|
||||
end
|
||||
|
||||
@impl true
|
||||
@spec handle_in(<<_::48, _::_*8>>, map(), any()) ::
|
||||
{:noreply, any()} | {:reply, :ok, Phoenix.Socket.t()}
|
||||
def handle_in("join_game", %{"name" => name}, socket) do
|
||||
Logger.info("Player '#{name}' joining game on #{node()}")
|
||||
|
||||
socket =
|
||||
socket
|
||||
|> assign(:player_name, name)
|
||||
|> assign(:keys_pressed, MapSet.new())
|
||||
|
||||
Backend.GameRunner.add_player(name)
|
||||
|
||||
{:reply, :ok, socket}
|
||||
end
|
||||
|
||||
@impl true
|
||||
def handle_in("key_down", %{"key" => key}, socket) do
|
||||
case socket.assigns[:player_name] do
|
||||
nil ->
|
||||
Logger.warning("Key down attempted without joining game")
|
||||
{:noreply, socket}
|
||||
def handle_in("key_down", %{"key" => key}, %{assigns: %{player_name: player_name}} = socket) do
|
||||
keys_pressed = MapSet.put(socket.assigns[:keys_pressed] || MapSet.new(), key)
|
||||
socket = assign(socket, :keys_pressed, keys_pressed)
|
||||
|
||||
player_name ->
|
||||
keys_pressed = MapSet.put(socket.assigns[:keys_pressed] || MapSet.new(), key)
|
||||
socket = assign(socket, :keys_pressed, keys_pressed)
|
||||
Logger.debug(
|
||||
"Player '#{player_name}' key down: #{key}, keys: #{inspect(MapSet.to_list(keys_pressed))}"
|
||||
)
|
||||
|
||||
Logger.debug(
|
||||
"Player '#{player_name}' key down: #{key}, keys: #{inspect(MapSet.to_list(keys_pressed))}"
|
||||
)
|
||||
Backend.GameRunner.update_player_keys(
|
||||
player_name,
|
||||
MapSet.to_list(keys_pressed)
|
||||
)
|
||||
|
||||
Backend.GameRunner.update_player_keys(player_name, MapSet.to_list(keys_pressed))
|
||||
|
||||
{:noreply, socket}
|
||||
end
|
||||
{:noreply, socket}
|
||||
end
|
||||
|
||||
@impl true
|
||||
def handle_in("key_up", %{"key" => key}, socket) do
|
||||
case socket.assigns[:player_name] do
|
||||
nil ->
|
||||
Logger.warning("Key up attempted without joining game")
|
||||
{:noreply, socket}
|
||||
def handle_in("key_up", %{"key" => key}, %{assigns: %{player_name: player_name}} = socket) do
|
||||
keys_pressed = MapSet.delete(socket.assigns[:keys_pressed] || MapSet.new(), key)
|
||||
socket = assign(socket, :keys_pressed, keys_pressed)
|
||||
|
||||
player_name ->
|
||||
keys_pressed = MapSet.delete(socket.assigns[:keys_pressed] || MapSet.new(), key)
|
||||
socket = assign(socket, :keys_pressed, keys_pressed)
|
||||
Logger.debug(
|
||||
"Player '#{player_name}' key up: #{key}, keys: #{inspect(MapSet.to_list(keys_pressed))}"
|
||||
)
|
||||
|
||||
Logger.debug(
|
||||
"Player '#{player_name}' key up: #{key}, keys: #{inspect(MapSet.to_list(keys_pressed))}"
|
||||
)
|
||||
Backend.GameRunner.update_player_keys(player_name, MapSet.to_list(keys_pressed))
|
||||
|
||||
Backend.GameRunner.update_player_keys(player_name, MapSet.to_list(keys_pressed))
|
||||
|
||||
{:noreply, socket}
|
||||
end
|
||||
end
|
||||
|
||||
@impl true
|
||||
def terminate(_reason, socket) do
|
||||
case socket.assigns[:player_name] do
|
||||
nil ->
|
||||
Logger.info("WebSocket disconnected from #{node()}")
|
||||
|
||||
player_name ->
|
||||
Logger.info("Player '#{player_name}' disconnected from #{node()}")
|
||||
Backend.GameRunner.remove_player(player_name)
|
||||
end
|
||||
|
||||
:ok
|
||||
{:noreply, socket}
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user