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:
parent
87c453c564
commit
32536118c4
@ -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,
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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"},
|
||||||
|
|||||||
@ -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},
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|||||||
@ -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"
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user