예제 #1
0
def authorize(db, request):
    if request.headers.get("X-API-KEY"):
        request_uuid = request.headers.get("X-API-KEY")
    elif request.args.get("api_key"):
        request_uuid = request.args.get("api_key")
    else:
        abort(
            401,
            description=error_response(
                "Failed to validate UUID.",
                "UUID is either missing or invalid; or, unspecified server occured.",
            ),
        )

    try:
        auth_check = query_db("SELECT * FROM " + db + " WHERE key = ?",
                              [request_uuid],
                              one=True)
        if auth_check is None:
            abort(
                401,
                description=error_response(
                    "Failed to validate UUID.",
                    "UUID is either missing or invalid; or, unspecified server occured.",
                ),
            )
    except Exception:
        abort(
            401,
            description=error_response(
                "Failed to validate UUID.",
                "UUID is either missing or invalid; or, unspecified server occured.",
            ),
        )
예제 #2
0
def between_version(minimum, maximum):
    version = request.headers.get("Accept-Version", "latest")
    if version == "latest":
        return maximum is None
    version_match = re.match(r"^(\d+)(?:\.(\d+)(?:\.(\d+))?)?$", version)
    minimum_match = re.match(r"^(\d+)(?:\.(\d+)(?:\.(\d+))?)?$", minimum or "")
    maximum_match = re.match(r"^(\d+)(?:\.(\d+)(?:\.(\d+))?)?$", maximum or "")
    if version_match is None:
        abort(
            400,
            description=error_response(
                "Invalid header arguments",
                "Accept-Version must be `#`, `#.#`, `#.#.#`, or latest. (defaults to latest, if not supplied)",
            ),
        )
    elif minimum is not None and minimum_match is None:
        abort(
            500,
            description=error_response(
                "Error while checking Accept-Version",
                "Minimum version must be `#`, `#.#`, or `#.#.#`",
            ),
        )
    elif maximum is not None and maximum_match is None:
        abort(
            500,
            description=error_response(
                "Error while checking Accept-Version",
                "Maximum version must be `#`, `#.#`, or `#.#.#`",
            ),
        )
    else:
        version_numbers = version_match.groups()
        minimum_numbers = minimum_match.groups() if minimum is not None else (
            "0", "0", "0")
        maximum_numbers = maximum_match.groups() if maximum is not None else (
            "999", "999", "999")
        for version_number, minimum_number, maximum_number in zip(
                version_numbers, minimum_numbers, maximum_numbers):
            if maximum_number is None:
                return True
            if minimum_number is None:
                return True
            if version_number is None:
                return True
            if int(version_number) < int(minimum_number):
                return False
            if int(version_number) > int(maximum_number):
                return False
        return True
예제 #3
0
def get_nh_item(item):
    authorize(DB_KEYS, request)

    item = requests.utils.unquote(item).replace("_", " ")
    limit = "1"
    tables = "nh_item"
    fields = "_pageName=url,en_name=name,image_url,stack,hha_base,buy1_price,buy1_currency,sell,is_fence,material_type,material_seasonality,material_sort,material_name_sort,material_seasonality_sort,edible,plant_type,availability1,availability1_note,availability2,availability2_note,availability3,availability3_note,version_added,unlocked,notes"
    where = f'en_name="{item}"'
    params = {
        "action": "cargoquery",
        "format": "json",
        "tables": tables,
        "fields": fields,
        "where": where,
        "limit": limit,
    }

    cargo_results = call_cargo(params, request.args)
    if len(cargo_results) == 0:
        abort(
            404,
            description=error_response(
                "No data was found for the given query.",
                f"MediaWiki Cargo request succeeded by nothing was returned for the parameters: {params}",
            ),
        )
    else:
        return jsonify(format_other_item(cargo_results[0]))
