import json import hra.config as config import hra.db as db class DuplicitMakeStep(Exception): pass def game_step(game_id: int): ses = db.get_session() ses.expire_all() game = ses.query(db.Game).filter_by(game_id=game_id).with_for_update().one_or_none() assert game is not None if game.working_on_next_state: ses.commit() raise DuplicitMakeStep() game.working_on_next_state = True ses.commit() old_round_id = game.current_round new_round_id = old_round_id + 1 old_state = ses.query(db.State).filter_by(game_id=game.game_id, round=old_round_id).one_or_none() moves = [None for _ in range(game.teams_count)] for i in ses.query(db.Move).filter_by(game_id=game.game_id, round=old_round_id).all(): moves[i.team_id] = i.move ses.commit() x, points = game.get_logic().step(old_state.state, moves, old_round_id) new_state = db.State(game_id=game.game_id, round=new_round_id, state=x) ses.add(new_state) ses.expire_all() game = ses.query(db.Game).filter_by(game_id=game_id).with_for_update().one_or_none() assert game is not None assert game.working_on_next_state game.current_round = new_round_id game.working_on_next_state = False ses.commit() def game_restore_broken(game_id: int) -> None: ses = db.get_session() ses.expire_all() game = ses.query(db.Game).filter_by(game_id=game_id).with_for_update().one_or_none() game.working_on_next_state = False ses.commit()