diff --git a/lib/chess/board.ex b/lib/chess/board.ex index 3a55d22..1acdacd 100644 --- a/lib/chess/board.ex +++ b/lib/chess/board.ex @@ -38,8 +38,8 @@ defmodule Chess.Board do {piece_captured, board} = Map.pop(board, "#{to_file},#{to_rank}") %{ - from: %{file: from_file, rank: from_rank}, - to: %{file: to_file, rank: to_rank}, + from: %{"file" => from_file, "rank" => from_rank}, + to: %{"file" => to_file, "rank" => to_rank}, board: Map.put(board, "#{to_file},#{to_rank}", piece), piece: piece, piece_captured: piece_captured, diff --git a/lib/chess/store/move.ex b/lib/chess/store/move.ex index 6603e93..4fbc5fb 100644 --- a/lib/chess/store/move.ex +++ b/lib/chess/store/move.ex @@ -29,8 +29,8 @@ defmodule Chess.Store.Move do def translate(move) do [ - <<97 + move.from.file, 49 + move.from.rank>>, - <<97 + move.to.file, 49 + move.to.rank>> + <<97 + move.from["file"], 49 + move.from["rank"]>>, + <<97 + move.to["file"], 49 + move.to["rank"]>> ] |> Enum.join("-") end diff --git a/lib/chess_web/channels/game_channel.ex b/lib/chess_web/channels/game_channel.ex index 3f9a182..37ba1f1 100644 --- a/lib/chess_web/channels/game_channel.ex +++ b/lib/chess_web/channels/game_channel.ex @@ -19,13 +19,15 @@ defmodule ChessWeb.GameChannel do game = socket.assigns.current_user_id |> Game.for_user_id() + |> preload(:moves) |> Repo.get!(game_id) payload = %{ player: player(socket, game), board: Board.transform(game.board), turn: game.turn, - state: game.state + state: game.state, + moves: Moves.transform(game.moves), } socket @@ -34,10 +36,13 @@ defmodule ChessWeb.GameChannel do {:noreply, socket} end - def handle_in("game:move", move_params, socket) do + def handle_in("game:move", params, socket) do + move_params = convert_params(params) + game = socket.assigns.current_user_id |> Game.for_user_id() + |> preload(:moves) |> Repo.get!(socket.assigns.game_id) params = Board.move_piece(game.board, move_params) @@ -47,8 +52,8 @@ defmodule ChessWeb.GameChannel do |> Multi.insert(:move, Ecto.build_assoc(game, :moves, params)) |> Repo.transaction |> case do - {:ok, %{game: game}} -> - send_update(game) + {:ok, _} -> + send_update(socket) {:noreply, socket} {:error, :game, changeset, _} -> @@ -80,11 +85,25 @@ defmodule ChessWeb.GameChannel do {:reply, {:ok, reply}, socket} end - def send_update(game) do + def convert_params(%{"from" => from, "to" => to}) do + %{ + "from" => Enum.map(from, fn(s) -> String.to_integer(s) end), + "to" => Enum.map(to, fn(s) -> String.to_integer(s) end), + } + end + + def send_update(socket) do + game = + socket.assigns.current_user_id + |> Game.for_user_id() + |> preload(:moves) + |> Repo.get!(socket.assigns.game_id) + payload = %{ board: Board.transform(game.board), turn: game.turn, - state: game.state + state: game.state, + moves: Moves.transform(game.moves), } ChessWeb.Endpoint.broadcast("game:#{game.id}", "game:update", payload) end diff --git a/test/chess/board_test.exs b/test/chess/board_test.exs index c4ddae8..0183e8f 100644 --- a/test/chess/board_test.exs +++ b/test/chess/board_test.exs @@ -46,7 +46,7 @@ defmodule Chess.BoardTest do } %{board: new_board} = - Board.move_piece(board, %{"from" => [3, 0], "to" => [5, 2]}) + Board.move_piece(board, %{"from" => ["3", "0"], "to" => ["5", "2"]}) assert new_board == %{ "5,2" => %{"type" => "queen", "colour" => "white"}, diff --git a/test/chess/moves_test.exs b/test/chess/moves_test.exs index fffec9c..57c5935 100644 --- a/test/chess/moves_test.exs +++ b/test/chess/moves_test.exs @@ -10,16 +10,16 @@ defmodule Chess.MovesTest do test "tranforms a list of moves" do moves = [ %Move{ - from: %{file: 4, rank: 1}, - to: %{file: 4, rank: 3}, + from: %{"file" => 4, "rank" => 1}, + to: %{"file" => 4, "rank" => 3}, }, %Move{ - from: %{file: 4, rank: 6}, - to: %{file: 4, rank: 4}, + from: %{"file" => 4, "rank" => 6}, + to: %{"file" => 4, "rank" => 4}, }, %Move{ - from: %{file: 1, rank: 0}, - to: %{file: 2, rank: 2}, + from: %{"file" => 1, "rank" => 0}, + to: %{"file" => 2, "rank" => 2}, }, ] diff --git a/test/chess/store/move_test.exs b/test/chess/store/move_test.exs index f4ef53a..8d5914b 100644 --- a/test/chess/store/move_test.exs +++ b/test/chess/store/move_test.exs @@ -22,8 +22,8 @@ defmodule Chess.MoveTest do changeset = Move.changeset(%Move{}, %{ game_id: game.id, - from: %{file: 4, rank: 1}, - to: %{file: 4, rank: 3}, + from: %{"file" => 4, "rank" => 1}, + to: %{"file" => 4, "rank" => 3}, piece: %{"type" => "pawn", "colour" => "white"}, }) @@ -33,8 +33,8 @@ defmodule Chess.MoveTest do test "move is invalid without a game" do changeset = Move.changeset(%Move{}, %{ - from: %{file: 4, rank: 1}, - to: %{file: 4, rank: 3}, + from: %{"file" => 4, "rank" => 1}, + to: %{"file" => 4, "rank" => 3}, piece: %{"type" => "pawn", "colour" => "white"}, }) @@ -71,8 +71,8 @@ defmodule Chess.MoveTest do changeset = Move.changeset(%Move{}, %{ game_id: game.id, - from: %{file: 4, rank: 1}, - to: %{file: 4, rank: 3}, + from: %{"file" => 4, "rank" => 1}, + to: %{"file" => 4, "rank" => 3}, }) refute changeset.valid? @@ -81,8 +81,8 @@ defmodule Chess.MoveTest do test "translates a move" do move = %Move{ - from: %{file: 4, rank: 1}, - to: %{file: 4, rank: 3}, + from: %{"file" => 4, "rank" => 1}, + to: %{"file" => 4, "rank" => 3}, } assert Move.translate(move) == "e2-e4"