diff --git a/ActionDeleteMusicRecord.py b/ActionDeleteMusicRecord.py deleted file mode 100644 index 55d5e00..0000000 --- a/ActionDeleteMusicRecord.py +++ /dev/null @@ -1,80 +0,0 @@ -# 删除成绩 - -import json -from loguru import logger - -from Static_Settings import * -from API_TitleServer import apiSDGB, calcSpecialNumber, WahlapServerBoomedError, Request500Error -from HelperLogInOut import apiLogin, apiLogout, generateTimestamp -from HelperGetUserThing import implGetUser_ -from HelperUploadUserPlayLog import apiUploadUserPlaylog -from HelperUserAll import generateFullUserAll - -def implDeleteMusicRecord(musicToBeDeleted: int, diffLevelId:int, userId: int, currentLoginTimestamp:int, currentLoginResult) -> str: - ''' - 删除成绩的实现 - 需要在外部先登录并传入登录结果 - ''' - # 上传上去的歌曲记录 - 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, musicDataToBeUploaded, currentUserData2, currentLoginResult['loginId']) - logger.debug(f"上传 UserPlayLog 结果: {currentUploadUserPlaylogApiResult}") - - # 构建并上传 UserAll - retries = 0 - while retries < 3: - currentSpecialNumber = calcSpecialNumber() - currentUserAll = generateFullUserAll(userId, currentLoginResult, currentLoginTimestamp, currentUserData2, currentSpecialNumber) - - currentUserAll['upsertUserAll']["userMusicDetailList"] = [musicDataToBeUploaded] - currentUserAll['upsertUserAll']['isNewMusicDetailList'] = "0" #0为编辑 即可删除掉成绩 - - data = json.dumps(currentUserAll) - 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 - -if __name__ == "__main__": - userId = testUid - currentLoginTimestamp = generateTimestamp() - loginResult = apiLogin(currentLoginTimestamp, userId) - - musicId = 11548 #229 is guruguru wash - levelId = 3 #3 is MASTER - - if loginResult['returnCode'] != 1: - logger.info("登录失败") - exit() - try: - logger.info(implDeleteMusicRecord(musicId, levelId, userId, currentLoginTimestamp, loginResult)) - logger.info(apiLogout(currentLoginTimestamp, userId)) - except: - logger.info(apiLogout(currentLoginTimestamp, userId)) - logger.warning("Error") diff --git a/ActionLoginBonus.py b/ActionLoginBonus.py index 8321b87..03c187a 100644 --- a/ActionLoginBonus.py +++ b/ActionLoginBonus.py @@ -76,6 +76,7 @@ def implLoginBonus(userId: int, currentLoginTimestamp:int, currentLoginResult, b currentUserAll['upsertUserAll']['isNewMusicDetailList'] = "1" currentUserAll["upsertUserAll"]["userData"][0]["dailyCourseBonusDate"] = "1970-01-01 08:00:00" # リセット + data = json.dumps(currentUserAll) diff --git a/ActionScoreRecord.py b/ActionScoreRecord.py new file mode 100644 index 0000000..3da72f9 --- /dev/null +++ b/ActionScoreRecord.py @@ -0,0 +1,71 @@ +# 删除成绩 + +import json +from loguru import logger + +from Static_Settings import * +from API_TitleServer import apiSDGB, calcSpecialNumber, WahlapServerBoomedError, Request500Error +from HelperLogInOut import apiLogin, apiLogout, generateTimestamp +from HelperGetUserThing import implGetUser_ +from HelperUploadUserPlayLog import apiUploadUserPlaylog +from HelperUserAll import generateFullUserAll +from HelperFullPlay import implFullPlayAction + +def implDeleteMusicRecord(userId: int, currentLoginTimestamp:int, currentLoginResult, musicId:int, levelId:int) -> str: + musicData= ({ + "musicId": musicId, + "level": levelId, + "playCount": 1, + "achievement": 0, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 0, + "scoreRank": 0, + "extNum1": 0 +}) + userAllPatches = { + "upsertUserAll": { + "userMusicDetailList": [musicData], + "isNewMusicDetailList": "0" # 0为编辑,即可删除掉成绩 + }} + result = implFullPlayAction(userId, currentLoginTimestamp, currentLoginResult, musicData, userAllPatches) + return result + +def implUploadMusicRecord(userId: int, currentLoginTimestamp:int, currentLoginResult, musicId:int, levelId:int, achievement:int, dxScore:int) -> str: + musicData= ({ + "musicId": musicId, + "level": levelId, + "playCount": 1, + "achievement": achievement, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": dxScore, + "scoreRank": 0, + "extNum1": 0 +}) + userAllPatches = { + "upsertUserAll": { + "userMusicDetailList": [musicData], + "isNewMusicDetailList": "1" # 0为编辑,即可删除掉成绩 + }} + result = implFullPlayAction(userId, currentLoginTimestamp, currentLoginResult, musicData, userAllPatches) + return result + +if __name__ == "__main__": + userId = testUid + currentLoginTimestamp = generateTimestamp() + loginResult = apiLogin(currentLoginTimestamp, userId) + + musicId = 852 #229 is guruguru wash + levelId = 3 #3 is MASTER + + if loginResult['returnCode'] != 1: + logger.info("登录失败") + exit() + try: + #logger.info(implDeleteMusicRecord(userId, currentLoginTimestamp, loginResult, musicId, levelId)) + logger.info(implUploadMusicRecord(userId, currentLoginTimestamp, loginResult, musicId, levelId, 1000000, 100)) + logger.info(apiLogout(currentLoginTimestamp, userId)) + finally: + logger.info(apiLogout(currentLoginTimestamp, userId)) + #logger.warning("Error") diff --git a/GenericCLI.py b/GenericCLI.py new file mode 100644 index 0000000..e69de29 diff --git a/HelperFullPlay.py b/HelperFullPlay.py new file mode 100644 index 0000000..c60dfc0 --- /dev/null +++ b/HelperFullPlay.py @@ -0,0 +1,98 @@ +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