/** class factorioServer This class has the responsiblity of : * spawning a factorio server * Handling input via stdin or RCON */ const fs = require("fs"); class factorioServer { constructor({ factorioDirectory = "./../../factorio", instanceDirectory = "./../../instances/data", instanceName = "Default server name", factorioPort = Math.floor(Math.random() * 65535), serversettings = {} } = {}){ this.factorioDirectory = factorioDirectory; this.instanceDirectory = instanceDirectory; this.instanceName = instanceName; this.factorioPort = factorioPort; this.serversettings = Object.assign({ "name": "Clusterio instance: " + this.instanceName, "description": "Public factorio server running clusterio", "tags": ["clusterio"], "max_players": "20", "visibility": "public", "username": "", "token": "", "game_password": "", "verify_user_identity": true, "admins": ["Danielv123"], "allow_commands": true, "autosave_interval": 10, "autosave_slots": 5, "afk_autokick_interval": 0, "auto_pause": false, }, serversettings) // ensure instance exists initialize(); } async initialize(){ if(!isValidInstance()){ await createInstance(); } } async createInstance(path = this.instanceDirectory){ // create folders let folders = [ "/script-output/", "/saves/", "/mods/", "/instanceMods/", ]; fs.mkdirSync(path) folders.forEach(folder => fs.mkdirSync(path + folder)); // create files let files = [ {name: "/script-output/output.txt", content: ""}, {name: "/script-output/orders.txt", content: ""}, {name: "/script-output/txbuffer.txt", content: ""}, {name: "/config.ini", content: "[path]\r\n\ read-data=__PATH__executable__/../../data\r\n\ write-data=__PATH__executable__/../../../instances/" + instance + "\r\n\ "}, {name: "/config.json", content: JSON.stringify({ factorioPort: this.factorioPort, clientPassword: Math.random().toString(36).replace(/[^a-z]+/g, '').substr(0, 8), }, null, 4)}, {name: "/server-settings.json", content: JSON.stringify(this.serversettings)}, ]; files.forEach(file => fs.writeFile(path + file.name, file.content, doneWritingHandler)); let filesToWrite = files.length; function doneWritingHandler(){ if(!--filesToWrite){ return path; } } } isValidInstance(path = this.instanceDirectory){ if(fs.existsSync(instancedirectory)){ return true; } else { return false; } } async createMap(name = "map.zip"){ if(!this.isValidInstance()){ await createInstance(); } } }