def start_game(request, difficulty, player_ids, data_structures): """ Creates a new game board. :param request: :param difficulty: game difficulty level :param player_ids: string of player IDs, comma seperated if more than one :param data_structures: string of data structures, comma seperated if more than one :return game board id: """ # Chosen difficulty does not exist if difficulty not in config.DIFFICULTY_LEVELS: return Response( { 'error': 'Difficulty level not found!', 'options': config.DIFFICULTY_LEVELS }, status=status.HTTP_400_BAD_REQUEST) # Convert the string fields into list. Separate by comma if provided player_ids_temp = player_ids.split(',') data_structures = data_structures.split(',') player_ids = list() for pl_id in player_ids_temp: pl_id = str(pl_id).strip() # If empty player_ids is passed if len(pl_id) == 0: random_player = 'RedPanda_' + str(uuid.uuid1())[:5] while random_player in player_ids: random_player = 'RedPanda_' + str(uuid.uuid1())[:5] player_ids.append(random_player) else: player_ids.append(pl_id) # Check if the number of players request is valid if len(player_ids) > config.LLIST_MAX_NUM_PLAYERS: return Response( { 'error': 'Too many players requested!', 'options': config.LLIST_MAX_NUM_PLAYERS }, status=status.HTTP_400_BAD_REQUEST) # Create new game board JSON (dict), and store it in the database new_board = utils.new_board(difficulty, player_ids, data_structures) response_status = utils.create_board_db(new_board) if response_status['error']: return Response({'error': response_status['reason']}, status=status.HTTP_500_INTERNAL_SERVER_ERROR) return Response({'game_id': response_status['game_id']})
def load_board(request): """ POST request API call to load in a saved game board. This API call activates the saved gave in the user's profile by moving the saved board to the list of active games. User must be authenticated, i.e. token must match with user's profile. Once the game loaded, i.e. moved to the active games, board can be interacted with using the Game Board API. User must have the claimed game board defined by the game_id. user_id: unique user identifier (same as username). token: authentication token that allow access to the user's account. game_id: ID of the saved game. :param request: POST request with fields 'user_id', 'game_id', 'token' :return: Game Board instance """ required_fields = ['user_id', 'game_id', 'token'] # Check if the post request contain the required fields if set(required_fields) != set(list(request.data.keys())): return Response({'error': str('Missing required fields!')}, status=status.HTTP_400_BAD_REQUEST) # POST Request content data = request.data if check_special_characters(str(data['user_id'])) or check_special_characters(str(data['game_id'])) \ or check_special_characters(str(data['token'])): return Response({'error': str('Unaccepted character passed!')}, status=status.HTTP_400_BAD_REQUEST) # Here check if user_id matches the token with the database if not db.check_user(data['user_id'], data['token']): return Response({'error': str('UNAUTHORIZED')}, status=status.HTTP_401_UNAUTHORIZED) # Load the game from user's saved profile game_board = db.load_board(data['user_id'], data['game_id']) if not game_board: return Response({'error': 'you got some messed up arguments (NICK)'}, status=status.HTTP_500_INTERNAL_SERVER_ERROR) game_board['game_id'] = str(uuid.uuid1()) # indicate that this board is being loaded from the profile game_board['profile_load'] = True # Here I am just going to move this board to active games using the api we already have. # Note that board is still saved on user's profile, but we are just creating a new active game. response_status = game_utils.create_board_db(game_board) if response_status['error']: return Response({'error': response_status['reason']}, status=status.HTTP_500_INTERNAL_SERVER_ERROR) active_game_id = response_status['game_id'] # Here i am just going to return the game board itself from the active games # From this point front-end can continue using the Game Board API to interact with the game response_status = game_utils.load_board_db(active_game_id) if response_status['error']: return Response({'error': response_status['reason']}, status=status.HTTP_400_BAD_REQUEST) # hide the UID used by data structure backend from user del response_status['game_board']['graph']['uid'] return Response(response_status['game_board'])