Improved CFG Execution on server
This commit is contained in:
parent
4a7d64e222
commit
dbd77dde34
@ -19,7 +19,7 @@ class RconManager {
|
|||||||
for (const server of servers) {
|
for (const server of servers) {
|
||||||
const server_id = server.id.toString();
|
const server_id = server.id.toString();
|
||||||
if (server_id in this.rcons) continue;
|
if (server_id in this.rcons) continue;
|
||||||
await this.connect(server_id, server)
|
await this.connect(server_id, server);
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('Error connecting to MongoDB:', error);
|
console.error('Error connecting to MongoDB:', error);
|
||||||
@ -27,6 +27,11 @@ class RconManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async send_heartbeat(server_id, server) {
|
async send_heartbeat(server_id, server) {
|
||||||
|
if (!this.rcons[server_id].connection.writable) {
|
||||||
|
console.log("Connection unwritable, reconnecting...")
|
||||||
|
await this.disconnect_rcon(server_id);
|
||||||
|
await this.connect(server_id, server);
|
||||||
|
}
|
||||||
try {
|
try {
|
||||||
const status_promise = this.rcons[server_id].execute(`status`);
|
const status_promise = this.rcons[server_id].execute(`status`);
|
||||||
|
|
||||||
@ -36,9 +41,9 @@ class RconManager {
|
|||||||
}, 5000); // 5 seconds timeout
|
}, 5000); // 5 seconds timeout
|
||||||
});
|
});
|
||||||
let status = await Promise.race([status_promise, timeout_promise]);
|
let status = await Promise.race([status_promise, timeout_promise]);
|
||||||
console.log("HEARTBEAT RESPONSE:", status)
|
console.log("HEARTBEAT SUCCESS", server_id)
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.log("Error in connecting to the server, reconnecting.....");
|
console.log("Error in connecting to the server, reconnecting..... ERROR:", error);
|
||||||
await this.disconnect_rcon(server_id);
|
await this.disconnect_rcon(server_id);
|
||||||
await this.connect(server_id, server);
|
await this.connect(server_id, server);
|
||||||
}
|
}
|
||||||
@ -70,8 +75,6 @@ class RconManager {
|
|||||||
// Handle the authentication error here as needed.
|
// Handle the authentication error here as needed.
|
||||||
}
|
}
|
||||||
|
|
||||||
setInterval(async () => this.send_heartbeat(server_id, server), 5000);
|
|
||||||
|
|
||||||
this.rcons[server_id] = rcon_connection;
|
this.rcons[server_id] = rcon_connection;
|
||||||
this.details[server_id] = {
|
this.details[server_id] = {
|
||||||
host: server.serverIP,
|
host: server.serverIP,
|
||||||
@ -80,6 +83,7 @@ class RconManager {
|
|||||||
connected: rcon_connection.isConnected(),
|
connected: rcon_connection.isConnected(),
|
||||||
authenticated: rcon_connection.isAuthenticated()
|
authenticated: rcon_connection.isAuthenticated()
|
||||||
};
|
};
|
||||||
|
this.details[server_id].heartbeat_interval = setInterval(async () => this.send_heartbeat(server_id, server), 5000);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -88,7 +92,7 @@ class RconManager {
|
|||||||
if ( !(server_id in this.rcons) || (!this.rcons[server_id].connected)) {
|
if ( !(server_id in this.rcons) || (!this.rcons[server_id].connected)) {
|
||||||
return Promise.resolve();
|
return Promise.resolve();
|
||||||
}
|
}
|
||||||
|
clearInterval(this.details[server_id].heartbeat_interval)
|
||||||
this.rcons[server_id].authenticated = false;
|
this.rcons[server_id].authenticated = false;
|
||||||
this.rcons[server_id].connected = false;
|
this.rcons[server_id].connected = false;
|
||||||
|
|
||||||
@ -103,6 +107,7 @@ class RconManager {
|
|||||||
});
|
});
|
||||||
|
|
||||||
this.rcons[server_id].connection.end(); // Close the socket gracefully
|
this.rcons[server_id].connection.end(); // Close the socket gracefully
|
||||||
|
console.log("Disconnected", server_id)
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -233,24 +233,66 @@ function check_whitelisted_players() {
|
|||||||
.catch(console.error);
|
.catch(console.error);
|
||||||
}
|
}
|
||||||
|
|
||||||
function execute_cfg_on_server(server_id, cfg_path) {
|
|
||||||
const fileStream = fs.createReadStream(cfg_path, 'utf-8');
|
|
||||||
const rl = readline.createInterface({
|
|
||||||
input: fileStream,
|
|
||||||
terminal: false
|
|
||||||
});
|
|
||||||
|
|
||||||
rl.on('line', (line) => {
|
function splitByByteLength(data, length) {
|
||||||
try {
|
const lines = data;
|
||||||
console.log(`Line from file: ${line}`);
|
const exportedLines = [];
|
||||||
rcon.rcons[server_id].execute(line);
|
const lineEndChar = '; '
|
||||||
} catch (error) {
|
let index = 0;
|
||||||
console.log(`Error in executing line ${line}, Error: ${error}`);
|
|
||||||
|
for(let item = 0; item < lines.length; item++) {
|
||||||
|
if(typeof exportedLines[index] === "undefined") {
|
||||||
|
exportedLines[index] = "";
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
|
||||||
rl.on('close', () => {
|
const lineFormatted = `${lines[item]}${lineEndChar}`;
|
||||||
console.log('File reading completed.');
|
const lineBytes = Buffer.byteLength(lineFormatted, 'utf8');
|
||||||
|
const bufferBytes = Buffer.byteLength(exportedLines[index], 'utf8');
|
||||||
|
|
||||||
|
if((bufferBytes + lineBytes) < length) {
|
||||||
|
exportedLines[index] += lineFormatted;
|
||||||
|
} else {
|
||||||
|
index++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return exportedLines;
|
||||||
|
}
|
||||||
|
|
||||||
|
function execute_cfg_on_server(server_id, cfg_path) {
|
||||||
|
|
||||||
|
fs.readFile(cfg_path, 'utf8', (err, data) => {
|
||||||
|
if (err) {
|
||||||
|
throw err;
|
||||||
|
}
|
||||||
|
|
||||||
|
data = data.replace(/^\/\/.*$/m, '');
|
||||||
|
data = data.split("\n");
|
||||||
|
const new_data = [];
|
||||||
|
for (let i = 0; i < data.length; i += 1) {
|
||||||
|
const line = data[i].trim();
|
||||||
|
const segments = line.split(' ');
|
||||||
|
|
||||||
|
if(segments[0] === 'say' || segments.length == 1) {
|
||||||
|
new_data.push(line);
|
||||||
|
} else if (segments[0] !== '' && segments[0] !== '//') {
|
||||||
|
new_data.push(`${segments[0]} ${segments[1].split('\t')[0]}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const exported_lines = splitByByteLength(data, 512)
|
||||||
|
|
||||||
|
function execute_next_item(item) {
|
||||||
|
if (item < exported_lines.length) {
|
||||||
|
console.log(exported_lines[item]);
|
||||||
|
rcon.rcons[server_id].execute(exported_lines[item]);
|
||||||
|
|
||||||
|
// Wait for 200ms before moving to the next iteration
|
||||||
|
setTimeout(() => {
|
||||||
|
execute_next_item(item + 1);
|
||||||
|
}, 200);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
execute_next_item(0);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user