Exemple #1
0
    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))
Exemple #2
0
    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))
Exemple #3
0
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
Exemple #4
0
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