Files
SDGB-API/HelperFullPlay.py
2025-10-13 18:15:05 +08:00

71 lines
2.6 KiB
Python

import rapidjson as json
from loguru import logger
from Config import *
from API_TitleServer import *
from HelperGetUserThing import implGetUser_
from HelperUploadUserPlayLog import apiUploadUserPlaylog
from HelperUserAll import generateFullUserAll
def generateMusicData():
return {
"musicId": 0,
"level": 0,
"playCount": 0,
"achievement": 0,
"comboStatus": 0,
"syncStatus": 0,
"deluxscoreMax": 0,
"scoreRank": 0,
"extNum1": 0
}
def applyUserAllPatches(userAll, patches):
for key, value in patches.items():
if isinstance(value, dict) and key in userAll and isinstance(userAll[key], dict):
applyUserAllPatches(userAll[key], value)
elif isinstance(value, list) and key in userAll and isinstance(userAll[key], list):
for i, patch_item in enumerate(value):
if i < len(userAll[key]) and isinstance(patch_item, dict) and isinstance(userAll[key][i], dict):
applyUserAllPatches(userAll[key][i], patch_item)
elif i >= len(userAll[key]):
userAll[key].append(patch_item)
else:
userAll[key] = value
def implFullPlayAction(userId: int, currentLoginTimestamp:int, currentLoginResult, musicData, userAllPatches, debugMode=False):
currentUserData = implGetUser_("Data", userId)
currentUserData2 = currentUserData['userData']
currentUploadUserPlaylogApiResult = apiUploadUserPlaylog(userId, musicData, currentUserData2, currentLoginResult['loginId'])
logger.debug(f"上传 UserPlayLog 结果: {currentUploadUserPlaylogApiResult}")
retries = 0
while retries < 3:
currentPlaySpecial = calcPlaySpecial()
currentUserAll = generateFullUserAll(userId, currentLoginResult, currentLoginTimestamp, currentUserData2, currentPlaySpecial)
applyUserAllPatches(currentUserAll, userAllPatches)
if debugMode:
logger.debug("调试模式:构建出的 UserAll 数据:" + json.dumps(currentUserAll, indent=4))
logger.info("Bye!")
return
data = json.dumps(currentUserAll)
try:
currentUserAllResult = json.loads(apiSDGB(data, "UpsertUserAllApi", userId))
except SDGBRequestError:
logger.warning("上传 UserAll 出现 500. 重建数据.")
retries += 1
continue
except Exception:
raise SDGBApiError("邪门错误")
break
else:
raise SDGBRequestError
logger.info("上机:结果:"+ str(currentUserAllResult))
return currentUserAllResult