def post(self): username = self.authenticate() # TODO: @authenticate json_object = json.loads(self.request.body) # TODO: Players optional, allows for open game lobby or bots self.validate_json_fields(['players'], json_object) players = json_object['players'] name = json_object.get('name', 'Mech AI') rounds = json_object.get('rounds', 17) map_name = json_object.get('map', 'Default') game = Game(players=players, map_name=map_name, name=name, rounds=rounds) game.transactions.append({ 'move': None, 'message': (True, 'Initial state'), 'state': game.state.jsonable, }) game_model = game_repo.persist(game) content = { 'id': game_model.key.id(), 'name': game_model.name, 'players': game_model.players, 'map_name': game_model.map_name, 'created': game_model.created.isoformat(), 'message': 'Game creation succeeded', } self.response.content_type = 'application/json' self.response.write(json.dumps(content))
def post(self): username = self.authenticate() # TODO: @authenticate json_object = json.loads(self.request.body) # TODO: Players optional, allows for open game lobby or bots self.validate_json_fields(["players"], json_object) players = json_object["players"] name = json_object.get("name", "Mech AI") rounds = json_object.get("rounds", 17) map_name = json_object.get("map", "default") game = Game(players=players, map_name=map_name, name=name, rounds=rounds) game_model = game_repo.persist(game) content = { "id": game_model.key.id(), "name": game_model.name, "players": game_model.players, "map_name": game_model.map_name, "created": game_model.created.isoformat(), "message": "Game creation succeeded", } self.response.content_type = "application/json" self.response.write(json.dumps(content))
def handle_client_message(username, game, json_object): """ Return response content given a game and a client's message. """ # TODO: Where should this live? message = json_object["message"] logging.debug("Received message <{}>".format(message)) content = {"game_id": json_object["game_id"]} # Return a dictionary if message == "join": if game.status == GAME_STATUS.lobby: logging.debug("Game in lobby") game.set_user_status(username, "joined") if game.queue.is_complete: game.status = GAME_STATUS.playing logging.debug("Game queue is complete") content["message"] = "Game started" else: logging.debug("Game gueue is incomplete") content["message"] = "Waiting for players {}".format(game.not_joined) elif game.status == GAME_STATUS.playing: logging.debug("Game in progess") content["message"] = "Game started" # Stop joining elif game.status == GAME_STATUS.complete: logging.debug("Game is complete!") content["message"] = "Game complete" else: logging.error("Unknown game status: {}".format(game.status)) elif message == "status": if game.status == GAME_STATUS.lobby: logging.debug("Game gueue is incomplete") content["message"] = "Waiting for players {}".format(game.not_joined) elif game.status == GAME_STATUS.playing: if game.queue.is_turn(username): logging.debug("It is your turn, {}".format(username)) content["message"] = "Your turn" # Tell them to make a move else: logging.debug("It is not your turn") content["message"] = "Not your turn" content["state"] = game.state.json # Return state either way elif game.status == GAME_STATUS.complete: logging.debug("Game is complete!") content["message"] = "Game complete" content["state"] = game.state.json # Return state either way else: logging.error("Unknown game status: {}".format(game.status)) elif message == "move": if game.status == GAME_STATUS.lobby: logging.debug("Game gueue is incomplete") content["message"] = "Waiting for players {}".format(game.not_joined) elif game.status == GAME_STATUS.playing: if game.queue.is_turn(username): logging.debug("Received move <{}> from player <{}>".format(json_object["move"], username)) success, reason = game.update(username, json_object["move"]) if success: content["message"] = "Move successful" else: content["message"] = "Move rejected: {}".format(reason) else: logging.debug("It is not your turn") content["message"] = "Not your turn" content["state"] = game.state.json # Return state either way elif game.status == GAME_STATUS.complete: logging.debug("Game is complete!") content["message"] = "Game complete" content["state"] = game.state.json # Return state either way else: logging.error("Unknown game status: {}".format(game.status)) else: content["message"] = "Unknown message content <{}>".format(message) logging.error("Unknown message content <{}>".format(message)) logging.debug("Persisting game...") game_repo.persist(game) # Store state to disk return content
def handle_client_message(username, game, json_object): """ Return response content given a game and a client's message. """ # TODO: Where should this live? message = json_object['message'] logging.debug('Received message <{}>'.format(message)) content = {'game_id': json_object['game_id']} # Return a dictionary if message == 'join': if game.status == GAME_STATUS.lobby: logging.debug('Game in lobby') game.queue.set_status(username, 'joined') logging.debug('Statuses: {}'.format(game.queue.statuses)) if game.queue.is_complete: game.status = GAME_STATUS.playing logging.debug('Game queue is complete') content['message'] = 'Game started' else: logging.debug('Game gueue is incomplete') content['message'] = 'Waiting for players {}'.format(', '.join(game.queue.not_joined)) elif game.status == GAME_STATUS.playing: logging.debug('Game in progess') content['message'] = 'Game started' # Stop joining elif game.status == GAME_STATUS.complete: logging.debug('Game is complete!') content['message'] = 'Game complete' else: logging.error('Unknown game status: {}'.format(game.status)) elif message == 'status': if game.status == GAME_STATUS.lobby: logging.debug('Game gueue is incomplete') content['message'] = 'Waiting for players {}'.format(', '.join(game.queue.not_joined)) elif game.status == GAME_STATUS.playing: if game.queue.is_turn(username): logging.debug('It is your turn, {}'.format(username)) content['message'] = 'Your turn' # Tell them to make a move else: logging.debug('It is not your turn') content['message'] = 'Not your turn' content['state'] = game.state.json # Return state either way elif game.status == GAME_STATUS.complete: logging.debug('Game is complete!') content['message'] = 'Game complete' else: logging.error('Unknown game status: {}'.format(game.status)) elif message == 'move': if game.status == GAME_STATUS.lobby: logging.debug('Game gueue is incomplete') content['message'] = 'Waiting for players {}'.format(', '.join(game.queue.not_joined)) elif game.status == GAME_STATUS.playing: if game.queue.is_turn(username): logging.debug('Received move <{}> from player <{}>'.format(json_object['move'], username)) success, reason = game.update(username, json_object['move']) if success: content['message'] = 'Move successful' else: content['message'] = 'Move rejected: {}'.format(reason) game.transactions.append({ 'move': json_object['move'], 'message': (success, reason), 'state': game.state.json }) else: logging.debug('It is not your turn') content['message'] = 'Not your turn' content['state'] = game.state.json # Return state either way elif game.status == GAME_STATUS.complete: logging.debug('Game is complete!') content['message'] = 'Game complete' else: logging.error('Unknown game status: {}'.format(game.status)) else: content['message'] = 'Unknown message content <{}>'.format(message) logging.error('Unknown message content <{}>'.format(message)) logging.debug('Persisting game...') game_repo.persist(game) # Store state to disk return content