예제 #4
0
def get_nh_photo_all():
    authorize(DB_KEYS, request)

    if "thumbsize" in request.args:
        abort(
            400,
            description=error_response(
                "Invalid arguments",
                "Cannot have thumbsize in a group item request"),
        )

    photo_limit = "900"
    photo_tables = "nh_photo"
    photo_fields = "_pageName=url,en_name=name,category,hha_base,buy1_price,buy1_currency,buy2_price,buy2_currency,sell,availability1,availability1_note,availability2,availability2_note,customizable,custom_kits,custom_body_part,grid_size,interactable,version_added,unlocked"
    variation_limit = "3700"
    variation_tables = "nh_photo_variation"
    variation_fields = "en_name=name,variation,image_url,color1,color2"
    variation_orderby = "variation_number"

    photo_list = get_photo_list(photo_limit, photo_tables, photo_fields)
    variation_list = get_variation_list(variation_limit, variation_tables,
                                        variation_fields, variation_orderby)
    stitched = stitch_variation_list(photo_list, variation_list)

    if request.args.get("excludedetails") == "true":
        return jsonify([_["name"] for _ in stitched])
    else:
        return jsonify(stitched)
예제 #5
0
def get_nh_fossil_group(name):
    authorize(DB_KEYS, request)

    limit = "1"
    tables = "nh_fossil_group"
    fields = "name,_pageName=url,room,description"
    where = f'name = "{name}"'

    params = {
        "action": "cargoquery",
        "format": "json",
        "limit": limit,
        "tables": tables,
        "fields": fields,
        "where": where,
    }

    cargo_results = call_cargo(params, request.args)

    if not cargo_results:
        abort(
            404,
            description=error_response(
                "No data was found for the given query.",
                "MediaWiki Cargo request succeeded by nothing was returned for the parameters: {}"
                .format(params),
            ),
        )
    else:
        return format_fossil_group(cargo_results[0])
예제 #6
0
def get_nh_fossil_individual(name):
    authorize(DB_KEYS, request)

    name = requests.utils.unquote(name).replace("_", " ")
    limit = "1"
    tables = "nh_fossil"
    fields = "name,_pageName=url,image_url,fossil_group,interactable,sell,color1,color2,hha_base,width,length"
    where = f'name = "{name}"'

    params = {
        "action": "cargoquery",
        "format": "json",
        "limit": limit,
        "tables": tables,
        "fields": fields,
        "where": where,
    }

    cargo_results = call_cargo(params, request.args)

    if not cargo_results:
        abort(
            404,
            description=error_response(
                "No data was found for the given query.",
                "MediaWiki Cargo request succeeded by nothing was returned for the parameters: {}"
                .format(params),
            ),
        )
    else:
        return format_fossil(cargo_results[0])
예제 #7
0
def get_nh_art(art):
    authorize(DB_KEYS, request)

    art = requests.utils.unquote(art).replace("_", " ")
    limit = "1"
    tables = "nh_art"
    fields = "name,_pageName=url,image_url,has_fake,fake_image_url,art_name,author,year,art_style,description,buy_price=buy,sell,availability,authenticity,width,length"
    where = f'name="{art}"'
    params = {
        "action": "cargoquery",
        "format": "json",
        "tables": tables,
        "fields": fields,
        "where": where,
        "limit": limit,
    }

    cargo_results = call_cargo(params, request.args)
    if cargo_results == []:
        abort(
            404,
            description=error_response(
                "No data was found for the given query.",
                f"MediaWiki Cargo request succeeded by nothing was returned for the parameters: {params}",
            ),
        )
    else:
        return jsonify(format_art(cargo_results[0]))
