44from typing import Dict
55
66import chess
7+ from users .models import AnonymousSessionUser
78
89from ..utils import genUniqueID
910from .chess_board import CHESS_COLOR_NAMES , ChessBoard , CustomOutcome , CustomTermination
1011from .game_modes import GameMode , TimeControl
1112from .models import Game as GameModel
1213from .models import GameTerminations , Move
14+ from .models import Player as PlayerModel
1315from .players import APICallbackType , GameUser , Player , Players , TimeS , UnknownPlayer , UnknownPlayerType
1416
1517
@@ -184,12 +186,11 @@ def is_players_turn(self, user: GameUser) -> bool:
184186
185187 def save_to_db (self , result : CustomOutcome ) -> None :
186188 """Saves the game to the database."""
187- white = self .players .by_color (chess .WHITE ).user
188- black = self .players .by_color (chess .BLACK ).user
189+ whitePlayer , blackPlayer = self .get_player_models ()
189190
190191 game = GameModel (
191- player_white = white if white is not UnknownPlayer else None ,
192- player_black = black if black is not UnknownPlayer else None ,
192+ player_white = whitePlayer ,
193+ player_black = blackPlayer ,
193194 termination = GameTerminations .from_chess_termination (result .termination ),
194195 winner_color = result .winner ,
195196 time_control = self .time_control .time ,
@@ -199,6 +200,35 @@ def save_to_db(self, result: CustomOutcome) -> None:
199200 [Move (game = game , order = order , move = move ) for order , move in enumerate (self .get_moves_list ())]
200201 )
201202
203+ def get_player_models (self ) -> tuple [PlayerModel | None , PlayerModel | None ]:
204+ """
205+ Gets the PlayerModel objects of the game's players.
206+ - Returns `None` if the player is an UnknownPlayer.
207+ """
208+ whitePlayer = self .players .by_color (chess .WHITE )
209+ blackPlayer = self .players .by_color (chess .BLACK )
210+
211+ return (
212+ self .get_player_model (whitePlayer .user ),
213+ self .get_player_model (blackPlayer .user ),
214+ )
215+
216+ def get_player_model (self , user : GameUser | UnknownPlayerType ) -> PlayerModel | None :
217+ """Gets the PlayerModel object of the user, or None if the user is UnknownPlayer."""
218+ isUnknownPlayer = user is UnknownPlayer
219+ if isUnknownPlayer :
220+ return None
221+
222+ isAnonymousUser = isinstance (user , AnonymousSessionUser )
223+
224+ playerModel = PlayerModel (
225+ user = user if not isAnonymousUser else None ,
226+ anonymousUser = user if isAnonymousUser else None ,
227+ )
228+ playerModel .save ()
229+
230+ return playerModel
231+
202232 def finish (self , result : CustomOutcome ) -> None :
203233 """Finishes the game and saves it to the database.
204234 - Does not save games with termination of `ABORTED`."""
0 commit comments