22from cli_chess .core .game .game_options import GameOption
33from cli_chess .core .api import GameStateDispatcher
44from cli_chess .utils import log , threaded , RequestSuccessfullySent
5- from chess import COLOR_NAMES , WHITE
5+ from chess import COLORS , COLOR_NAMES , WHITE , BLACK , Color
66from typing import Optional
77
88
@@ -12,12 +12,11 @@ class OnlineGameModel(PlayableGameModelBase):
1212 """
1313 def __init__ (self , game_parameters : dict , is_vs_ai : bool ):
1414 super ().__init__ (play_as_color = game_parameters [GameOption .COLOR ], variant = game_parameters [GameOption .VARIANT ], fen = None )
15- self ._update_game_metadata (game_parameters = game_parameters )
16-
17- self .game_state_dispatcher = Optional [GameStateDispatcher ]
15+ self .vs_ai = is_vs_ai
1816 self .playing_game_id = None
1917 self .searching = False
20- self .vs_ai = is_vs_ai
18+ self ._update_game_metadata (game_parameters = game_parameters )
19+ self .game_state_dispatcher = Optional [GameStateDispatcher ]
2120
2221 try :
2322 from cli_chess .core .api .api_manager import api_client , api_iem
@@ -37,17 +36,17 @@ def create_game(self) -> None:
3736 self .searching = True
3837
3938 if self .vs_ai : # Challenge Lichess AI (stockfish)
40- self .api_client .challenges .create_ai (level = self .game_metadata [ 'ai_level' ] ,
41- clock_limit = self .game_metadata [ 'clock' ][ 'white' ][ ' time' ],
42- clock_increment = self .game_metadata [ 'clock' ][ 'white' ][ ' increment' ] ,
43- color = self .game_metadata [ 'my_color_str' ],
44- variant = self .game_metadata [ ' variant' ] )
39+ self .api_client .challenges .create_ai (level = self .game_metadata . players [ not self . my_color ]. ai_level ,
40+ clock_limit = self .game_metadata . clocks [ WHITE ]. time * 60 , # challenges need time in seconds
41+ clock_increment = self .game_metadata . clocks [ WHITE ]. increment ,
42+ color = COLOR_NAMES [ self .game_metadata . my_color ],
43+ variant = self .game_metadata . variant )
4544 else : # Find a random opponent
46- self .api_client .board .seek (time = self .game_metadata [ 'clock' ][ 'white' ][ ' time' ], # Both players initially have the same time
47- increment = self .game_metadata [ 'clock' ][ 'white' ][ ' increment' ] ,
48- color = self .game_metadata [ 'my_color_str' ],
49- variant = self .game_metadata [ ' variant' ] ,
50- rated = self .game_metadata [ ' rated' ] ,
45+ self .api_client .board .seek (time = self .game_metadata . clocks [ WHITE ]. time ,
46+ increment = self .game_metadata . clocks [ WHITE ]. increment ,
47+ color = COLOR_NAMES [ self .game_metadata . my_color ],
48+ variant = self .game_metadata . variant ,
49+ rated = self .game_metadata . rated ,
5150 rating_range = None )
5251
5352 def _start_game (self , game_id : str ) -> None :
@@ -92,7 +91,7 @@ def handle_game_state_dispatcher_event(self, **kwargs) -> None:
9291 if 'gameFull' in kwargs :
9392 event = kwargs ['gameFull' ]
9493 self ._update_game_metadata (gsd_gameFull = event )
95- self .board_model .reinitialize_board (variant = self .game_metadata [ ' variant' ] ,
94+ self .board_model .reinitialize_board (variant = self .game_metadata . variant ,
9695 orientation = (self .my_color if self .board_model .get_variant_name () != "racingkings" else WHITE ),
9796 fen = event .get ('initialFen' , "" ))
9897 self .board_model .make_moves_from_list (event .get ('state' , {}).get ('moves' , []).split ())
@@ -219,56 +218,52 @@ def _update_game_metadata(self, **kwargs) -> None:
219218 try :
220219 if 'game_parameters' in kwargs : # This is the data that came from the menu selections
221220 data = kwargs ['game_parameters' ]
222- self .game_metadata ['my_color_str' ] = COLOR_NAMES [self .my_color ]
223- self .game_metadata ['variant' ] = data .get (GameOption .VARIANT )
224- self .game_metadata ['rated' ] = data .get (GameOption .RATED , False ) # Games against AI will not have this data
225- self .game_metadata ['ai_level' ] = data .get (GameOption .COMPUTER_SKILL_LEVEL ) # Only games against AI will have this data
226- self .game_metadata ['clock' ]['white' ]['time' ] = data .get (GameOption .TIME_CONTROL )[0 ] # mins
227- self .game_metadata ['clock' ]['white' ]['increment' ] = data .get (GameOption .TIME_CONTROL )[1 ] # secs
228- self .game_metadata ['clock' ]['black' ] = self .game_metadata ['clock' ]['white' ]
229-
230- if self .game_metadata ['ai_level' ]:
231- self .game_metadata ['clock' ]['white' ]['time' ] = data .get (GameOption .TIME_CONTROL )[0 ] * 60 # challenges need time in seconds
232- self .game_metadata ['clock' ]['black' ] = self .game_metadata ['clock' ]['white' ]
221+ self .game_metadata .my_color = self .my_color
222+ self .game_metadata .variant = data .get (GameOption .VARIANT )
223+ self .game_metadata .rated = data .get (GameOption .RATED , False )
224+ self .game_metadata .players [not self .my_color ].ai_level = data .get (GameOption .COMPUTER_SKILL_LEVEL ) if self .vs_ai else None
225+
226+ for color in COLORS :
227+ self .game_metadata .clocks [color ].time = data .get (GameOption .TIME_CONTROL )[0 ] # mins
228+ self .game_metadata .clocks [color ].increment = data .get (GameOption .TIME_CONTROL )[1 ] # secs
233229
234230 elif 'iem_gameStart' in kwargs :
235- # Reset game metadata
236- # self.game_metadata = self._default_game_metadata()
231+ self .game_metadata .reset ()
237232
238233 data = kwargs ['iem_gameStart' ]
239- self .game_metadata [ 'gameId' ] = data .get ('gameId' )
240- self .game_metadata [ 'my_color_str' ] = data . get ( 'color' )
241- self .game_metadata [ ' rated' ] = data .get ('rated' )
242- self .game_metadata [ ' variant' ] = data .get ('variant' , {}).get ('name' )
243- self .game_metadata [ ' speed' ] = data ['speed' ]
234+ self .game_metadata . game_id = data .get ('gameId' )
235+ self .game_metadata . my_color = self . my_color
236+ self .game_metadata . rated = data .get ('rated' )
237+ self .game_metadata . variant = data .get ('variant' , {}).get ('name' )
238+ self .game_metadata . speed = data ['speed' ]
244239
245240 elif 'iem_gameFinish' in kwargs :
246241 data = kwargs ['iem_gameFinish' ]
247- self .game_metadata [ ' players' ][ COLOR_NAMES [ self .my_color ]][ ' rating_diff' ] = data .get ('ratingDiff' , "" )
248- self .game_metadata [ ' players' ][ COLOR_NAMES [ not self .my_color ]][ ' rating_diff' ] = data .get ('opponent' , {}).get ('ratingDiff' , "" )
242+ self .game_metadata . players [ self .my_color ]. rating_diff = data .get ('ratingDiff' , "" )
243+ self .game_metadata . players [ not self .my_color ]. rating_diff = data .get ('opponent' , {}).get ('ratingDiff' , "" )
249244
250245 elif 'gsd_gameFull' in kwargs :
251246 data = kwargs ['gsd_gameFull' ]
252247
253248 for color in COLOR_NAMES :
254- if data .get (color , {}). get ( 'name' ):
255- self . game_metadata [ 'players' ][ color ][ 'title' ] = data . get (color , {}). get ( 'title' )
256- self . game_metadata [ 'players' ][ color ][ 'name' ] = data . get (color , {}). get ( 'name' , "?" )
257- self .game_metadata [ ' players' ][ color ][ 'rating' ] = data .get (color , {}). get ( 'rating' , "?" )
258- self .game_metadata [ ' players' ][ color ][ 'provisional' ] = data .get (color , {}). get ( 'provisional ' , False )
259- elif data . get ( color , {}) .get ('aiLevel' ):
260- self .game_metadata [ ' players' ][ color ][ 'name' ] = f"Stockfish level { data .get (color , {}). get ( 'aiLevel ' , '?' ) } "
261-
262- self .game_metadata [ 'clock' ][ 'units' ] = "ms "
263- self . game_metadata [ 'clock' ][ 'white' ][ 'time' ] = data . get ( 'state' , {}). get ( 'wtime' )
264- self .game_metadata [ 'clock' ][ 'white' ][ 'increment' ] = data . get ( 'state' , {}). get ( 'winc' )
265- self .game_metadata [ 'clock' ][ 'black' ][ ' time' ] = data .get ('state' , {}).get ('btime' )
266- self .game_metadata [ 'clock' ][ 'black' ][ ' increment' ] = data .get ('state' , {}).get ('binc' )
249+ side_data = data .get (color , {})
250+ color_as_bool = Color ( COLOR_NAMES . index (color ) )
251+ if side_data . get ('name' ):
252+ self .game_metadata . players [ color_as_bool ]. title = side_data .get ('title' )
253+ self .game_metadata . players [ color_as_bool ]. name = side_data .get ('name ' , "?" )
254+ self . game_metadata . players [ color_as_bool ]. rating = side_data .get ('rating' , "?" )
255+ self .game_metadata . players [ color_as_bool ]. is_provisional_rating = side_data .get ('provisional ' , False )
256+ elif self . vs_ai :
257+ self .game_metadata . players [ color_as_bool ]. name = f"Stockfish level { side_data . get ( 'aiLevel' , '?' ) } "
258+
259+ self .game_metadata . clocks [ color_as_bool ]. units = "ms"
260+ self .game_metadata . clocks [ color_as_bool ]. time = data .get ('state' , {}).get ('wtime' if color == "white" else 'btime' )
261+ self .game_metadata . clocks [ color_as_bool ]. increment = data .get ('state' , {}).get ('winc' if color == "white" else 'binc' )
267262
268263 elif 'gsd_gameState' in kwargs :
269264 data = kwargs ['gsd_gameState' ]
270- self .game_metadata [ 'clock' ][ 'white' ][ ' time' ] = data .get ('wtime' )
271- self .game_metadata [ 'clock' ][ 'black' ][ ' time' ] = data .get ('btime' )
265+ self .game_metadata . clocks [ WHITE ]. time = data .get ('wtime' )
266+ self .game_metadata . clocks [ BLACK ]. time = data .get ('btime' )
272267
273268 self ._notify_game_model_updated ()
274269 except Exception as e :
@@ -280,8 +275,8 @@ def _report_game_over(self, status: str, winner: str) -> None:
280275 This should only ever be called if the game is confirmed to be over
281276 """
282277 self ._game_end ()
283- self .game_metadata [ 'state' ][ ' status' ] = status # status list can be found in lila status.ts
284- self .game_metadata [ 'state' ][ ' winner' ] = winner
278+ self .game_metadata . game_status . status = status # status list can be found in lila status.ts
279+ self .game_metadata . game_status . winner = winner
285280 self ._notify_game_model_updated (onlineGameOver = True )
286281
287282 def cleanup (self ) -> None :
0 commit comments