예제 #8
0
def get_nh_recipe(recipe):
    authorize(DB_KEYS, request)

    recipe = recipe.replace("_", " ")
    limit = "1"
    tables = "nh_recipe"
    fields = "_pageName=url,en_name=name,image_url,serial_id,buy1_price,buy1_currency,buy2_price,buy2_currency,sell,recipes_to_unlock,diy_availability1,diy_availability1_note,diy_availability2,diy_availability2_note,material1,material1_num,material2,material2_num,material3,material3_num,material4,material4_num,material5,material5_num,material6,material6_num"
    where = f'en_name="{recipe}"'
    params = {
        "action": "cargoquery",
        "format": "json",
        "tables": tables,
        "fields": fields,
        "where": where,
        "limit": limit,
    }

    cargo_results = call_cargo(params, request.args)
    if len(cargo_results) == 0:
        abort(
            404,
            description=error_response(
                "No data was found for the given query.",
                f"MediaWiki Cargo request succeeded by nothing was returned for the parameters: {params}",
            ),
        )
    else:
        return jsonify(format_recipe(cargo_results[0]))
예제 #9
0
def get_nh_tool_all():
    authorize(DB_KEYS, request)

    if "thumbsize" in request.args:
        abort(
            400,
            description=error_response(
                "Invalid arguments", "Cannot have thumbsize in a group item request"
            ),
        )

    tool_limit = "150"
    tool_tables = "nh_tool"
    tool_fields = "_pageName=url,en_name=name,uses,hha_base,buy1_price,buy1_currency,buy2_price,buy2_currency,sell,availability1,availability1_note,availability2,availability2_note,availability3,availability3_note,customizable,custom_kits,custom_body_part,version_added,unlocked,notes"
    variation_limit = "300"
    variation_tables = "nh_tool_variation"
    variation_fields = "en_name=name,variation,image_url"
    variation_orderby = "variation_number"

    tool_list = get_tool_list(tool_limit, tool_tables, tool_fields)
    variation_list = get_variation_list(
        variation_limit, variation_tables, variation_fields, variation_orderby
    )
    stitched = stitch_variation_list(tool_list, variation_list)

    if request.args.get("excludedetails") == "true":
        return jsonify([_["name"] for _ in stitched])
    else:
        return jsonify(stitched)
예제 #10
0
def get_nh_furniture_all():
    authorize(DB_KEYS, request)

    if "thumbsize" in request.args:
        abort(
            400,
            description=error_response(
                "Invalid arguments",
                "Cannot have thumbsize in a group item request"),
        )

    furniture_limit = "1300"
    furniture_tables = "nh_furniture"
    furniture_fields = "_pageName=url,en_name=name,category,item_series,item_set,theme1,theme2,hha_category,tag,hha_base,lucky,lucky_season,function1,function2,buy1_price,buy1_currency,buy2_price,buy2_currency,sell,availability1,availability1_note,availability2,availability2_note,availability3,availability3_note,variation_total,pattern_total,customizable,custom_kits,custom_kit_type,custom_body_part,custom_pattern_part,grid_size,height,door_decor,version_added,unlocked,notes"  #'
    variation_limit = "6000"
    variation_tables = "nh_furniture_variation"
    variation_fields = "en_name=name,variation,pattern,image_url,color1,color2"
    variation_orderby = "variation_number,pattern_number"

    furniture_list = get_furniture_list(furniture_limit, furniture_tables,
                                        furniture_fields)
    variation_list = get_furniture_variation_list(variation_limit,
                                                  variation_tables,
                                                  variation_fields,
                                                  variation_orderby)
    stitched = stitch_variation_list(furniture_list, variation_list)

    if request.args.get("excludedetails") == "true":
        return jsonify([_["name"] for _ in stitched])
    else:
        return jsonify(stitched)
