1
0
mirror of https://github.com/danbee/chess synced 2025-03-04 08:39:06 +00:00

Send moves list back to client

This commit is contained in:
Daniel Barber 2018-05-08 15:24:24 +02:00
parent 87c453c564
commit 32536118c4
Signed by: danbarber
GPG Key ID: 931D8112E0103DD8
6 changed files with 44 additions and 25 deletions

View File

@ -38,8 +38,8 @@ defmodule Chess.Board do
{piece_captured, board} = Map.pop(board, "#{to_file},#{to_rank}") {piece_captured, board} = Map.pop(board, "#{to_file},#{to_rank}")
%{ %{
from: %{file: from_file, rank: from_rank}, from: %{"file" => from_file, "rank" => from_rank},
to: %{file: to_file, rank: to_rank}, to: %{"file" => to_file, "rank" => to_rank},
board: Map.put(board, "#{to_file},#{to_rank}", piece), board: Map.put(board, "#{to_file},#{to_rank}", piece),
piece: piece, piece: piece,
piece_captured: piece_captured, piece_captured: piece_captured,

View File

@ -29,8 +29,8 @@ defmodule Chess.Store.Move do
def translate(move) do def translate(move) do
[ [
<<97 + move.from.file, 49 + move.from.rank>>, <<97 + move.from["file"], 49 + move.from["rank"]>>,
<<97 + move.to.file, 49 + move.to.rank>> <<97 + move.to["file"], 49 + move.to["rank"]>>
] ]
|> Enum.join("-") |> Enum.join("-")
end end

View File

@ -19,13 +19,15 @@ defmodule ChessWeb.GameChannel do
game = game =
socket.assigns.current_user_id socket.assigns.current_user_id
|> Game.for_user_id() |> Game.for_user_id()
|> preload(:moves)
|> Repo.get!(game_id) |> Repo.get!(game_id)
payload = %{ payload = %{
player: player(socket, game), player: player(socket, game),
board: Board.transform(game.board), board: Board.transform(game.board),
turn: game.turn, turn: game.turn,
state: game.state state: game.state,
moves: Moves.transform(game.moves),
} }
socket socket
@ -34,10 +36,13 @@ defmodule ChessWeb.GameChannel do
{:noreply, socket} {:noreply, socket}
end end
def handle_in("game:move", move_params, socket) do def handle_in("game:move", params, socket) do
move_params = convert_params(params)
game = game =
socket.assigns.current_user_id socket.assigns.current_user_id
|> Game.for_user_id() |> Game.for_user_id()
|> preload(:moves)
|> Repo.get!(socket.assigns.game_id) |> Repo.get!(socket.assigns.game_id)
params = Board.move_piece(game.board, move_params) 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)) |> Multi.insert(:move, Ecto.build_assoc(game, :moves, params))
|> Repo.transaction |> Repo.transaction
|> case do |> case do
{:ok, %{game: game}} -> {:ok, _} ->
send_update(game) send_update(socket)
{:noreply, socket} {:noreply, socket}
{:error, :game, changeset, _} -> {:error, :game, changeset, _} ->
@ -80,11 +85,25 @@ defmodule ChessWeb.GameChannel do
{:reply, {:ok, reply}, socket} {:reply, {:ok, reply}, socket}
end 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 = %{ payload = %{
board: Board.transform(game.board), board: Board.transform(game.board),
turn: game.turn, turn: game.turn,
state: game.state state: game.state,
moves: Moves.transform(game.moves),
} }
ChessWeb.Endpoint.broadcast("game:#{game.id}", "game:update", payload) ChessWeb.Endpoint.broadcast("game:#{game.id}", "game:update", payload)
end end

View File

@ -46,7 +46,7 @@ defmodule Chess.BoardTest do
} }
%{board: new_board} = %{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 == %{ assert new_board == %{
"5,2" => %{"type" => "queen", "colour" => "white"}, "5,2" => %{"type" => "queen", "colour" => "white"},

View File

@ -10,16 +10,16 @@ defmodule Chess.MovesTest do
test "tranforms a list of moves" do test "tranforms a list of moves" do
moves = [ moves = [
%Move{ %Move{
from: %{file: 4, rank: 1}, from: %{"file" => 4, "rank" => 1},
to: %{file: 4, rank: 3}, to: %{"file" => 4, "rank" => 3},
}, },
%Move{ %Move{
from: %{file: 4, rank: 6}, from: %{"file" => 4, "rank" => 6},
to: %{file: 4, rank: 4}, to: %{"file" => 4, "rank" => 4},
}, },
%Move{ %Move{
from: %{file: 1, rank: 0}, from: %{"file" => 1, "rank" => 0},
to: %{file: 2, rank: 2}, to: %{"file" => 2, "rank" => 2},
}, },
] ]

View File

@ -22,8 +22,8 @@ defmodule Chess.MoveTest do
changeset = Move.changeset(%Move{}, %{ changeset = Move.changeset(%Move{}, %{
game_id: game.id, game_id: game.id,
from: %{file: 4, rank: 1}, from: %{"file" => 4, "rank" => 1},
to: %{file: 4, rank: 3}, to: %{"file" => 4, "rank" => 3},
piece: %{"type" => "pawn", "colour" => "white"}, piece: %{"type" => "pawn", "colour" => "white"},
}) })
@ -33,8 +33,8 @@ defmodule Chess.MoveTest do
test "move is invalid without a game" do test "move is invalid without a game" do
changeset = Move.changeset(%Move{}, %{ changeset = Move.changeset(%Move{}, %{
from: %{file: 4, rank: 1}, from: %{"file" => 4, "rank" => 1},
to: %{file: 4, rank: 3}, to: %{"file" => 4, "rank" => 3},
piece: %{"type" => "pawn", "colour" => "white"}, piece: %{"type" => "pawn", "colour" => "white"},
}) })
@ -71,8 +71,8 @@ defmodule Chess.MoveTest do
changeset = Move.changeset(%Move{}, %{ changeset = Move.changeset(%Move{}, %{
game_id: game.id, game_id: game.id,
from: %{file: 4, rank: 1}, from: %{"file" => 4, "rank" => 1},
to: %{file: 4, rank: 3}, to: %{"file" => 4, "rank" => 3},
}) })
refute changeset.valid? refute changeset.valid?
@ -81,8 +81,8 @@ defmodule Chess.MoveTest do
test "translates a move" do test "translates a move" do
move = %Move{ move = %Move{
from: %{file: 4, rank: 1}, from: %{"file" => 4, "rank" => 1},
to: %{file: 4, rank: 3}, to: %{"file" => 4, "rank" => 3},
} }
assert Move.translate(move) == "e2-e4" assert Move.translate(move) == "e2-e4"