def gather_input(input_string, datatype=int, req=[], notreq=[]):
    """
    Create an input and return the users input - it will catch for invalid inputs.

    Parameters
    -----------
    input_string: :class:`str`
        This will be passed into the builtin input() function. 
    datatype: Any
        The data type to convert the input into - if it cannot be converted it will ask the user again.
    req: :class:`list`
        A list with all possible inputs and if the user input is not a match it will ask again.
        - If [], anything is allowed.
    notreq: :class:`list`
        A list with all inputs that should NOT be allowed
        - If [], nothing will happen.
    
    Returns
    -------
    Any
        The input that was received from the user. 
    """
    while True:
        try: menu = datatype(input(input_string).strip())
        except:
            print("Invalid input.")
            continue
        if req != []:
            if menu not in req:
                print("Invalid input.")
                continue
        elif notreq != []:
            if menu in notreq:
                print("Invalid input.")
                continue
        return menu