예제 #11
0
def get_nh_sea(sea):
    authorize(DB_KEYS, request)

    sea = requests.utils.unquote(sea).replace("_", " ")
    limit = "1"
    tables = "nh_sea_creature"
    fields = "name,_pageName=url,number,image_url,render_url,catchphrase,catchphrase2,shadow_size,shadow_movement,rarity,total_catch,sell_nook,tank_width,tank_length,time,time_n_availability=time_n_months,time_s_availability=time_s_months,time2,time2_n_availability=time2_n_months,time2_s_availability=time2_s_months,n_availability,n_m1,n_m2,n_m3,n_m4,n_m5,n_m6,n_m7,n_m8,n_m9,n_m10,n_m11,n_m12,n_m1_time,n_m2_time,n_m3_time,n_m4_time,n_m5_time,n_m6_time,n_m7_time,n_m8_time,n_m9_time,n_m10_time,n_m11_time,n_m12_time,s_availability,s_m1,s_m2,s_m3,s_m4,s_m5,s_m6,s_m7,s_m8,s_m9,s_m10,s_m11,s_m12,s_m1_time,s_m2_time,s_m3_time,s_m4_time,s_m5_time,s_m6_time,s_m7_time,s_m8_time,s_m9_time,s_m10_time,s_m11_time,s_m12_time"
    where = 'name="' + sea + '"'
    params = {
        "action": "cargoquery",
        "format": "json",
        "tables": tables,
        "fields": fields,
        "where": where,
        "limit": limit,
    }

    cargo_results = call_cargo(params, request.args)
    if cargo_results == []:
        abort(
            404,
            description=error_response(
                "No data was found for the given query.",
                "MediaWiki Cargo request succeeded by nothing was returned for the parameters: {}"
                .format(params),
            ),
        )
    else:
        if exact_version("1.0"):
            return jsonify(months_to_array(format_critters(cargo_results)))
        else:
            return jsonify(months_to_array(format_critters(cargo_results))[0])
예제 #12
0
def get_nh_clothing_all():
    authorize(DB_KEYS, request)

    if "thumbsize" in request.args:
        abort(
            400,
            description=error_response(
                "Invalid arguments", "Cannot have thumbsize in a group item request"
            ),
        )

    clothing_limit = "1350"
    clothing_tables = "nh_clothing"
    clothing_fields = "_pageName=url,en_name=name,category,style1,style2,label1,label2,label3,label4,label5,buy1_price,buy1_currency,buy2_price,buy2_currency,sell,availability1,availability1_note,availability2,availability2_note,variation_total,vill_equip,seasonality,version_added,unlocked,notes"
    variation_limit = "5000"
    variation_tables = "nh_clothing_variation"
    variation_fields = "en_name=name,variation,image_url,color1,color2"
    variation_orderby = "variation_number"

    clothing_list = get_clothing_list(clothing_limit, clothing_tables, clothing_fields)
    variation_list = get_variation_list(
        variation_limit, variation_tables, variation_fields, variation_orderby
    )
    stitched = stitch_variation_list(clothing_list, variation_list)

    if request.args.get("excludedetails") == "true":
        return jsonify([_["name"] for _ in stitched])
    else:
        return jsonify(stitched)
예제 #13
0
def get_nh_interior(interior):
    authorize(DB_KEYS, request)

    interior = requests.utils.unquote(interior).replace("_", " ")
    limit = "1"
    tables = "nh_interior"
    fields = "_pageName=url,en_name=name,image_url,category,item_series,item_set,theme1,theme2,hha_category,tag,hha_base,buy1_price,buy1_currency,buy2_price,buy2_currency,sell,availability1,availability1_note,availability2,availability2_note,grid_size,color1,color2,version_added,unlocked,notes"
    where = f'en_name="{interior}"'
    params = {
        "action": "cargoquery",
        "format": "json",
        "tables": tables,
        "fields": fields,
        "where": where,
        "limit": limit,
    }

    cargo_results = call_cargo(params, request.args)
    if len(cargo_results) == 0:
        abort(
            404,
            description=error_response(
                "No data was found for the given query.",
                f"MediaWiki Cargo request succeeded by nothing was returned for the parameters: {params}",
            ),
        )
    else:
        return jsonify(format_interior(cargo_results[0]))
