More functionality in factorioServer and added unit tests

This commit is contained in:
Danielv123 committed 2018-03-28 21:00:38 +02:00
1 parent fff1989897
commit e1ab5b4d91
2 files changed
+110 -19

No files matched your search

+56 -19
View File
@@ -11,14 +11,23 @@ This class has the responsiblity of :
*/
const fs = require("fs");
const child_process = require("child_process");
class factorioServer {
const mkdirp = require("mkdirp");
const fileOps = require("_app/fileOps");
module.exports = class factorioServer {
constructor({
factorioDirectory = "./../../factorio",
instanceDirectory = "./../../instances/data",
factorioDirectory = "factorio",
instanceDirectory = "instances/data",
instanceName = "Default server name",
factorioPort = Math.floor(Math.random() * 65535),
serversettings = {}
serversettings = {},
onProgress = function(type, a, b, c){
if(type == "progress") console.log("Progress: ",a," of ",b," unit: ",c);
if(type == "log") console.log(a);
},
} = {}){
this.factorioDirectory = factorioDirectory;
this.instanceDirectory = instanceDirectory;
@@ -40,18 +49,22 @@ class factorioServer {
"autosave_slots": 5,
"afk_autokick_interval": 0,
"auto_pause": false,
}, serversettings)
// ensure instance exists
initialize();
}, serversettings);
this.onProgress = (type, a, b, c) => {
if(typeof onProgress == "function") onProgress(type, a, b, c);
};
}
async initialize(){
if(!isValidInstance()){
await createInstance();
if(!await this.isValidInstance()){
await this.createInstance();
}
return true;
}
async createInstance(path = this.instanceDirectory){
if(await this.isValidInstance(path)){
throw new Error("Instance already exists!");
}
// create folders
let folders = [
"/script-output/",
@@ -59,7 +72,7 @@ class factorioServer {
"/mods/",
"/instanceMods/",
];
fs.mkdirSync(path)
mkdirp.sync(path);
folders.forEach(folder => fs.mkdirSync(path + folder));
// create files
@@ -67,14 +80,17 @@ class factorioServer {
{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.ini", content: "[path]\r\n\ read-data=__PATH__executable__/../../data\r\n\ write-data=__PATH__executable__/../../../" + this.instanceDirectory + "\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)},
{name: "/server-settings.json", content: JSON.stringify(this.serversettings, null, 4)},
];
files.forEach(file => fs.writeFile(path + file.name, file.content, doneWritingHandler));
files.forEach(file => {
fs.writeFile(path + file.name, file.content, doneWritingHandler);
// console.log("Created: ",path+file.name);
});
let filesToWrite = files.length;
function doneWritingHandler(){
@@ -83,17 +99,38 @@ class factorioServer {
}
}
}
isValidInstance(path = this.instanceDirectory){
if(fs.existsSync(instancedirectory)){
async deleteInstance(path = this.instanceDirectory){
if(await this.isValidInstance(path)){
await fileOps.deleteFolderRecursive(path);
return true;
} else {
return false;
}
}
isValidInstance(path = this.instanceDirectory){
return new Promise((resolve, reject) => {
fs.stat(path, (err, stat) => {
if(err){
// console.log(err)
resolve(false);
} else {
// console.log(stat)
resolve(true);
}
});
});
}
async createMap(name = "map.zip"){
if(!this.isValidInstance()){
if(!await this.isValidInstance()){
await createInstance();
}
this.onProgress("log", "Starting map creation");
child_process.spawnSync(
'./'+this.factorioDirectory + '/bin/x64/factorio', [
'-c', this.instanceDirectory + '/config.ini',
'--create', this.instanceDirectory + '/saves/'+name,
]
);
this.onProgress("log", "Map created");
}
}