From dcd8a013bc8b405d1ccd37550e201a171ad7e657 Mon Sep 17 00:00:00 2001 From: drmext <71258889+drmext@users.noreply.github.com> Date: Tue, 4 Oct 2022 08:12:43 +0000 Subject: [PATCH] Fix slow loading and Area/Machine scores --- modules/ddr/playerdata.py | 233 ++++++++++++++++++++++------------ modules/ddr/playerdata_2.py | 244 +++++++++++++++++++++++++----------- 2 files changed, 318 insertions(+), 159 deletions(-) diff --git a/modules/ddr/playerdata.py b/modules/ddr/playerdata.py index 5a36e81..a8a01ff 100644 --- a/modules/ddr/playerdata.py +++ b/modules/ddr/playerdata.py @@ -40,17 +40,22 @@ def get_common(ddr_id, game_version, idx): async def usergamedata_advanced(request: Request): request_info = await core_process_request(request) game_version = request_info['game_version'] + is_omni = True if request_info['rev'] == 'O' else False response = None - mode = request_info['root'][0].find('data/mode').text - refid = request_info['root'][0].find('data/refid').text + data = request_info['root'][0].find('data') + mode = data.find('mode').text + gamesession = data.find('gamesession').text + refid = data.find('refid').text + + default = 'X0000000000000000000000000000000'[:-len(gamesession)]+gamesession db = get_db() all_profiles_for_card = db.table('ddr_profile').get(Query().card == refid) if mode == 'usernew': - shoparea = request_info['root'][0].find('data/shoparea').text + shoparea = data.find('shoparea').text if 'ddr_id' not in all_profiles_for_card: ddr_id = random.randint(10000000, 99999999) @@ -68,6 +73,8 @@ async def usergamedata_advanced(request: Request): 'rival_1_ddr_id': 0, 'rival_2_ddr_id': 0, 'rival_3_ddr_id': 0, + 'single_grade': 0, + 'double_grade': 0, } db.table('ddr_profile').upsert(all_profiles_for_card, where('card') == refid) @@ -81,31 +88,21 @@ async def usergamedata_advanced(request: Request): ) ) - if mode == 'userload': - single_grade = 0 - double_grade = 0 + elif mode == 'userload' and refid != default: all_scores = {} if all_profiles_for_card is not None: ddr_id = all_profiles_for_card['ddr_id'] profile = get_game_profile(refid, game_version) + single_grade = profile.get('single_grade', 0) double_grade = profile.get('double_grade', 0) - for record in db.table('ddr_scores_best').search(where('game_version') == game_version): - mcode = str(record['mcode']) - if mcode not in all_scores.keys(): - scores = [] - for difficulty in range(10): - s = db.table('ddr_scores_best').get( - (where('ddr_id') == ddr_id) - & (where('game_version') == game_version) - & (where('mcode') == int(mcode)) - & (where('difficulty') == difficulty) - ) - if s == None: - scores.append([0, 0, 0, 0, 0]) - else: - scores.append([1, s['rank'], s['lamp'], s['score'], s['ghostid']]) - all_scores[mcode] = scores + + for record in db.table('ddr_scores_best').search((where('game_version') == game_version)& (where('ddr_id') == ddr_id)): + mcode = record['mcode'] + difficulty = record['difficulty'] + if mcode not in all_scores: + all_scores[mcode] = [[0, 0, 0, 0, 0] for x in range(10)] + all_scores[mcode][difficulty] = ([1, record['rank'], record['lamp'], record['score'], record['ghostid']]) response = E.response( E.playerdata( @@ -174,13 +171,31 @@ async def usergamedata_advanced(request: Request): ) ) - if mode == 'usersave': - timestamp = time.time() + elif mode == 'ghostload': + ghostid = int(data.find('ghostid').text) + record = db.table('ddr_scores').get(doc_id=ghostid) - data = request_info['root'][0].find('data') + response = E.response( + E.playerdata( + E.result(0, __type="s32"), + E.ghostdata( + E.code(record['ddr_id'], __type="s32"), + E.mcode(record['mcode'], __type="u32"), + E.notetype(record['difficulty'], __type="u8"), + E.ghostsize(record['ghostsize'], __type="s32"), + E.ghost(record['ghost'], __type="string"), + ) + ) + ) + + elif mode == 'usersave' and refid != default: + timestamp = time.time() ddr_id = int(data.find('ddrcode').text) playstyle = int(data.find('playstyle').text) + pcbid = data.find('pcbid').text + shoparea = data.find('shoparea').text + note = data.findall('note') if int(data.find('isgameover').text) == 0: @@ -227,6 +242,8 @@ async def usergamedata_advanced(request: Request): db.table('ddr_scores').insert( { 'timestamp': timestamp, + 'pcbid': pcbid, + 'shoparea': shoparea, 'game_version': game_version, 'ddr_id': ddr_id, 'playstyle': playstyle, @@ -307,40 +324,25 @@ async def usergamedata_advanced(request: Request): & (where('difficulty') == difficulty) ) - wr = db.table('ddr_scores_wr').get( - (where('game_version') == game_version) - & (where('mcode') == mcode) - & (where('difficulty') == difficulty) - ) - wr = {} if wr is None else wr - - if best_score_data.get('score', 0) > wr.get('score', 0): - wr_score_data = best_score_data - - wr_score_data['ghostid'] = ghostid.doc_id - - db.table('ddr_scores_wr').upsert( - wr_score_data, - (where('game_version') == game_version) - & (where('mcode') == mcode) - & (where('difficulty') == difficulty) - ) - - # workaround to save the correct dan grade by using the course mcode - # because omnimix force unlocks all dan courses with 1 in coursedb.xml elif int(data.find('isgameover').text) == 1: - n = note[0] + single_grade = int(data.find('grade/single_grade').text) + double_grade = int(data.find('grade/double_grade').text) profile = get_profile(refid) game_profile = profile['version'].get(str(game_version), {}) - mcode = int(n.find('mcode').text) - if int(n.find('clearkind').text) != 1: - for idx, d in enumerate(range(1000, 1011), start=1): - if playstyle == 0: - if mcode in (d, d + 11): - game_profile['single_grade'] = max(idx, game_profile.get('single_grade', idx)) - elif playstyle == 1: - if mcode in (d + 1000, d + 1000 + 11): - game_profile['double_grade'] = max(idx, game_profile.get('double_grade', idx)) + # workaround to save the correct dan grade by using the course mcode + # because omnimix force unlocks all dan courses with 1 in coursedb.xml + if is_omni: + n = note[0] + mcode = int(n.find('mcode').text) + if int(n.find('clearkind').text) != 1: + for grade, course_id in enumerate(range(1000, 1011), start=1): + if playstyle == 0 and mcode in (course_id, course_id + 11): + single_grade = grade + elif playstyle == 1 and mcode in (course_id + 1000, course_id + 1000 + 11): + double_grade = grade + + game_profile['single_grade'] = max(single_grade, game_profile.get('single_grade', single_grade)) + game_profile['double_grade'] = max(double_grade, game_profile.get('double_grade', double_grade)) profile['version'][str(game_version)] = game_profile db.table('ddr_profile').upsert(profile, where('card') == refid) @@ -351,24 +353,91 @@ async def usergamedata_advanced(request: Request): ) ) - if mode == 'inheritance': - response = E.response( - E.playerdata( - E.result(0, __type="s32"), - E.InheritanceStatus(1, __type="s32"), - ) - ) + elif mode == 'rivalload': + loadflag = int(data.find('loadflag').text) + ddrcode = int(data.find('ddrcode').text) + pcbid = data.find('pcbid').text + shoparea = data.find('shoparea').text - if mode == 'rivalload': - shoparea = request_info['root'][0].find('data/shoparea').text - loadflag = int(request_info['root'][0].find('data/loadflag').text) - ddrcode = int(request_info['root'][0].find('data/ddrcode').text) - pcbid = request_info['root'][0].find('data/pcbid').text + if loadflag == 1: + all_scores = {} + for record in db.table('ddr_scores').search( + (where('game_version') == game_version) + & (where('pcbid') == pcbid) + & (where('ddr_id') != 0) + ): + ddr_id = record['ddr_id'] + playstyle = record['playstyle'] + mcode = record['mcode'] + difficulty = record['difficulty'] + score = record['score'] - if loadflag in (1, 2, 4): - scores = [] - for s in db.table('ddr_scores_wr'): - scores.append(s) + if (playstyle, mcode, difficulty) not in all_scores or score > all_scores[(playstyle, mcode, difficulty)].get("score"): + all_scores[playstyle, mcode, difficulty] = { + 'game_version': game_version, + 'ddr_id': ddr_id, + 'playstyle': playstyle, + 'mcode': mcode, + 'difficulty': difficulty, + 'rank': record['rank'], + 'lamp': record['lamp'], + 'score': score, + 'exscore': record['exscore'], + 'ghostid': record.doc_id + } + scores = list(all_scores.values()) + + elif loadflag == 2: + all_scores = {} + for record in db.table('ddr_scores').search( + (where('game_version') == game_version) + & (where('shoparea') == shoparea) + & (where('ddr_id') != 0) + ): + ddr_id = record['ddr_id'] + playstyle = record['playstyle'] + mcode = record['mcode'] + difficulty = record['difficulty'] + score = record['score'] + + if (playstyle, mcode, difficulty) not in all_scores or score > all_scores[(playstyle, mcode, difficulty)].get("score"): + all_scores[playstyle, mcode, difficulty] = { + 'game_version': game_version, + 'ddr_id': ddr_id, + 'playstyle': playstyle, + 'mcode': mcode, + 'difficulty': difficulty, + 'rank': record['rank'], + 'lamp': record['lamp'], + 'score': score, + 'exscore': record['exscore'], + 'ghostid': record.doc_id + } + scores = list(all_scores.values()) + + elif loadflag == 4: + all_scores = {} + for record in db.table('ddr_scores').search((where('game_version') == game_version) & (where('ddr_id') != 0)): + ddr_id = record['ddr_id'] + playstyle = record['playstyle'] + mcode = record['mcode'] + difficulty = record['difficulty'] + score = record['score'] + + if (playstyle, mcode, difficulty) not in all_scores or score > all_scores[(playstyle, mcode, difficulty)].get("score"): + all_scores[playstyle, mcode, difficulty] = { + 'game_version': game_version, + 'ddr_id': ddr_id, + 'playstyle': playstyle, + 'mcode': mcode, + 'difficulty': difficulty, + 'rank': record['rank'], + 'lamp': record['lamp'], + 'score': score, + 'exscore': record['exscore'], + 'ghostid': record.doc_id + } + scores = list(all_scores.values()) elif loadflag in (8, 16, 32): scores = [] @@ -396,20 +465,18 @@ async def usergamedata_advanced(request: Request): ) ) - if mode == 'ghostload': - ghostid = int(request_info['root'][0].find('data/ghostid').text) - record = db.table('ddr_scores').get(doc_id=ghostid) - + elif mode == 'inheritance': response = E.response( E.playerdata( E.result(0, __type="s32"), - E.ghostdata( - E.code(record['ddr_id'], __type="s32"), - E.mcode(record['mcode'], __type="u32"), - E.notetype(record['difficulty'], __type="u8"), - E.ghostsize(record['ghostsize'], __type="s32"), - E.ghost(record['ghost'], __type="string"), - ) + E.InheritanceStatus(1, __type="s32"), + ) + ) + + else: + response = E.response( + E.playerdata( + E.result(1, __type="s32"), ) ) diff --git a/modules/ddr/playerdata_2.py b/modules/ddr/playerdata_2.py index d6cd381..a2870a9 100644 --- a/modules/ddr/playerdata_2.py +++ b/modules/ddr/playerdata_2.py @@ -40,17 +40,22 @@ def get_common(ddr_id, game_version, idx): async def usergamedata_advanced(request: Request): request_info = await core_process_request(request) game_version = request_info['game_version'] + is_omni = True if request_info['rev'] == 'O' else False response = None - mode = request_info['root'][0].find('data/mode').text - refid = request_info['root'][0].find('data/refid').text + data = request_info['root'][0].find('data') + mode = data.find('mode').text + gamesession = data.find('gamesession').text + refid = data.find('refid').text + + default = 'X0000000000000000000000000000000'[:-len(gamesession)]+gamesession db = get_db() all_profiles_for_card = db.table('ddr_profile').get(Query().card == refid) if mode == 'usernew': - shoparea = request_info['root'][0].find('data/shoparea').text + shoparea = data.find('shoparea').text if 'ddr_id' not in all_profiles_for_card: ddr_id = random.randint(10000000, 99999999) @@ -68,6 +73,8 @@ async def usergamedata_advanced(request: Request): 'rival_1_ddr_id': 0, 'rival_2_ddr_id': 0, 'rival_3_ddr_id': 0, + 'single_grade': 0, + 'double_grade': 0, } db.table('ddr_profile').upsert(all_profiles_for_card, where('card') == refid) @@ -81,26 +88,21 @@ async def usergamedata_advanced(request: Request): ) ) - if mode == 'userload': + elif mode == 'userload' and refid != default: all_scores = {} if all_profiles_for_card is not None: ddr_id = all_profiles_for_card['ddr_id'] - for record in db.table('ddr_scores_best').search(where('game_version') == game_version): - mcode = str(record['mcode']) - if mcode not in all_scores.keys(): - scores = [] - for difficulty in range(10): - s = db.table('ddr_scores_best').get( - (where('ddr_id') == ddr_id) - & (where('game_version') == game_version) - & (where('mcode') == int(mcode)) - & (where('difficulty') == difficulty) - ) - if s == None: - scores.append([0, 0, 0, 0, 0]) - else: - scores.append([1, s['rank'], s['lamp'], s['score'], s['ghostid']]) - all_scores[mcode] = scores + profile = get_game_profile(refid, game_version) + + single_grade = profile.get('single_grade', 0) + double_grade = profile.get('double_grade', 0) + + for record in db.table('ddr_scores_best').search((where('game_version') == game_version)& (where('ddr_id') == ddr_id)): + mcode = record['mcode'] + difficulty = record['difficulty'] + if mcode not in all_scores: + all_scores[mcode] = [[0, 0, 0, 0, 0] for x in range(10)] + all_scores[mcode][difficulty] = ([1, record['rank'], record['lamp'], record['score'], record['ghostid']]) response = E.response( E.playerdata_2( @@ -128,8 +130,8 @@ async def usergamedata_advanced(request: Request): E.savedata(0, __type="s64"), ) for event in [e for e in range(1, 100) if e not in [4, 6, 7, 8, 14, 47]]], E.grade( - E.single_grade(0, __type="u32"), - E.double_grade(0, __type="u32"), + E.single_grade(single_grade, __type="u32"), + E.double_grade(double_grade, __type="u32"), ), E.golden_league( E.league_class(0, __type="s32"), @@ -169,15 +171,34 @@ async def usergamedata_advanced(request: Request): ) ) - if mode == 'usersave': + elif mode == 'ghostload': + ghostid = int(data.find('ghostid').text) + record = db.table('ddr_scores').get(doc_id=ghostid) + + response = E.response( + E.playerdata_2( + E.result(0, __type="s32"), + E.ghostdata( + E.code(record['ddr_id'], __type="s32"), + E.mcode(record['mcode'], __type="u32"), + E.notetype(record['difficulty'], __type="u8"), + E.ghostsize(record['ghostsize'], __type="s32"), + E.ghost(record['ghost'], __type="string"), + ) + ) + ) + + elif mode == 'usersave' and refid != default: timestamp = time.time() + + ddr_id = int(data.find('ddrcode').text) + playstyle = int(data.find('playstyle').text) + pcbid = data.find('pcbid').text + shoparea = data.find('shoparea').text - data = request_info['root'][0].find('data') + note = data.findall('note') - if not int(data.find('isgameover').text) == 1: - ddr_id = int(data.find('ddrcode').text) - playstyle = int(data.find('playstyle').text) - note = data.findall('note') + if int(data.find('isgameover').text) == 0: for n in note: if int(n.find('stagenum').text) != 0: mcode = int(n.find('mcode').text) @@ -221,6 +242,8 @@ async def usergamedata_advanced(request: Request): db.table('ddr_scores').insert( { 'timestamp': timestamp, + 'pcbid': pcbid, + 'shoparea': shoparea, 'game_version': game_version, 'ddr_id': ddr_id, 'playstyle': playstyle, @@ -301,49 +324,120 @@ async def usergamedata_advanced(request: Request): & (where('difficulty') == difficulty) ) - wr = db.table('ddr_scores_wr').get( + elif int(data.find('isgameover').text) == 1: + single_grade = int(data.find('grade/single_grade').text) + double_grade = int(data.find('grade/double_grade').text) + profile = get_profile(refid) + game_profile = profile['version'].get(str(game_version), {}) + # workaround to save the correct dan grade by using the course mcode + # because omnimix force unlocks all dan courses with 1 in coursedb.xml + if is_omni: + n = note[0] + mcode = int(n.find('mcode').text) + if int(n.find('clearkind').text) != 1: + for grade, course_id in enumerate(range(1000, 1011), start=1): + if playstyle == 0 and mcode in (course_id, course_id + 11): + single_grade = grade + elif playstyle == 1 and mcode in (course_id + 1000, course_id + 1000 + 11): + double_grade = grade + + game_profile['single_grade'] = max(single_grade, game_profile.get('single_grade', single_grade)) + game_profile['double_grade'] = max(double_grade, game_profile.get('double_grade', double_grade)) + + profile['version'][str(game_version)] = game_profile + db.table('ddr_profile').upsert(profile, where('card') == refid) + + response = E.response( + E.playerdata_2( + E.result(0, __type="s32"), + ) + ) + + elif mode == 'rivalload': + loadflag = int(data.find('loadflag').text) + ddrcode = int(data.find('ddrcode').text) + pcbid = data.find('pcbid').text + shoparea = data.find('shoparea').text + + if loadflag == 1: + all_scores = {} + for record in db.table('ddr_scores').search( (where('game_version') == game_version) - & (where('mcode') == mcode) - & (where('difficulty') == difficulty) - ) - wr = {} if wr is None else wr + & (where('pcbid') == pcbid) + & (where('ddr_id') != 0) + ): + ddr_id = record['ddr_id'] + playstyle = record['playstyle'] + mcode = record['mcode'] + difficulty = record['difficulty'] + score = record['score'] - if best_score_data.get('score', 0) > wr.get('score', 0): - wr_score_data = best_score_data + if (playstyle, mcode, difficulty) not in all_scores or score > all_scores[(playstyle, mcode, difficulty)].get("score"): + all_scores[playstyle, mcode, difficulty] = { + 'game_version': game_version, + 'ddr_id': ddr_id, + 'playstyle': playstyle, + 'mcode': mcode, + 'difficulty': difficulty, + 'rank': record['rank'], + 'lamp': record['lamp'], + 'score': score, + 'exscore': record['exscore'], + 'ghostid': record.doc_id + } + scores = list(all_scores.values()) - wr_score_data['ghostid'] = ghostid.doc_id + elif loadflag == 2: + all_scores = {} + for record in db.table('ddr_scores').search( + (where('game_version') == game_version) + & (where('shoparea') == shoparea) + & (where('ddr_id') != 0) + ): + ddr_id = record['ddr_id'] + playstyle = record['playstyle'] + mcode = record['mcode'] + difficulty = record['difficulty'] + score = record['score'] - db.table('ddr_scores_wr').upsert( - wr_score_data, - (where('game_version') == game_version) - & (where('mcode') == mcode) - & (where('difficulty') == difficulty) - ) + if (playstyle, mcode, difficulty) not in all_scores or score > all_scores[(playstyle, mcode, difficulty)].get("score"): + all_scores[playstyle, mcode, difficulty] = { + 'game_version': game_version, + 'ddr_id': ddr_id, + 'playstyle': playstyle, + 'mcode': mcode, + 'difficulty': difficulty, + 'rank': record['rank'], + 'lamp': record['lamp'], + 'score': score, + 'exscore': record['exscore'], + 'ghostid': record.doc_id + } + scores = list(all_scores.values()) - response = E.response( - E.playerdata_2( - E.result(0, __type="s32"), - ) - ) + elif loadflag == 4: + all_scores = {} + for record in db.table('ddr_scores').search((where('game_version') == game_version) & (where('ddr_id') != 0)): + ddr_id = record['ddr_id'] + playstyle = record['playstyle'] + mcode = record['mcode'] + difficulty = record['difficulty'] + score = record['score'] - if mode == 'inheritance': - response = E.response( - E.playerdata_2( - E.result(0, __type="s32"), - E.InheritanceStatus(1, __type="s32"), - ) - ) - - if mode == 'rivalload': - shoparea = request_info['root'][0].find('data/shoparea').text - loadflag = int(request_info['root'][0].find('data/loadflag').text) - ddrcode = int(request_info['root'][0].find('data/ddrcode').text) - pcbid = request_info['root'][0].find('data/pcbid').text - - if loadflag in (1, 2, 4): - scores = [] - for s in db.table('ddr_scores_wr'): - scores.append(s) + if (playstyle, mcode, difficulty) not in all_scores or score > all_scores[(playstyle, mcode, difficulty)].get("score"): + all_scores[playstyle, mcode, difficulty] = { + 'game_version': game_version, + 'ddr_id': ddr_id, + 'playstyle': playstyle, + 'mcode': mcode, + 'difficulty': difficulty, + 'rank': record['rank'], + 'lamp': record['lamp'], + 'score': score, + 'exscore': record['exscore'], + 'ghostid': record.doc_id + } + scores = list(all_scores.values()) elif loadflag in (8, 16, 32): scores = [] @@ -376,20 +470,18 @@ async def usergamedata_advanced(request: Request): ) ) - if mode == 'ghostload': - ghostid = int(request_info['root'][0].find('data/ghostid').text) - record = db.table('ddr_scores').get(doc_id=ghostid) - + elif mode == 'inheritance': response = E.response( E.playerdata_2( E.result(0, __type="s32"), - E.ghostdata( - E.code(record['ddr_id'], __type="s32"), - E.mcode(record['mcode'], __type="u32"), - E.notetype(record['difficulty'], __type="u8"), - E.ghostsize(record['ghostsize'], __type="s32"), - E.ghost(record['ghost'], __type="string"), - ) + E.InheritanceStatus(1, __type="s32"), + ) + ) + + else: + response = E.response( + E.playerdata( + E.result(1, __type="s32"), ) )