def onStyle12(self, match): style12 = match.groups()[0] gameno = int(style12.split()[15]) if gameno in self.queuedStyle12s: self.queuedStyle12s[gameno].append(style12) return try: self.gamemodelStartedEvents[gameno].wait() except KeyError: pass if gameno in self.castleSigns: castleSigns = self.castleSigns[gameno] else: castleSigns = ("k", "q") gameno, relation, curcol, ply, wname, bname, wms, bms, gain, lastmove, fen = \ self.parseStyle12(style12, castleSigns) # examine starts with a <12> line only if lastmove is None and relation == IC_POS_EXAMINATING: pgnHead = [("Event", "FICS examined game"), ("Site", "freechess.org"), ("White", wname), ("Black", bname), ("Result", "*"), ("SetUp", "1"), ("FEN", fen)] pgn = "\n".join(['[%s "%s"]' % line for line in pgnHead]) + "\n*\n" wplayer = self.connection.players.get(wname) bplayer = self.connection.players.get(bname) # examine from console or got mexamine in observed game if self.connection.examined_game is None: no_smoves = True game = FICSGame(wplayer, bplayer, gameno=int(gameno), game_type=GAME_TYPES["examined"], minutes=0, inc=0, board=FICSBoard(0, 0, pgn=pgn), relation=relation) self.connection.examined_game = game else: # examine an archived game from GUI no_smoves = False game = self.connection.examined_game game.gameno = int(gameno) game.relation = relation # game.game_type = GAME_TYPES["examined"] game = self.connection.games.get(game) # don't start new game in puzzlebot/endgamebot when they just reuse gameno if game.relation == IC_POS_OBSERVING_EXAMINATION or \ (game.board is not None and game.board.pgn == pgn): self.emit("boardUpdate", gameno, ply, curcol, lastmove, fen, wname, bname, wms, bms) return game.relation = relation game.board = FICSBoard(0, 0, pgn=pgn) self.gamesImObserving[game] = wms, bms # start a new game now or after smoves self.gamemodelStartedEvents[game.gameno] = threading.Event() if no_smoves: self.emit("exGameCreated", game) self.gamemodelStartedEvents[game.gameno].wait() else: if isinstance(game, FICSHistoryGame): self.connection.client.run_command( "smoves %s %s" % (self.connection.history_owner, game.history_no)) elif isinstance(game, FICSJournalGame): self.connection.client.run_command( "smoves %s %%%s" % (self.connection.journal_owner, game.journal_no)) elif isinstance(game, FICSAdjournedGame): self.connection.client.run_command( "smoves %s %s" % (self.connection.stored_owner, game.opponent.name)) self.connection.client.run_command("forward 999") else: self.emit("boardUpdate", gameno, ply, curcol, lastmove, fen, wname, bname, wms, bms)
def on_icc_my_game_started(self, data): # gamenumber whitename blackname wild-number rating-type rated # white-initial white-increment black-initial black-increment # played-game {ex-string} white-rating black-rating game-id # white-titles black-titles irregular-legality irregular-semantics # uses-plunkers fancy-timecontrol promote-to-king # 685 Salsicha MaxiBomb 0 Blitz 1 3 0 3 0 1 {} 2147 2197 1729752694 {} {} 0 0 0 {} 0 # 259 Rikikilord ARMH 0 Blitz 1 2 12 2 12 0 {Ex: Rikikilord 0} 1532 1406 1729752286 {} {} 0 0 0 {} 0 gameno, wname, bname, wild, rtype, rated, wmin, winc, bmin, binc, played_game, rest = data.split(" ", 11) parts = rest.split("}", 1)[1].split() wrating = int(parts[0]) brating = int(parts[1]) gameno = int(gameno) wplayer = self.connection.players.get(wname) bplayer = self.connection.players.get(bname) game_type = GAME_TYPES[rtype.lower()] for player, rating in ((wplayer, wrating), (bplayer, brating)): if player.ratings[game_type.rating_type] != rating: player.ratings[game_type.rating_type] = rating player.emit("ratings_changed", game_type.rating_type, player) wms = bms = int(wmin) * 60 * 1000 + int(winc) * 1000 # TODO: maybe use DG_POSITION_BEGIN2 and DG_PAST_MOVE ? fen = FEN_START game = FICSGame(wplayer, bplayer, gameno=gameno, rated=rated == "1", game_type=game_type, minutes=int(wmin), inc=int(winc), board=FICSBoard(wms, bms, fen=fen)) if self.connection.examined_game is not None: pgnHead = [ ("Event", "ICC examined game"), ("Site", "chessclub.com"), ("White", wname), ("Black", bname), ("Result", "*"), ("SetUp", "1"), ("FEN", fen) ] pgn = "\n".join(['[%s "%s"]' % line for line in pgnHead]) + "\n*\n" game.relation = IC_POS_EXAMINATING game.game_type = GAME_TYPES["examined"] game.board.pgn = pgn game = self.connection.games.get(game) for player in (wplayer, bplayer): if player.status != IC_STATUS_PLAYING: player.status = IC_STATUS_PLAYING if player.game != game: player.game = game self.theGameImPlaying = game self.my_game_info = (WHITE, 0, wms, bms) self.gamemodelStartedEvents[gameno] = asyncio.Event() self.connection.client.run_command("follow") if self.connection.examined_game is not None: self.emit("exGameCreated", game) else: self.emit("playGameCreated", game)
def on_icc_my_game_started(self, data): log.debug("DG_MY_GAME_STARTED %s" % data) # gamenumber whitename blackname wild-number rating-type rated # white-initial white-increment black-initial black-increment # played-game {ex-string} white-rating black-rating game-id # white-titles black-titles irregular-legality irregular-semantics # uses-plunkers fancy-timecontrol promote-to-king # 685 Salsicha MaxiBomb 0 Blitz 1 3 0 3 0 1 {} 2147 2197 1729752694 {} {} 0 0 0 {} 0 # 259 Rikikilord ARMH 0 Blitz 1 2 12 2 12 0 {Ex: Rikikilord 0} 1532 1406 1729752286 {} {} 0 0 0 {} 0 gameno, wname, bname, wild, rtype, rated, wmin, winc, bmin, binc, played_game, rest = data.split( " ", 11) parts = rest.split("}", 1)[1].split() wrating = int(parts[0]) brating = int(parts[1]) gameno = int(gameno) wplayer = self.connection.players.get(wname) bplayer = self.connection.players.get(bname) if int(wild) > 0: game_type = GAME_TYPES["w%s" % wild] else: game_type = GAME_TYPES[rtype.lower()] log.debug("DG_MY_GAME_STARTED game type is %s" % game_type) for player, rating in ((wplayer, wrating), (bplayer, brating)): try: if player.ratings[game_type.rating_type] != rating: player.ratings[game_type.rating_type] = rating player.emit("ratings_changed", game_type.rating_type, player) except IndexError: log.debug( "!!! game_type.rating_type %s is out of range in player.ratings %s" % (game_type.rating_type, player.ratings)) wms = bms = int(wmin) * 60 * 1000 + int(winc) * 1000 # TODO: maybe use DG_POSITION_BEGIN2 and DG_PAST_MOVE ? fen = FEN_START game = FICSGame(wplayer, bplayer, gameno=gameno, rated=rated == "1", game_type=game_type, minutes=int(wmin), inc=int(winc), board=FICSBoard(wms, bms, fen=fen)) if self.connection.examined_game is not None: pgnHead = [("Event", "ICC examined game"), ("Site", "chessclub.com"), ("White", wname), ("Black", bname), ("Result", "*"), ("SetUp", "1"), ("FEN", fen)] pgn = "\n".join(['[%s "%s"]' % line for line in pgnHead]) + "\n*\n" game.relation = IC_POS_EXAMINATING game.game_type = GAME_TYPES["examined"] game.board.pgn = pgn game = self.connection.games.get(game) for player in (wplayer, bplayer): if player.status != IC_STATUS_PLAYING: player.status = IC_STATUS_PLAYING if player.game != game: player.game = game self.theGameImPlaying = game self.my_game_info = (WHITE, 0, wms, bms) self.gamemodelStartedEvents[gameno] = asyncio.Event() self.connection.client.run_command("follow") if self.connection.examined_game is not None: self.emit("exGameCreated", game) else: if int(wild) in (1, 2, 3, 4, 20, 21, 22): # several wild variant (including loadfen/loadgame) need # a starting FEN coming in a DG_POSITION_BEGIN datgram log.debug("wild20 is waiting for a starting FEN...") else: self.emit("playGameCreated", game)
def onStyle12(self, match): style12 = match.groups()[0] gameno = int(style12.split()[15]) if gameno in self.queuedStyle12s: self.queuedStyle12s[gameno].append(style12) return try: self.gamemodelStartedEvents[gameno].wait() except KeyError: pass if gameno in self.castleSigns: castleSigns = self.castleSigns[gameno] else: castleSigns = ("k", "q") gameno, relation, curcol, ply, wname, bname, wms, bms, gain, lastmove, fen = \ self.parseStyle12(style12, castleSigns) # examine starts with a <12> line only if lastmove is None and relation == IC_POS_EXAMINATING: pgnHead = [ ("Event", "FICS examined game"), ("Site", "freechess.org"), ("White", wname), ("Black", bname), ("Result", "*"), ("SetUp", "1"), ("FEN", fen) ] pgn = "\n".join(['[%s "%s"]' % line for line in pgnHead]) + "\n*\n" wplayer = self.connection.players.get(wname) bplayer = self.connection.players.get(bname) # examine from console or got mexamine in observed game if self.connection.examined_game is None: no_smoves = True game = FICSGame(wplayer, bplayer, gameno=int(gameno), game_type=GAME_TYPES["examined"], minutes=0, inc=0, board=FICSBoard(0, 0, pgn=pgn), relation=relation) self.connection.examined_game = game else: # examine an archived game from GUI no_smoves = False game = self.connection.examined_game game.gameno = int(gameno) game.relation = relation # game.game_type = GAME_TYPES["examined"] game = self.connection.games.get(game) # don't start new game in puzzlebot/endgamebot when they just reuse gameno if game.relation == IC_POS_OBSERVING_EXAMINATION or \ (game.board is not None and game.board.pgn == pgn): self.emit("boardUpdate", gameno, ply, curcol, lastmove, fen, wname, bname, wms, bms) return game.relation = relation game.board = FICSBoard(0, 0, pgn=pgn) self.gamesImObserving[game] = wms, bms # start a new game now or after smoves self.gamemodelStartedEvents[game.gameno] = threading.Event() if no_smoves: self.emit("exGameCreated", game) self.gamemodelStartedEvents[game.gameno].wait() else: if isinstance(game, FICSHistoryGame): self.connection.client.run_command("smoves %s %s" % ( self.connection.history_owner, game.history_no)) elif isinstance(game, FICSJournalGame): self.connection.client.run_command("smoves %s %%%s" % ( self.connection.journal_owner, game.journal_no)) elif isinstance(game, FICSAdjournedGame): self.connection.client.run_command("smoves %s %s" % ( self.connection.stored_owner, game.opponent.name)) self.connection.client.run_command("forward 999") else: self.emit("boardUpdate", gameno, ply, curcol, lastmove, fen, wname, bname, wms, bms)