Separate looted currency and preserve growing realm state in atomic chunks
Core tests / core (push) Successful in 49s

This commit is contained in:
Codex
2026-09-24 03:16:52 +12:00
parent e7b9df9e08
commit 8e01cdee22
13 changed files with 54 additions and 17 deletions
+6 -1
View File
@@ -109,7 +109,12 @@ def backup():
assert db.execute("SELECT COUNT(*) FROM sqlite_master WHERE type='table'").fetchone()[0]>0
if db.execute("SELECT 1 FROM sqlite_master WHERE type='table' AND name='realm_state'").fetchone():
row=db.execute("SELECT payload FROM realm_state WHERE id='realm'").fetchone()
if row:restored_state=json.loads(row[0])
if row:
restored_state=json.loads(row[0])
if restored_state.get('chunkToken'):
chunks=db.execute('SELECT payload FROM realm_state_chunks WHERE token=? ORDER BY part',(restored_state['chunkToken'],)).fetchall()
assert len(chunks)==restored_state['parts'], 'Incomplete restored state'
restored_state=json.loads(''.join(r[0] for r in chunks))
restored_file.unlink()
if not restored_state or not restored_state.get('bots'):raise RuntimeError('Restored app realm state missing')
manifest['restoredMemories']=sum(len(b.get('memories',[])) for b in restored_state['bots'])
+3 -2
View File
@@ -1,6 +1,6 @@
"""Read native counters and profiler output; return bounded public measurements."""
import json,subprocess,time,math
COUNTERS=('quests','abandoned','lootEvents','lootItems','partyKills','rewarded')
COUNTERS=('quests','abandoned','lootEvents','lootItems','partyKills','rewarded','lootedCopper')
def normalize_performance(raw):
def number(v):
try:
@@ -27,9 +27,10 @@ def collect(sql,state):
guids=','.join(map(str,allowed))
for line in sql('SELECT guid,COUNT(*) FROM acore_characters.character_queststatus_rewarded WHERE guid IN ('+guids+') GROUP BY guid').splitlines():
guid,count=map(int,line.split('\t'));rewarded[guid]=count
money={int(g):int(c) for g,c in (line.split('\t') for line in sql('SELECT guid,looted_copper FROM acore_auth.azerothai_currency').splitlines())}
result=[]
for guid,b in allowed.items():
counters=rows.get(guid,dict.fromkeys(COUNTERS,0));counters['rewarded']=rewarded.get(guid,0)
counters=rows.get(guid,dict.fromkeys(COUNTERS,0));counters['rewarded']=rewarded.get(guid,0);counters['lootedCopper']=money.get(guid,0)
result.append({'guid':guid,'name':b['name'],**counters})
return result
+1 -1
View File
@@ -1,6 +1,6 @@
import {spawnSync} from 'node:child_process';
import {writeFileSync,mkdirSync} from 'node:fs';
const result=spawnSync(process.execPath,['node_modules/typescript/bin/tsc','core/realm-outcomes.ts','core/realm-insights.ts','core/service.ts','core/seed.ts','core/ale.ts','core/conversation.ts','core/autonomy.ts','--types','@cloudflare/workers-types,node','--outDir','.test-build','--module','commonjs','--target','es2022','--moduleResolution','node','--esModuleInterop','--skipLibCheck','--strict'],{stdio:'inherit'});
const result=spawnSync(process.execPath,['node_modules/typescript/bin/tsc','core/state-chunks.ts','core/realm-outcomes.ts','core/realm-insights.ts','core/service.ts','core/seed.ts','core/ale.ts','core/conversation.ts','core/autonomy.ts','--types','@cloudflare/workers-types,node','--outDir','.test-build','--module','commonjs','--target','es2022','--moduleResolution','node','--esModuleInterop','--skipLibCheck','--strict'],{stdio:'inherit'});
if(result.status)process.exit(result.status);
mkdirSync('.test-build',{recursive:true});writeFileSync('.test-build/package.json','{"type":"commonjs"}');
process.exit(spawnSync(process.execPath,['--test','tests/realm-outcomes.test.cjs','tests/realm-insights.test.cjs','tests/core.test.cjs','tests/hardcore.test.cjs','tests/living-world.test.cjs','tests/ale.test.cjs','tests/brains.test.cjs','tests/conversation.test.cjs','tests/autonomy.test.cjs','tests/community.test.cjs'],{stdio:'inherit'}).status??1);