import time from tinydb import Query, where from fastapi import APIRouter, Request, Response from core_common import core_process_request, core_prepare_response, E from core_database import get_db router = APIRouter(prefix="/local2", tags=["local2"]) router.model_whitelist = ["LDJ"] def get_profile(iidx_id): return get_db().table("iidx_profile").get(where("iidx_id") == iidx_id) @router.post("/{gameinfo}/IIDX29grade/raised") async def iidx29grade_raised(request: Request): request_info = await core_process_request(request) game_version = request_info["game_version"] timestamp = time.time() iidx_id = int(request_info["root"][0].attrib["iidxid"]) achi = int(request_info["root"][0].attrib["achi"]) cstage = int(request_info["root"][0].attrib["cstage"]) gid = int(request_info["root"][0].attrib["gid"]) gtype = int(request_info["root"][0].attrib["gtype"]) is_ex = int(request_info["root"][0].attrib["is_ex"]) is_mirror = int(request_info["root"][0].attrib["is_mirror"]) db = get_db() db.table("iidx_class").insert( { "timestamp": timestamp, "game_version": game_version, "iidx_id": iidx_id, "achi": achi, "cstage": cstage, "gid": gid, "gtype": gtype, "is_ex": is_ex, "is_mirror": is_mirror, }, ) profile = get_profile(iidx_id) game_profile = profile["version"].get(str(game_version), {}) best_class = db.table("iidx_class_best").get( (where("iidx_id") == iidx_id) & (where("game_version") == game_version) & (where("gid") == gid) & (where("gtype") == gtype) ) best_class = {} if best_class is None else best_class best_class_data = { "game_version": game_version, "iidx_id": iidx_id, "achi": max(achi, best_class.get("achi", achi)), "cstage": max(cstage, best_class.get("cstage", cstage)), "gid": gid, "gtype": gtype, "is_ex": is_ex, "is_mirror": is_mirror, } db.table("iidx_class_best").upsert( best_class_data, (where("iidx_id") == iidx_id) & (where("game_version") == game_version) & (where("gid") == gid) & (where("gtype") == gtype), ) best_class_plays = db.table("iidx_class_best").search( (where("game_version") == game_version) & (where("iidx_id") == iidx_id) ) grades = [] for record in best_class_plays: grades.append( [record["gtype"], record["gid"], record["cstage"], record["achi"]] ) game_profile["grade_values"] = grades grade_sp = db.table("iidx_class_best").search( (where("iidx_id") == iidx_id) & (where("gtype") == 0) & (where("cstage") == 4) ) game_profile["grade_single"] = max([x["gid"] for x in grade_sp], default=-1) grade_dp = db.table("iidx_class_best").search( (where("iidx_id") == iidx_id) & (where("gtype") == 1) & (where("cstage") == 4) ) game_profile["grade_double"] = max([x["gid"] for x in grade_dp], default=-1) profile["version"][str(game_version)] = game_profile db.table("iidx_profile").upsert(profile, where("game_version") == game_version) response = E.response(E.IIDX29grade(pnum=1)) response_body, response_headers = await core_prepare_response(request, response) return Response(content=response_body, headers=response_headers)