From 802c21f41ec3f40eae03bb7dfebf70d938acb302 Mon Sep 17 00:00:00 2001 From: Danielv123 Date: Tue, 27 Mar 2018 20:50:10 +0200 Subject: [PATCH] started work on extracting server launching and IO systems --- .gitignore | 6 +- node_modules/_app/factorioServer/index.js | 99 +++++++++++++++++++++++ 2 files changed, 102 insertions(+), 3 deletions(-) create mode 100644 node_modules/_app/factorioServer/index.js diff --git a/.gitignore b/.gitignore index 28d93b55..9d1110aa 100644 --- a/.gitignore +++ b/.gitignore @@ -23,9 +23,9 @@ coverage # Compiled binary addons (http://nodejs.org/api/addons.html) build/Release -# Dependency directory -# https://docs.npmjs.com/misc/faq#should-i-check-my-node-modules-folder-into-git -node_modules +node_modules/* +!node_modules/_app + Factorio* /factorio /instances diff --git a/node_modules/_app/factorioServer/index.js b/node_modules/_app/factorioServer/index.js new file mode 100644 index 00000000..3eee566d --- /dev/null +++ b/node_modules/_app/factorioServer/index.js @@ -0,0 +1,99 @@ +/** + +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(); + } + + } +} \ No newline at end of file