mirror of
https://github.com/Remik1r3n/maimaiDX-Api.git
synced 2025-06-08 04:27:29 +08:00
Compare commits
2 Commits
39b8d805bf
...
7a1300bc6c
Author | SHA1 | Date | |
---|---|---|---|
|
7a1300bc6c | ||
|
da2458e7f5 |
@ -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")
|
|
@ -5,14 +5,12 @@ import json
|
|||||||
from loguru import logger
|
from loguru import logger
|
||||||
|
|
||||||
from Static_Settings import *
|
from Static_Settings import *
|
||||||
from API_TitleServer import apiSDGB, calcSpecialNumber, WahlapServerBoomedError, Request500Error
|
from API_TitleServer import apiSDGB
|
||||||
from HelperLogInOut import apiLogin, apiLogout, generateTimestamp
|
from HelperLogInOut import apiLogin, apiLogout, generateTimestamp
|
||||||
from HelperGetUserThing import implGetUser_
|
from HelperFullPlay import implFullPlayAction
|
||||||
from HelperUploadUserPlayLog import apiUploadUserPlaylog
|
|
||||||
from HelperUserAll import generateFullUserAll
|
|
||||||
|
|
||||||
def apiQueryLoginBonus(userId:int) -> str:
|
def apiQueryLoginBonus(userId:int) -> str:
|
||||||
'''ログインボーナスを取得する API リクエスター'''
|
'''ログインボーナスを取得する API Requestor'''
|
||||||
data = json.dumps({
|
data = json.dumps({
|
||||||
"userId": int(userId),
|
"userId": int(userId),
|
||||||
"nextIndex": 0,
|
"nextIndex": 0,
|
||||||
@ -20,16 +18,15 @@ def apiQueryLoginBonus(userId:int) -> str:
|
|||||||
})
|
})
|
||||||
return apiSDGB(data, "GetUserLoginBonusApi", userId)
|
return apiSDGB(data, "GetUserLoginBonusApi", userId)
|
||||||
|
|
||||||
def implLoginBonus(userId: int, currentLoginTimestamp:int, currentLoginResult, bonusGenerateMode=2):
|
def implLoginBonus(userId: int, currentLoginTimestamp:int, currentLoginResult, bonusGenerateMode=1):
|
||||||
'''
|
'''
|
||||||
ログインボーナスデータをアップロードする
|
ログインボーナスデータをアップロードする
|
||||||
bonusGenerateMode は、ログインボーナスを生成する方法を指定します。
|
bonusGenerateMode は、ログインボーナスを生成する方法を指定します。
|
||||||
0 : 何もしない、リセットのみ
|
1: 選択したボーナスのみ MAX にする(選択したボーナスはないの場合は False を返す)
|
||||||
1 : 全部 MAX にする
|
2: 全部 MAX にする
|
||||||
2 : 選択したボーナスのみ MAX にする(選択したボーナスはないの場合は False を返す)
|
|
||||||
'''
|
'''
|
||||||
musicDataToBeUploaded = {
|
musicData = {
|
||||||
"musicId": 229, #ぐるぐるWASH
|
"musicId": 674, # Magical Flavor
|
||||||
"level": 0,
|
"level": 0,
|
||||||
"playCount": 2,
|
"playCount": 2,
|
||||||
"achievement": 0,
|
"achievement": 0,
|
||||||
@ -39,11 +36,6 @@ def implLoginBonus(userId: int, currentLoginTimestamp:int, currentLoginResult, b
|
|||||||
"scoreRank": 0,
|
"scoreRank": 0,
|
||||||
"extNum1": 0
|
"extNum1": 0
|
||||||
}
|
}
|
||||||
|
|
||||||
# サーバーから UserData を取得
|
|
||||||
currentUserData = implGetUser_("Data", userId)
|
|
||||||
currentUserData2 = currentUserData['userData']
|
|
||||||
|
|
||||||
# サーバーからログインボーナスデータを取得
|
# サーバーからログインボーナスデータを取得
|
||||||
data = json.dumps({
|
data = json.dumps({
|
||||||
"userId": int(userId),
|
"userId": int(userId),
|
||||||
@ -51,60 +43,21 @@ def implLoginBonus(userId: int, currentLoginTimestamp:int, currentLoginResult, b
|
|||||||
"maxCount": 2000
|
"maxCount": 2000
|
||||||
})
|
})
|
||||||
UserLoginBonusResponse = json.loads(apiSDGB(data, "GetUserLoginBonusApi", userId))
|
UserLoginBonusResponse = json.loads(apiSDGB(data, "GetUserLoginBonusApi", userId))
|
||||||
|
# ログインボーナスリストを生成、それから処理してアップロード
|
||||||
UserLoginBonusList = UserLoginBonusResponse['userLoginBonusList']
|
UserLoginBonusList = UserLoginBonusResponse['userLoginBonusList']
|
||||||
|
|
||||||
# UserPlayLog を構築してアップロード
|
|
||||||
currentUploadUserPlaylogApiResult = apiUploadUserPlaylog(userId, musicDataToBeUploaded, currentUserData2, currentLoginResult['loginId'])
|
|
||||||
logger.debug(f"上传 UserPlayLog 结果: {currentUploadUserPlaylogApiResult}")
|
|
||||||
|
|
||||||
# ログインボーナスリストを生成
|
|
||||||
if not bonusGenerateMode == 0:
|
|
||||||
finalBonusList = generateLoginBonusList(UserLoginBonusList, bonusGenerateMode)
|
finalBonusList = generateLoginBonusList(UserLoginBonusList, bonusGenerateMode)
|
||||||
if not finalBonusList:
|
if not finalBonusList:
|
||||||
return False
|
return False #ログインボーナスを選択していないから失敗
|
||||||
|
# UserAllのパッチ
|
||||||
# UserAllを構築してアップロード
|
userAllPatches = {
|
||||||
retries = 0
|
"upsertUserAll": {
|
||||||
while retries < 3:
|
"userMusicDetailList": [musicData],
|
||||||
currentSpecialNumber = calcSpecialNumber()
|
"isNewMusicDetailList": "1", #上書きしない
|
||||||
currentUserAll = generateFullUserAll(userId, currentLoginResult, currentLoginTimestamp, currentUserData2, currentSpecialNumber)
|
"userLoginBonusList": finalBonusList,
|
||||||
|
"isNewLoginBonusList": "0" * len(finalBonusList)
|
||||||
currentUserAll['upsertUserAll']["userMusicDetailList"] = [musicDataToBeUploaded]
|
}}
|
||||||
if not bonusGenerateMode == 0:
|
result = implFullPlayAction(userId, currentLoginTimestamp, currentLoginResult, musicData, userAllPatches)
|
||||||
currentUserAll['upsertUserAll']['userLoginBonusList'] = finalBonusList
|
return result
|
||||||
currentUserAll['upsertUserAll']['isNewLoginBonusList'] = "0" * len(finalBonusList)
|
|
||||||
|
|
||||||
currentUserAll['upsertUserAll']['isNewMusicDetailList'] = "1"
|
|
||||||
currentUserAll["upsertUserAll"]["userData"][0]["dailyCourseBonusDate"] = "1970-01-01 08:00:00" # リセット
|
|
||||||
|
|
||||||
data = json.dumps(currentUserAll)
|
|
||||||
|
|
||||||
try:
|
|
||||||
currentUserAllResult = json.loads(apiSDGB(data, "UpsertUserAllApi", userId))
|
|
||||||
except Request500Error:
|
|
||||||
logger.warning("500エラーが発生しました。データを再構築します。")
|
|
||||||
retries += 1
|
|
||||||
continue
|
|
||||||
except Exception:
|
|
||||||
raise WahlapServerBoomedError("不明なエラー")
|
|
||||||
break
|
|
||||||
else:
|
|
||||||
raise Request500Error("500エラーが発生しました。UserAllをアップロードできませんでした。")
|
|
||||||
|
|
||||||
|
|
||||||
###### Debug 機能:ログインボーナスをもう一度取得(確認用)
|
|
||||||
apiLogout(currentLoginTimestamp, userId)
|
|
||||||
apiLogin(currentLoginTimestamp, userId)
|
|
||||||
data = json.dumps({
|
|
||||||
"userId": int(userId),
|
|
||||||
"nextIndex": 0,
|
|
||||||
"maxCount": 2000
|
|
||||||
})
|
|
||||||
finalLoginBonusData = json.loads(apiSDGB(data, "GetUserLoginBonusApi", userId))
|
|
||||||
return finalLoginBonusData
|
|
||||||
###### PRODUCTION 用には、上記のコードを削除してください
|
|
||||||
|
|
||||||
return currentUserAllResult
|
|
||||||
|
|
||||||
def generateLoginBonusList(UserLoginBonusList, generateMode=1):
|
def generateLoginBonusList(UserLoginBonusList, generateMode=1):
|
||||||
'''
|
'''
|
||||||
@ -194,7 +147,7 @@ if __name__ == "__main__":
|
|||||||
exit()
|
exit()
|
||||||
try:
|
try:
|
||||||
# Remember to change the mode!!!
|
# Remember to change the mode!!!
|
||||||
logger.info(implLoginBonus(userId, currentLoginTimestamp, loginResult, 0))
|
logger.info(implLoginBonus(userId, currentLoginTimestamp, loginResult, 1))
|
||||||
logger.info(apiLogout(currentLoginTimestamp, userId))
|
logger.info(apiLogout(currentLoginTimestamp, userId))
|
||||||
except:
|
except:
|
||||||
logger.info(apiLogout(currentLoginTimestamp, userId))
|
logger.info(apiLogout(currentLoginTimestamp, userId))
|
||||||
|
67
ActionScoreRecord.py
Normal file
67
ActionScoreRecord.py
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
# 删除和上传成绩
|
||||||
|
|
||||||
|
from loguru import logger
|
||||||
|
from Static_Settings import *
|
||||||
|
from HelperLogInOut import apiLogin, apiLogout, generateTimestamp
|
||||||
|
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:
|
||||||
|
'''VERY EARLY STAGE OF UPLOADING SCORES. DO NOT USE THIS FUNCTION.'''
|
||||||
|
|
||||||
|
musicData= ({
|
||||||
|
"musicId": musicId,
|
||||||
|
"level": levelId,
|
||||||
|
"playCount": 1,
|
||||||
|
"achievement": achievement,
|
||||||
|
"comboStatus": 0,
|
||||||
|
"syncStatus": 0,
|
||||||
|
"deluxscoreMax": dxScore,
|
||||||
|
"scoreRank": 0,
|
||||||
|
"extNum1": 0
|
||||||
|
})
|
||||||
|
userAllPatches = {
|
||||||
|
"upsertUserAll": {
|
||||||
|
"userMusicDetailList": [musicData],
|
||||||
|
"isNewMusicDetailList": "0" # 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")
|
@ -48,7 +48,7 @@ if __name__ == "__main__":
|
|||||||
loginResult = apiLogin(currentLoginTimestamp, userId)
|
loginResult = apiLogin(currentLoginTimestamp, userId)
|
||||||
|
|
||||||
# Change you want item ID
|
# Change you want item ID
|
||||||
wantToUnlockItemId = 11
|
wantToUnlockItemId = 11624
|
||||||
|
|
||||||
if loginResult['returnCode'] != 1:
|
if loginResult['returnCode'] != 1:
|
||||||
logger.info("登录失败")
|
logger.info("登录失败")
|
||||||
|
0
GenericCLI.py
Normal file
0
GenericCLI.py
Normal file
98
HelperFullPlay.py
Normal file
98
HelperFullPlay.py
Normal file
@ -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
|
@ -1,23 +1,13 @@
|
|||||||
# 解锁东西的一个通用的助手,不可独立使用
|
# 解锁东西的一个通用的助手,不可独立使用
|
||||||
|
|
||||||
import json
|
|
||||||
from loguru import logger
|
from loguru import logger
|
||||||
|
|
||||||
from Static_Settings import *
|
from Static_Settings import *
|
||||||
from API_TitleServer import apiSDGB, calcSpecialNumber, WahlapServerBoomedError, Request500Error
|
from HelperFullPlay import implFullPlayAction
|
||||||
from HelperGetUserThing import implGetUser_
|
|
||||||
from HelperUploadUserPlayLog import apiUploadUserPlaylog
|
|
||||||
from HelperUserAll import generateFullUserAll
|
|
||||||
|
|
||||||
def implUnlockThing(newUserItemList, userId: int, currentLoginTimestamp:int, currentLoginResult) -> str:
|
def implUnlockThing(newUserItemList, userId: int, currentLoginTimestamp:int, currentLoginResult) -> str:
|
||||||
'''
|
musicData= ({
|
||||||
解锁东西的实现
|
"musicId": 566, #天火明命
|
||||||
'''
|
|
||||||
# 上传上去的歌曲记录
|
|
||||||
musicDataToBeUploaded = ({
|
|
||||||
"musicId": 229, #洗衣机
|
|
||||||
"level": 0,
|
"level": 0,
|
||||||
"playCount": 2,
|
"playCount": 1,
|
||||||
"achievement": 0,
|
"achievement": 0,
|
||||||
"comboStatus": 0,
|
"comboStatus": 0,
|
||||||
"syncStatus": 0,
|
"syncStatus": 0,
|
||||||
@ -25,36 +15,12 @@ def implUnlockThing(newUserItemList, userId: int, currentLoginTimestamp:int, cur
|
|||||||
"scoreRank": 0,
|
"scoreRank": 0,
|
||||||
"extNum1": 0
|
"extNum1": 0
|
||||||
})
|
})
|
||||||
|
userAllPatches = {
|
||||||
currentUserData = implGetUser_("Data", userId)
|
"upsertUserAll": {
|
||||||
currentUserData2 = currentUserData['userData']
|
"userMusicDetailList": [musicData],
|
||||||
|
"isNewMusicDetailList": "1",
|
||||||
currentUploadUserPlaylogApiResult = apiUploadUserPlaylog(userId, musicDataToBeUploaded, currentUserData2, currentLoginResult['loginId'])
|
"userItemList": newUserItemList,
|
||||||
logger.debug(f"上传 UserPlayLog 结果: {currentUploadUserPlaylogApiResult}")
|
"isNewItemList": "1" * len(newUserItemList)
|
||||||
|
}}
|
||||||
retries = 0
|
result = implFullPlayAction(userId, currentLoginTimestamp, currentLoginResult, musicData, userAllPatches)
|
||||||
while retries < 3:
|
return result
|
||||||
currentSpecialNumber = calcSpecialNumber()
|
|
||||||
currentUserAll = generateFullUserAll(userId, currentLoginResult, currentLoginTimestamp, currentUserData2, currentSpecialNumber)
|
|
||||||
|
|
||||||
currentUserAll['upsertUserAll']["userMusicDetailList"] = [musicDataToBeUploaded]
|
|
||||||
currentUserAll['upsertUserAll']['isNewMusicDetailList'] = "1" # Insert mode(Not overriding)
|
|
||||||
currentUserAll['upsertUserAll']['userItemList'] = newUserItemList
|
|
||||||
|
|
||||||
currentUserAll['upsertUserAll']['isNewItemList'] = "1" * len(newUserItemList)
|
|
||||||
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:
|
|
||||||
raise Request500Error("多次尝试后仍无法成功上传 UserAll")
|
|
||||||
|
|
||||||
logger.info("解锁东西:结果:"+ str(currentUserAllResult))
|
|
||||||
return currentUserAllResult
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user