42 lines
4.3 KiB
Python
42 lines
4.3 KiB
Python
from pathlib import Path
|
|
import os,re,subprocess,sys
|
|
root=Path('/home/wow_admin/wow_cata_server/source/TrinityCore')
|
|
conf=Path('/home/wow_admin/wow_cata_server/server/debug/etc/worldserver.conf').read_text()
|
|
def query(kind,sql):
|
|
h,port,u,p,db=re.search(r'^'+kind+r'DatabaseInfo\s*=\s*"([^"]+)"',conf,re.M).group(1).split(';')
|
|
env=os.environ.copy();env['MYSQL_PWD']=p
|
|
r=subprocess.run(['mysql','--protocol=TCP','--host='+h,'--port='+port,'--user='+u,'--database='+db,'--batch','--connect-timeout=10'],input=sql,text=True,capture_output=True,env=env)
|
|
if r.returncode:raise SystemExit(r.stderr.replace(p,'[redacted]'))
|
|
return r.stdout
|
|
|
|
mode=sys.argv[1]
|
|
if mode=='apply':
|
|
for kind,name in [('World','sql/custom/world/2026_10_29_00_adventure_population.sql'),('Character','sql/custom/characters/2026_10_29_00_adventure_population.sql')]:
|
|
print(query(kind,(root/name).read_text()))
|
|
elif mode=='audit':
|
|
print(query('World',"SELECT COUNT(*) AS zones FROM vcore_adventure_zone; SHOW CREATE TABLE vcore_adventure_day;"))
|
|
print(query('Character',"SELECT g.character_guid,c.name,c.level,c.race,c.class,c.online,g.persistent,g.state,LENGTH(g.profile_lua) profile_bytes FROM vcore_adventure_generated_bot g JOIN characters c ON c.guid=g.character_guid ORDER BY c.guid; SELECT * FROM vcore_adventure_rotation; SELECT * FROM vcore_adventure_bot_account;"))
|
|
elif mode=='originals':
|
|
print(query('Character',"SELECT ci.guid,COUNT(*) items,SHA2(GROUP_CONCAT(CONCAT(ci.item,':',ii.itemEntry) ORDER BY ci.item SEPARATOR ','),256) inventory_hash FROM character_inventory ci JOIN item_instance ii ON ii.guid=ci.item WHERE ci.guid IN(21,26) GROUP BY ci.guid;"))
|
|
elif mode=='dayhash':
|
|
print(query('World',"SELECT character_guid,local_date,COUNT(*) slots,SHA2(GROUP_CONCAT(CONCAT(hour_slot,':',intent,':',location_key) ORDER BY hour_slot SEPARATOR '|'),256) day_hash FROM vcore_adventure_day WHERE character_guid BETWEEN 33 AND 50 GROUP BY character_guid,local_date;"))
|
|
elif mode=='details':
|
|
print(query('Character',"SELECT c.guid,c.name,c.level,c.talentTree,g.persistent,g.state FROM characters c JOIN vcore_adventure_generated_bot g ON g.character_guid=c.guid WHERE c.guid>=33; SELECT ci.guid,ci.slot,i.itemEntry FROM character_inventory ci JOIN item_instance i ON i.guid=ci.item WHERE ci.guid>=33 AND ci.bag=0 AND ci.slot<23 ORDER BY ci.guid,ci.slot; SELECT s.guid,COUNT(*) spells FROM character_spell s WHERE s.guid>=33 GROUP BY s.guid; SELECT t.guid,COUNT(*) talent_spells FROM character_talent t WHERE t.guid>=33 GROUP BY t.guid;"))
|
|
elif mode=='expire37':
|
|
row=query('Character',"SELECT c.online FROM characters c JOIN vcore_adventure_generated_bot g ON c.guid=g.character_guid WHERE c.guid=37 AND g.persistent=0 AND g.state='ready';")
|
|
if row.strip().splitlines()!=['online','0']:raise SystemExit('Test bot37 must be offline and temporary')
|
|
print(query('World',"UPDATE vcore_adventure_day SET local_date=20261027 WHERE character_guid=37; SELECT character_guid,local_date,COUNT(*) slots FROM vcore_adventure_day WHERE character_guid=37 GROUP BY character_guid,local_date;"))
|
|
elif mode=='positions':
|
|
print(query('Character',"SELECT guid,name,online,map,position_x,position_y,position_z FROM characters WHERE guid IN(26,29,30,31,32,33,34,35,36,38);"))
|
|
elif mode=='visits':
|
|
print(query('Character',"SELECT character_guid,phase,block_end,location_key FROM vcore_adventure_instance_visit ORDER BY character_guid;"))
|
|
elif mode=='homes':
|
|
print(query('World',"SELECT id,name,map,position_x,position_y,position_z FROM game_tele WHERE id=823 OR name LIKE '%sepul%' OR name='Brill'; SELECT point_key,map,position_x,position_y,position_z FROM vcore_clientless_world_point WHERE point_key='poi_npc_321922';"))
|
|
elif mode=='near_home':
|
|
print(query('World',"SELECT id,name,map,position_x,position_y,position_z FROM game_tele WHERE map=0 ORDER BY POW(position_x-1097.57,2)+POW(position_y-1587.29,2) LIMIT 3;"))
|
|
elif mode=='zone_names':
|
|
print(query('World',"SELECT DISTINCT zone_id,region_key FROM vcore_adventure_location WHERE zone_id IN(210,33,5287,5288,616,4709,493,2817,4755,5144,5145,4815,11,51,3) ORDER BY zone_id;"))
|
|
elif mode=='plans':
|
|
print(query('World',"SELECT character_guid,local_date,COUNT(*) slots,MIN(hour_slot),MAX(hour_slot),COUNT(DISTINCT location_key) locations FROM vcore_adventure_day GROUP BY character_guid,local_date;"))
|
|
else:raise SystemExit('unknown mode')
|