import {spawn} from 'node:child_process'; import {readFile,writeFile,rename} from 'node:fs/promises'; import {existsSync} from 'node:fs'; const directory='.cache/paper-proof',plugin=`${directory}/plugins/minegeo.jar`,disabled=plugin+'.disabled'; if(existsSync(plugin))await rename(plugin,disabled); const previous=await readFile(`${directory}/server.properties`,'utf8'); await writeFile(`${directory}/server.properties`,previous.replace('online-mode=true','online-mode=false')); let client,server,success=false;const points=[[0,100,20],[-20,100,20],[20,100,-20],[-20,100,-20],[30,100,0]]; try{ await new Promise((accept,reject)=>{server=spawn('java',['-Xmx2G','-jar','paper.jar','--nogui'],{cwd:directory,stdio:['pipe','pipe','pipe'],windowsHide:true});let started=false;let tail='';const output=data=>{process.stdout.write(data);tail=(tail+data.toString()).slice(-6000);if(!started&&tail.includes('Done (')){started=true;server.stdin.write('setworldspawn 0 100 20\n');accept();}if(data.toString().includes('MineGeoTest joined'))server.stdin.write('gamemode creative MineGeoTest\ntp MineGeoTest 0 100 20\n');};server.stdout.on('data',output);server.stderr.on('data',output);server.on('exit',code=>{if(!started)reject(new Error('Fixture server exited '+code));});setTimeout(()=>{if(!started)reject(new Error('Fixture server startup timed out'));},120000).unref();}); await new Promise((accept,reject)=>{client=spawn(process.platform==='win32'?'gradlew.bat':'./gradlew',[':fabric:runCaptureTest'],{cwd:'minecraft',stdio:['pipe','pipe','pipe'],shell:process.platform==='win32',windowsHide:true});let seen=new Set();const output=data=>{process.stdout.write(data);const text=data.toString();for(let i=1;i<=4;i++)if(text.includes('MINEGEO_TEST_CAPTURE_'+i)&&!seen.has(i)){seen.add(i);const p=points[i];server.stdin.write(`tp MineGeoTest ${p.join(' ')}\n`);}if(text.includes('MINEGEO_TEST_PASS'))success=true;};client.stdout.on('data',output);client.stderr.on('data',output);client.on('exit',code=>success&&code===0?accept():reject(new Error('Fabric capture test did not pass: '+code)));const timer=setTimeout(()=>{client.kill();reject(new Error('Fabric fixture timed out'));},360000);timer.unref();}); console.log('Fabric captured five real panoramas on a server without MineGeo installed, and restored settings on success/cancellation.'); }finally{server?.stdin.write('stop\n');await writeFile(`${directory}/server.properties`,previous);if(existsSync(disabled))await rename(disabled,plugin);}