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.", ), )
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
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]))
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)
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])
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])
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]))
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]))
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)
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)
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])
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)
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]))
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))
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))
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))
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.", ), )
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)