Files
Viano-Core/doc/clientless/checkpoints/2026-11-02-1000-raid-test/observe.py
T

43 lines
2.4 KiB
Python

"""Read-only observation of the ten-bot retry until 11:00 CET."""
from pathlib import Path
import sys,os,re,json,time,datetime
sys.path.insert(0,str(Path(__file__).resolve().parents[1]/'2026-11-02-0600-group-test'))
import test_driver as d
BASE=Path(__file__).resolve().parent
END=datetime.datetime.fromisoformat('2026-11-02T11:00:00+01:00')
IDS=set(d.RAID)
def append(name,v):
with (BASE/name).open('a') as f:f.write(json.dumps(v,ensure_ascii=False)+'\n')
class Tail:
def __init__(self,path):
self.path=path;self.f=path.open('rb');self.inode=os.fstat(self.f.fileno()).st_ino;self.f.seek(0,2);self.pending=b''
def poll(self):
st=self.path.stat()
if st.st_ino==self.inode and st.st_size<self.f.tell():self.f.seek(0);self.pending=b''
data=self.f.read()
if st.st_ino!=self.inode:
self.f.close();self.f=self.path.open('rb');self.inode=st.st_ino;data+=self.f.read()
parts=(self.pending+data).split(b'\n');self.pending=parts.pop()
for line in parts:
s=line.decode(errors='replace')
if any(int(g) in IDS for g in re.findall(r'\b(?:guid|leader|member|target)=(\d+)\b',s)):
append('events.jsonl',{'time':d.now().isoformat(),'source':self.path.name,'line':s})
def snapshot():
for g in d.RAID:
for c in [f'clientless adventure status {g}',f'clientless actioninfo {g}',f'clientless flight status {g}',f'clientless interaction {g}']:d.command(c)
time.sleep(.6)
stamp=d.now();file='snapshot-'+stamp.strftime('%H%M%S')+'.log';(BASE/file).write_text(d.console(1000))
groups=d.query('Character','SELECT g.guid,g.leaderGuid,m.memberGuid,c.name FROM groups g JOIN group_member m ON m.guid=g.guid JOIN characters c ON c.guid=m.memberGuid WHERE g.guid IN(SELECT guid FROM group_member WHERE memberGuid IN(159,160,161,162,163,164,165,166,167,176)) ORDER BY g.guid,m.memberGuid')
append('snapshots.jsonl',{'time':stamp.isoformat(),'native_file':file,'groups':groups})
if __name__=='__main__':
logs=Path('/home/wow_admin/wow_cata_server/server/debug/bin');tails=[Tail(logs/'Server.log'),Tail(logs/'adventurebot-navigation.log')];next_snapshot=0
append('lifecycle.jsonl',{'time':d.now().isoformat(),'event':'start','end':END.isoformat()})
while d.now()<END:
try:
for t in tails:t.poll()
if time.monotonic()>=next_snapshot:snapshot();next_snapshot=time.monotonic()+120
except Exception as e:append('errors.jsonl',{'time':d.now().isoformat(),'error':str(e)})
time.sleep(2)
for t in tails:t.poll()
append('lifecycle.jsonl',{'time':d.now().isoformat(),'event':'finished'})