예제 #14
0
def get_nh_clothing(clothing):
    authorize(DB_KEYS, request)

    clothing = requests.utils.unquote(clothing).replace("_", " ")
    clothing_limit = "1"
    clothing_tables = "nh_clothing"
    clothing_fields = "_pageName=url,en_name=name,category,style1,style2,label1,label2,label3,label4,label5,buy1_price,buy1_currency,buy2_price,buy2_currency,sell,availability1,availability1_note,availability2,availability2_note,variation_total,vill_equip,seasonality,version_added,unlocked,notes"
    clothing_where = f'en_name = "{clothing}"'
    clothing_params = {
        "action": "cargoquery",
        "format": "json",
        "tables": clothing_tables,
        "fields": clothing_fields,
        "where": clothing_where,
        "limit": clothing_limit,
    }
    variation_limit = "10"
    variation_tables = "nh_clothing_variation"
    variation_fields = "en_name=name,variation,image_url,color1,color2"
    variation_where = f'en_name = "{clothing}"'
    variation_orderby = "variation_number"
    variation_params = {
        "action": "cargoquery",
        "format": "json",
        "tables": variation_tables,
        "fields": variation_fields,
        "where": variation_where,
        "order_by": variation_orderby,
        "limit": variation_limit,
    }

    cargo_results = call_cargo(clothing_params, request.args)
    if len(cargo_results) == 0:
        abort(
            404,
            description=error_response(
                "No data was found for the given query.",
                f"MediaWiki Cargo request succeeded by nothing was returned for the parameters: {clothing_params}",
            ),
        )
    else:
        piece = format_clothing(cargo_results[0])
        variations = call_cargo(variation_params, request.args)
        return jsonify(stitch_variation(piece, variations))
예제 #15
0
def get_nh_furniture(furniture):
    authorize(DB_KEYS, request)

    furniture = requests.utils.unquote(furniture).replace("_", " ")
    furniture_limit = "1"
    furniture_tables = "nh_furniture"
    furniture_fields = "_pageName=url,en_name=name,category,item_series,item_set,theme1,theme2,hha_category,tag,hha_base,lucky,lucky_season,function1,function2,buy1_price,buy1_currency,buy2_price,buy2_currency,sell,availability1,availability1_note,availability2,availability2_note,availability3,availability3_note,variation_total,pattern_total,customizable,custom_kits,custom_kit_type,custom_body_part,custom_pattern_part,grid_size,height,door_decor,version_added,unlocked,notes"  #'
    furniture_where = f'en_name = "{furniture}"'
    furniture_params = {
        "action": "cargoquery",
        "format": "json",
        "tables": furniture_tables,
        "fields": furniture_fields,
        "where": furniture_where,
        "limit": furniture_limit,
    }
    variation_limit = "70"
    variation_tables = "nh_furniture_variation"
    variation_fields = "en_name=name,variation,pattern,image_url,color1,color2"
    variation_where = f'en_name = "{furniture}"'
    variation_orderby = "variation_number,pattern_number"
    variation_params = {
        "action": "cargoquery",
        "format": "json",
        "tables": variation_tables,
        "fields": variation_fields,
        "where": variation_where,
        "order_by": variation_orderby,
        "limit": variation_limit,
    }

    cargo_results = call_cargo(furniture_params, request.args)
    if len(cargo_results) == 0:
        abort(
            404,
            description=error_response(
                "No data was found for the given query.",
                f"MediaWiki Cargo request succeeded by nothing was returned for the parameters: {furniture_params}",
            ),
        )
    else:
        piece = format_furniture(cargo_results[0])
        variations = call_cargo(variation_params, request.args)
        return jsonify(stitch_variation(piece, variations))
