API/GameServer/services/ServerRegistrationService.js
2026-01-24 16:47:19 -04:00

162 lines
4.8 KiB
JavaScript

const logger = require('../utils/logger');
class ServerRegistrationService {
constructor(gameServerUrl, apiUrl, serverName, serverRegion, maxPlayers = 10) {
this.gameServerUrl = gameServerUrl;
this.apiUrl = apiUrl;
this.serverName = serverName;
this.serverRegion = serverRegion;
this.maxPlayers = maxPlayers;
this.serverId = `gameserver_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
this.registrationInterval = null;
this.isRegistered = false;
this.getCurrentPlayerCount = null; // Callback to get current player count
}
setPlayerCountCallback(callback) {
this.getCurrentPlayerCount = callback;
}
async registerWithAPI() {
try {
logger.info(`[SERVER REGISTRATION] Registering server ${this.serverId} with API at ${this.apiUrl}`);
const currentPlayers = this.getCurrentPlayerCount ? this.getCurrentPlayerCount() : 0;
const serverData = {
serverId: this.serverId,
name: this.serverName,
type: 'public',
region: this.serverRegion,
maxPlayers: this.maxPlayers,
currentPlayers: currentPlayers,
gameServerUrl: this.gameServerUrl,
owner: {
userId: 'system',
username: 'Game Server'
}
};
logger.info(`[SERVER REGISTRATION] Registering with ${currentPlayers} current players`);
const response = await fetch(`${this.apiUrl}/api/servers/register`, {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(serverData)
});
if (response.ok) {
const result = await response.json();
logger.info(`[SERVER REGISTRATION] Server registered successfully:`, result);
this.isRegistered = true;
return true;
} else {
const error = await response.text();
logger.error(`[SERVER REGISTRATION] Failed to register server: ${error}`);
return false;
}
} catch (error) {
logger.error(`[SERVER REGISTRATION] Error registering server:`, error);
return false;
}
}
async updateServerStatus(currentPlayers, status) {
if (!this.isRegistered) {
logger.warn(`[SERVER REGISTRATION] Cannot update status - server not registered`);
return false;
}
try {
logger.info(`[SERVER REGISTRATION] Updating server ${this.serverId} status:`, {
currentPlayers,
status
});
const response = await fetch(`${this.apiUrl}/api/servers/update-status/${this.serverId}`, {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ currentPlayers, status })
});
if (response.ok) {
const result = await response.json();
logger.info(`[SERVER REGISTRATION] Status updated successfully:`, result);
return true;
} else {
const error = await response.text();
logger.error(`[SERVER REGISTRATION] Failed to update status: ${error}`);
return false;
}
} catch (error) {
logger.error(`[SERVER REGISTRATION] Error updating server status:`, error);
return false;
}
}
async updatePlayerCount(playerCount) {
return await this.updateServerStatus(playerCount, 'active');
}
startHeartbeat() {
// Register immediately
this.registerWithAPI();
// Set up periodic registration updates (every 30 seconds)
this.registrationInterval = setInterval(async () => {
await this.registerWithAPI();
}, 30000);
logger.info(`[SERVER REGISTRATION] Heartbeat started for server ${this.serverId}`);
}
stopHeartbeat() {
if (this.registrationInterval) {
clearInterval(this.registrationInterval);
this.registrationInterval = null;
logger.info(`[SERVER REGISTRATION] Heartbeat stopped for server ${this.serverId}`);
}
}
async unregisterWithAPI() {
try {
logger.info(`[SERVER REGISTRATION] Unregistering server ${this.serverId} from API at ${this.apiUrl}`);
const response = await fetch(`${this.apiUrl}/api/servers/unregister/${this.serverId}`, {
method: 'DELETE',
headers: {
'Content-Type': 'application/json'
}
});
if (response.ok) {
const result = await response.json();
logger.info(`[SERVER REGISTRATION] Server unregistered successfully:`, result);
this.isRegistered = false;
return true;
} else {
const error = await response.text();
logger.error(`[SERVER REGISTRATION] Failed to unregister server: ${error}`);
return false;
}
} catch (error) {
logger.error(`[SERVER REGISTRATION] Error unregistering server:`, error);
return false;
}
}
getServerId() {
return this.serverId;
}
isServerRegistered() {
return this.isRegistered;
}
}
module.exports = ServerRegistrationService;