summaryrefslogtreecommitdiff
path: root/lib/chessh/ssh/client/game/game.ex
diff options
context:
space:
mode:
Diffstat (limited to 'lib/chessh/ssh/client/game/game.ex')
-rw-r--r--lib/chessh/ssh/client/game/game.ex87
1 files changed, 26 insertions, 61 deletions
diff --git a/lib/chessh/ssh/client/game/game.ex b/lib/chessh/ssh/client/game/game.ex
index 4fb28f3..738832e 100644
--- a/lib/chessh/ssh/client/game/game.ex
+++ b/lib/chessh/ssh/client/game/game.ex
@@ -1,10 +1,8 @@
defmodule Chessh.SSH.Client.Game do
require Logger
- alias Chessh.{Game, Utils, Repo}
+ alias Chessh.{Game, Utils, Repo, Bot}
alias Chessh.SSH.Client.Game.Renderer
- @default_fen "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1"
-
defmodule State do
defstruct cursor: %{x: 7, y: 7},
highlighted: %{},
@@ -69,27 +67,14 @@ defmodule Chessh.SSH.Client.Game do
case Hammer.check_rate_inc(
:redis,
- "player-#{state.player_session.id}-create-game-rate",
+ "player-#{state.player_session.player_id}-create-game-rate",
create_game_ms,
create_game_rate,
1
) do
{:allow, _count} ->
- # Starting a new game
- {:ok, %Game{id: game_id} = game} =
- Game.changeset(
- %Game{},
- Map.merge(
- if(color == :light,
- do: %{light_player_id: player_session.player_id},
- else: %{dark_player_id: player_session.player_id}
- ),
- %{
- fen: @default_fen
- }
- )
- )
- |> Repo.insert()
+ game = Game.new_game(color, player_session.player_id) |> Repo.insert!()
+ %Game{id: game_id} = game
GenServer.cast(
:discord_notifier,
@@ -129,20 +114,23 @@ defmodule Chessh.SSH.Client.Game do
id: game_id,
fen: fen,
dark_player_id: dark_player_id,
- light_player_id: light_player_id
+ light_player_id: light_player_id,
+ bot_id: bot_id
} = game
} = state
| _
]) do
maybe_changeset =
- case color do
- :light ->
- if !light_player_id,
- do: Game.changeset(game, %{light_player_id: player_session.player_id})
-
- :dark ->
- if !dark_player_id,
- do: Game.changeset(game, %{dark_player_id: player_session.player_id})
+ if !bot_id do
+ case(color) do
+ :light ->
+ if !light_player_id,
+ do: Game.changeset(game, %{light_player_id: player_session.player_id})
+
+ :dark ->
+ if !dark_player_id,
+ do: Game.changeset(game, %{dark_player_id: player_session.player_id})
+ end
end
{status, maybe_joined_game} =
@@ -164,7 +152,7 @@ defmodule Chessh.SSH.Client.Game do
end
binbo_pid = initialize_game(game_id, fen)
- game = Repo.get(Game, game_id) |> Repo.preload([:light_player, :dark_player])
+ game = Repo.get(Game, game_id) |> Repo.preload([:light_player, :dark_player, :bot])
player_color = if(game.light_player_id == player_session.player_id, do: :light, else: :dark)
@@ -206,7 +194,7 @@ defmodule Chessh.SSH.Client.Game do
}
end).(%State{
state
- | game: Repo.get(Game, game_id) |> Repo.preload([:light_player, :dark_player])
+ | game: Repo.get(Game, game_id) |> Repo.preload([:light_player, :dark_player, :bot])
})
send(client_pid, {:send_to_ssh, Renderer.render_board_state(new_state)})
@@ -218,7 +206,7 @@ defmodule Chessh.SSH.Client.Game do
:player_joined,
%State{client_pid: client_pid, game: %Game{id: game_id}} = state
) do
- game = Repo.get(Game, game_id) |> Repo.preload([:light_player, :dark_player])
+ game = Repo.get(Game, game_id) |> Repo.preload([:light_player, :dark_player, :bot])
new_state = %State{state | game: game}
send(client_pid, {:send_to_ssh, Renderer.render_board_state(new_state)})
{:noreply, new_state}
@@ -365,7 +353,7 @@ defmodule Chessh.SSH.Client.Game do
from,
to,
%State{
- game: %Game{game_moves: game_moves, id: game_id, turn: turn},
+ game: %Game{id: game_id, turn: turn},
binbo_pid: binbo_pid,
flipped: flipped,
color: turn
@@ -391,22 +379,15 @@ defmodule Chessh.SSH.Client.Game do
{:ok, status} ->
{:ok, fen} = :binbo.get_fen(binbo_pid)
- {:ok, %Game{status: after_move_status}} =
+ {:ok, %Game{status: after_move_status} = game} =
game
- |> Game.changeset(
- Map.merge(
- %{
- fen: fen,
- moves: game.moves + 1,
- turn: if(game.turn == :dark, do: :light, else: :dark),
- last_move: attempted_move,
- game_moves: if(game_moves, do: game_moves <> " ", else: "") <> attempted_move
- },
- changeset_from_status(status)
- )
- )
+ |> Game.update_with_status(attempted_move, fen, status)
|> Repo.update()
+ if !is_nil(game.bot) do
+ spawn(fn -> Bot.send_update(Repo.get(Game, game.id) |> Repo.preload([:bot])) end)
+ end
+
:syn.publish(:games, {:game, game_id}, {:new_move, attempted_move})
if after_move_status == :continue do
@@ -433,22 +414,6 @@ defmodule Chessh.SSH.Client.Game do
nil
end
- defp changeset_from_status(game_status) do
- case game_status do
- :continue ->
- %{}
-
- {:draw, _} ->
- %{status: :draw}
-
- {:checkmate, :white_wins} ->
- %{status: :winner, winner: :light}
-
- {:checkmate, :black_wins} ->
- %{status: :winner, winner: :dark}
- end
- end
-
defp make_highlight_map(
%State{
game: %Game{last_move: last_move, turn: turn},