예제 #16
0
def get_nh_tool(tool):
    authorize(DB_KEYS, request)

    tool = requests.utils.unquote(tool).replace("_", " ")
    tool_limit = "1"
    tool_tables = "nh_tool"
    tool_fields = "_pageName=url,en_name=name,uses,hha_base,buy1_price,buy1_currency,buy2_price,buy2_currency,sell,availability1,availability1_note,availability2,availability2_note,availability3,availability3_note,customizable,custom_kits,custom_body_part,version_added,unlocked,notes"
    tool_where = f'en_name = "{tool}"'
    tool_params = {
        "action": "cargoquery",
        "format": "json",
        "tables": tool_tables,
        "fields": tool_fields,
        "where": tool_where,
        "limit": tool_limit,
    }
    variation_limit = "10"
    variation_tables = "nh_tool_variation"
    variation_fields = "en_name=name,variation,image_url"
    variation_where = f'en_name = "{tool}"'
    variation_orderby = "variation_number"
    variation_params = {
        "action": "cargoquery",
        "format": "json",
        "tables": variation_tables,
        "fields": variation_fields,
        "where": variation_where,
        "order_by": variation_orderby,
        "limit": variation_limit,
    }

    cargo_results = call_cargo(tool_params, request.args)
    if len(cargo_results) == 0:
        abort(
            404,
            description=error_response(
                "No data was found for the given query.",
                f"MediaWiki Cargo request succeeded by nothing was returned for the parameters: {tool_params}",
            ),
        )
    else:
        piece = format_tool(cargo_results[0])
        variations = call_cargo(variation_params, request.args)
        return jsonify(stitch_variation(piece, variations))
예제 #17
0
def generate_key():
    authorize(DB_ADMIN_KEYS, request)

    try:
        new_uuid = str(uuid.uuid4())
        email = ""
        if "email" in request.form:
            email = str(request.form["email"])
        project = ""
        if "project" in request.form:
            project = str(request.form["project"])
        db.insert_db("INSERT INTO " + DB_KEYS + ' VALUES("' + new_uuid +
                     '","' + email + '","' + project + '")')
        return jsonify({"uuid": new_uuid, "email": email, "project": project})
    except:
        abort(
            500,
            description=error_response(
                "Failed to create new client UUID.",
                "UUID generation, or UUID insertion into keys table, failed.",
            ),
        )
예제 #18
0
def get_nh_fossil_all(name):
    authorize(DB_KEYS, request)

    name = requests.utils.unquote(name).replace("_", " ")

    group_limit = "1"
    group_tables = "nh_fossil_group"
    group_fields = "name,_pageName=url,room,description"

    # fossil_fields = "name,_pageName=url,image_url,fossil_group,interactable,sell,color1,color2,hha_base,width,length"

    fossil_params = {
        "action": "cargoquery",
        "format": "json",
        "limit": "1",
        "tables": "nh_fossil",
        "fields": "name,fossil_group",
        "where": f'name = "{name}"',
    }

    group_params = {
        "action": "cargoquery",
        "format": "json",
        "limit": "1",
        "tables": "nh_fossil_group",
        "fields": "name,_pageName=url,room,description",
    }

    fossil_check = call_cargo(fossil_params, request.args)
    if fossil_check:
        fossil_check = fossil_check[0]
        group_params["where"] = f'name = "{fossil_check["fossil_group"]}"'
        matched = {"type": "individual", "name": fossil_check["name"]}
    else:
        fossil_check = None
        group_params["where"] = f'name = "{name}"'
        matched = {"type": "group"}

    group = call_cargo(group_params, request.args)
    if group:
        group = format_fossil_group(group[0])
        if not fossil_check:
            matched["name"] = group["name"]
        group["matched"] = matched
    else:
        abort(
            404,
            description=error_response(
                "No data was found for the given query.",
                "MediaWiki Cargo request succeeded by nothing was returned for the parameters: {}"
                .format(group_params),
            ),
        )

    fossil_params["where"] = f'fossil_group = "{group["name"]}"'
    fossil_params["limit"] = "10"
    fossil_params[
        "fields"] = "name,_pageName=url,image_url,fossil_group,interactable,sell,color1,color2,hha_base,width,length"
    #          Technically don't need this ^^^ but it syncs the /all and /all/name caches
    fossils = call_cargo(fossil_params, request.args)
    group["fossils"] = [format_fossil(_) for _ in fossils]
    for fossil in group["fossils"]:
        del fossil["fossil_group"]

    return jsonify(group)