-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathMinecraftServerManager.js
More file actions
148 lines (143 loc) · 4.34 KB
/
Copy pathMinecraftServerManager.js
File metadata and controls
148 lines (143 loc) · 4.34 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
const axios = require("axios").default;
const fs = require("fs");
const Zip = require("adm-zip");
const path = require("path");
const { exec } = require("child_process");
var url;
if (!fs.existsSync(path.join(__dirname, "server_data"))) {
fs.mkdirSync(path.join(__dirname, "server_data"));
}
WriteServerProperties = (binary) => {
return new Promise(async (resolve, reject) => {
fs.writeFile(path.join(__dirname, "server_data", "server.properties"), binary, () => resolve());
});
};
ExecuteServerJar = async () => {
return new Promise(async (resolve, reject) => {
console.log("Starting Server");
console.log(path.join(__dirname, "mcserver.jar"));
const child = exec("java -Xms32m -Xmx512M -jar " + path.join(__dirname, "mcserver.jar") + " nogui", {
cwd: path.join(__dirname, "server_data"),
});
child.stdout.on("data", (data) => {
if (data.indexOf("Done") !== -1) {
resolve(child);
console.log("Server has started, now joinable");
}
console.log(data);
});
child.stderr.on("data", (data) => {
console.log(data);
});
});
};
class ServerManager {
constructor(dbx, ngrok) {
this.dbx = dbx;
this.ngrok = ngrok;
}
StartServer = async () => {
return new Promise(async (resolve, reject) => {
await this.ngrok.Start();
url = this.ngrok.GetUrl();
console.log(url);
console.log("Executing server");
this.createServerConfig();
const child = await ExecuteServerJar();
resolve(child);
});
};
BackupServer = () => {
return new Promise(async (resolve, reject) => {
console.log("Beginning server backup");
var zip = new Zip();
zip.addLocalFolder(path.join(__dirname, "server_data"));
this.dbx.filesUpload({
path: "/world.zip",
contents: zip.toBuffer(),
mode: { ".tag": "overwrite" },
});
resolve("Backup Complete");
});
};
InitializeServerFolder = () => {
if (!fs.existsSync(path.join(__dirname, "server_data"))) {
fs.mkdirSync(path.join(__dirname, "server_data"));
}
};
createServerConfig = () => {
return new Promise(async (resolve, reject) => {
fs.writeFile(path.join(__dirname, "server_data", "eula.txt"), "eula=true", (err) => {
if (err) reject(err.response);
});
const serverPropertiesFile = await this.dbx.filesDownload({ path: "/server.properties" });
fs.writeFile(
path.join(__dirname, "server_data", "server.properties"),
serverPropertiesFile.fileBinary,
(err) => {
if (err) reject(err.response);
resolve();
}
);
});
};
DownloadMinecraftJar = (linkToVersion) => {
return new Promise(async (resolve, reject) => {
const jarFile = await axios.get(linkToVersion, { responseType: "stream" });
jarFile.data
.pipe(fs.createWriteStream("mcserver.jar"))
.on("finish", () => resolve())
.on("error", () => reject());
});
};
DownloadServerMinecraftWorld = () => {
return new Promise(async (resolve, reject) => {
const worldFile = await this.dbx.filesDownload({ path: "/world.zip" });
var zip = new Zip(worldFile.fileBinary);
console.log("Extracting world");
zip.extractAllToAsync(path.join(__dirname, "server_data"), true, (err) => {
if (err) reject(err.response);
resolve();
});
});
};
DownloadServerProperties = () => {
return new Promise(async (resolve, reject) => {
const serverPropertiesFile = await this.dbx.filesDownload({ path: "/server.properties" });
WriteServerProperties(serverPropertiesFile.fileBinary);
fs.readFile(path.join(__dirname, "server_data", "server.properties"), "utf8", (err, data) => {
const properties = JSON.stringify(
data.split("\n").map((propRaw) => {
const [property, value] = propRaw.split("=");
return { property, value };
})
);
resolve(properties);
});
});
};
UploadServerProperties = (properties) => {
return new Promise(async (resolve, reject) => {
const basePath = path.join(__dirname, "server.properties");
let stringProp = "";
properties.forEach((property) => (stringProp += `${property.name}=${property.value}\n`));
console.log(properties);
fs.writeFile(basePath, stringProp, () => {});
fs.readFile(basePath, "utf8", (err, res) => {
this.dbx
.filesUpload({
path: "/server.properties",
contents: res,
mode: { ".tag": "overwrite" },
})
.then((res) => {
console.log("updated properties");
resolve();
});
});
});
};
}
module.exports = ServerManager;
/*
}; */