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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user