export interface ServerInfo { id:string; name:string; wrapperId:string; status: | "STARTING" | "RUNNING" | "STOPPING" | "CRASHED"; port:number; queryPort:number; pid?:number; players:number; maxPlayers:number; emptySince?:number; created:number; lastSeen:number; } export class ServerRegistry { private servers = new Map(); add(server:ServerInfo){ this.servers.set( server.id, server ); console.log( "Server registriert:", server ); } get(id:string){ return this.servers.get( id ); } getAll(){ return Array.from( this.servers.values() ); } update(server:ServerInfo){ this.servers.set( server.id, server ); } remove(id:string){ this.servers.delete( id ); console.log( "Server entfernt:", id ); } list(){ console.log( "\n=== SERVER ÜBERSICHT ===" ); const servers = this.getAll(); if(servers.length === 0){ console.log( "Keine Server vorhanden" ); return; } for(const server of servers){ console.log({ id: server.id, name: server.name, wrapper: server.wrapperId, status: server.status, port: server.port, queryPort: server.queryPort, players: `${server.players}/${server.maxPlayers}` }); } } syncWrapperStatus(data:any){ if(!data.servers) return; const runningServerIds = new Set( data.servers.map( (srv:any)=>srv.id ) ); for(const server of this.servers.values()){ if( server.wrapperId === data.wrapperId && !runningServerIds.has(server.id) ){ if(server.status === "STOPPING"){ console.log( "Server sauber beendet:", server.name ); this.remove( server.id ); } else if(server.status === "RUNNING"){ server.status = "CRASHED"; this.servers.set( server.id, server ); console.log( "Server abgestürzt:", server.name ); } } } for(const srv of data.servers){ const server = this.servers.get( srv.id ); if(!server) continue; server.pid = srv.pid; server.players = srv.players ?? 0; server.maxPlayers = srv.maxPlayers ?? 0; server.lastSeen = Date.now(); const oldStatus = server.status; if(srv.alive){ server.status = "RUNNING"; } else if( server.status === "RUNNING" ){ server.status = "CRASHED"; } if(oldStatus !== server.status){ console.log( "Status Änderung:", server.name, oldStatus, "->", server.status ); } this.servers.set( server.id, server ); } } }