summaryrefslogtreecommitdiff
path: root/lib/chessh/schema/game.ex
diff options
context:
space:
mode:
Diffstat (limited to 'lib/chessh/schema/game.ex')
-rw-r--r--lib/chessh/schema/game.ex50
1 files changed, 49 insertions, 1 deletions
diff --git a/lib/chessh/schema/game.ex b/lib/chessh/schema/game.ex
index 868fec8..8777472 100644
--- a/lib/chessh/schema/game.ex
+++ b/lib/chessh/schema/game.ex
@@ -1,8 +1,10 @@
defmodule Chessh.Game do
- alias Chessh.Player
+ alias Chessh.{Bot, Player, Game}
use Ecto.Schema
import Ecto.Changeset
+ @default_fen "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1"
+
schema "games" do
field(:fen, :string)
field(:moves, :integer, default: 0)
@@ -17,6 +19,8 @@ defmodule Chessh.Game do
belongs_to(:light_player, Player, foreign_key: :light_player_id)
belongs_to(:dark_player, Player, foreign_key: :dark_player_id)
+ belongs_to(:bot, Bot, foreign_key: :bot_id)
+
field(:discord_thread_id, :string)
timestamps()
@@ -34,7 +38,51 @@ defmodule Chessh.Game do
:light_player_id,
:dark_player_id,
:discord_thread_id,
+ :bot_id,
:game_moves
])
end
+
+ def new_game(initial_player_color, player_id, fen \\ @default_fen) do
+ Game.changeset(
+ %Game{
+ fen: fen
+ },
+ if(initial_player_color == :light,
+ do: %{light_player_id: player_id},
+ else: %{dark_player_id: player_id}
+ )
+ )
+ end
+
+ def update_with_status(%Game{} = game, move, fen, status) do
+ Game.changeset(
+ game,
+ %{
+ fen: fen,
+ moves: game.moves + 1,
+ turn: if(game.turn == :dark, do: :light, else: :dark),
+ last_move: move,
+ game_moves:
+ if(!is_nil(game) && game.game_moves != "", do: "#{game.game_moves} ", else: "") <> move
+ }
+ |> Map.merge(changeset_from_status(status))
+ )
+ end
+
+ def 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
end