Files
server-manager/manager/src/serverRegistry.ts
T
2026-07-20 16:44:23 +02:00

378 lines
4.0 KiB
TypeScript

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<string, ServerInfo>();
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
);
}
}
}