import json from loguru import logger from Static_Settings import * from API_TitleServer import apiSDGB, calcSpecialNumber, WahlapServerBoomedError, Request500Error from HelperGetUserThing import implGetUser_ from HelperUploadUserPlayLog import apiUploadUserPlaylog from HelperUserAll import generateFullUserAll def EXAMPLE_implUploadScore(userId: int, currentLoginTimestamp:int, currentLoginResult) -> str: '''示例!''' musicData= ({ "musicId": 229, "level": 2, "playCount": 1, "achievement": 0, "comboStatus": 0, "syncStatus": 0, "deluxscoreMax": 0, "scoreRank": 0, "extNum1": 0 }) userAllPatches = { "upsertUserAll": { "userMusicDetailList": [musicData], "isNewMusicDetailList": "1" # 0为编辑,即可删除掉成绩 }} result = implFullPlayAction(userId, currentLoginTimestamp, currentLoginResult, musicData, userAllPatches) return result def applyUserAllPatches(userAll, patches): """ 递归地将给定的补丁应用到用户数据的各个层次。 :param user_all: 原始用户数据 :param patches: 包含所有patch的字典 """ for key, value in patches.items(): if isinstance(value, dict) and key in userAll and isinstance(userAll[key], dict): # 如果patch的值是字典,并且userAll中对应的key也是字典,递归处理 applyUserAllPatches(userAll[key], value) else: # 否则直接更新或添加key userAll[key] = value def implFullPlayAction(userId: int, currentLoginTimestamp:int, currentLoginResult, musicData, userAllPatches) -> str: ''' 一份完整的上机实现,可以打 patch 来实现各种功能 需要在外部先登录并传入登录结果 ''' # 上传上去的歌曲记录 # musicDataToBeUploaded = ({ # "musicId": musicToBeDeleted, # "level": diffLevelId, # "playCount": 1, # "achievement": 0, # "comboStatus": 0, # "syncStatus": 0, # "deluxscoreMax": 0, # "scoreRank": 0, # "extNum1": 0 #}) # 取得 UserData currentUserData = implGetUser_("Data", userId) currentUserData2 = currentUserData['userData'] # 构建并上传一个游玩记录 currentUploadUserPlaylogApiResult = apiUploadUserPlaylog(userId, musicData, currentUserData2, currentLoginResult['loginId']) logger.debug(f"上传 UserPlayLog 结果: {currentUploadUserPlaylogApiResult}") # 构建并上传 UserAll retries = 0 while retries < 3: # 计算一个特殊数 currentSpecialNumber = calcSpecialNumber() # 生成出 UserAll currentUserAll = generateFullUserAll(userId, currentLoginResult, currentLoginTimestamp, currentUserData2, currentSpecialNumber) # 应用参数里的补丁 applyUserAllPatches(currentUserAll, userAllPatches) # 建构 Json 数据 data = json.dumps(currentUserAll) # 开始上传 UserAll try: currentUserAllResult = json.loads(apiSDGB(data, "UpsertUserAllApi", userId)) except Request500Error: logger.warning("500 Error Triggered. Rebuilding data.") retries += 1 continue except Exception: raise WahlapServerBoomedError("邪门错误") # 成功上传后退出循环 break else: # 重试次数超过3次 raise Request500Error("多次尝试后仍无法成功上传 UserAll") logger.info("上机:结果:"+ str(currentUserAllResult)) return currentUserAllResult