mirror of
https://github.com/clusterio/clusterio.git
synced 2026-11-12 07:04:52 +09:00
99 lines
2.5 KiB
JavaScript
99 lines
2.5 KiB
JavaScript
/**
|
|
|
|
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();
|
|
}
|
|
|
|
}
|
|
} |