Skip to content

Commit 7bd1b7a

Browse files
authored
Merge pull request #25 from oof2win2/wip1
Server Backup Restoration
2 parents 55c43ff + fa8d9ed commit 7bd1b7a

File tree

4 files changed

+151
-31
lines changed

4 files changed

+151
-31
lines changed

.gitignore

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
/banlist-full.json
22
/botconfig.json
33
/ecosystem.config.js
4-
/node_modules
4+
/node_modules
5+
test.js

commands/factorio/restoreSave.js

+134
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
const { sendToAll, bubbleSort } = require('../../functions')
2+
const fs = require('fs')
3+
const { exec } = require("child_process")
4+
const { absPath } = require('../../botconfig.json');
5+
const Discord = require('discord.js')
6+
7+
module.exports = {
8+
config: {
9+
name: 'restoresave',
10+
aliases: ['restore', 'getbackup'],
11+
usage: '<save name>',
12+
category: 'factorio',
13+
description: 'Restores a save',
14+
accessableby: 'Moderators'
15+
},
16+
run: async (client, message, args) => {
17+
let authRoles = message.member.roles.cache
18+
if (authRoles.some(r => r.name === 'Admin') || authRoles.some(r => r.name === 'Moderator') || authRoles.some(r => r.name === 'dev')) {
19+
if (!args[0]) { // no argument at all
20+
let choiceEmbed = new Discord.MessageEmbed()
21+
.setTitle('Server Rollback Choices')
22+
.setDescription('Choices of a Factorio Server Rollback. This shows **all** folders in the `servers` directory, some may not be Factorio server folders')
23+
.setColor('GREEN')
24+
.setAuthor(`${message.guild.me.displayName} Help`, message.guild.iconURL)
25+
.setThumbnail(client.user.displayAvatarURL())
26+
.setFooter(
27+
${message.guild.me.displayName} | Developed by DistroByte & oof2win2 | Total Commands: ${client.commands.size}`,
28+
client.user.displayAvatarURL()
29+
)
30+
let dirData = fs.readdirSync('../servers/')
31+
dirData = bubbleSort(dirData);
32+
dirData.forEach(dir => {
33+
if (fs.statSync('../servers/'+dir).isDirectory()) choiceEmbed.addField(`\`${dir}\``, '\u200B'); //check if it is a directory and if yes add it to the embed
34+
});
35+
return message.channel.send(choiceEmbed)
36+
}
37+
if (!args[1]) { // no second argument, only server name
38+
let choiceEmbed = new Discord.MessageEmbed()
39+
.setTitle('Server Rollback Choices')
40+
.setDescription('Choices of a Factorio Server Rollback. This shows **all** .zip files, some may not be Factorio saves')
41+
.setColor('GREEN')
42+
.setAuthor(`${message.guild.me.displayName} Help`, message.guild.iconURL)
43+
.setThumbnail(client.user.displayAvatarURL())
44+
.setFooter(
45+
${message.guild.me.displayName} | Developed by DistroByte & oof2win2 | Total Commands: ${client.commands.size}`,
46+
client.user.displayAvatarURL()
47+
)
48+
let dir = '../servers/'+args[0]
49+
let dirData = fs.readdirSync(dir) // add in all file names that end with .zip
50+
51+
//sort dirData by date last modified
52+
dirData = dirData.map(function (fileName) {
53+
return {
54+
name: fileName,
55+
time: fs.statSync(dir + '/' + fileName).mtime.getTime()
56+
};
57+
})
58+
.sort(function (a, b) {
59+
return a.time - b.time; })
60+
.map(function (v) {
61+
return v.name; });
62+
63+
64+
for (let i = 0; i < 25; i++) { // max number of fields in a Discord Embed is 25
65+
if (!dirData[i]) break;
66+
if (dirData[i] && dirData[i].endsWith('.zip')) {
67+
let data = fs.statSync(dir+'/'+dirData[i])
68+
let date = new Date(data.birthtimeMs)
69+
}
70+
}
71+
72+
choiceEmbed.addField(`\`${dirData[i]}\``, `Save created on: ${date.toUTCString()}`);
73+
74+
return message.channel.send(choiceEmbed)
75+
}
76+
if (args[0] && args[1]) { // both server name and save name are provided
77+
let choiceEmbed = new Discord.MessageEmbed()
78+
.setTitle('Server Rollback')
79+
.setDescription('Server restore success.')
80+
.setColor('GREEN')
81+
.setAuthor(`${message.guild.me.displayName} Help`, message.guild.iconURL)
82+
.setThumbnail(client.user.displayAvatarURL())
83+
.setFooter(
84+
${message.guild.me.displayName} | Developed by DistroByte & oof2win2 | Total Commands: ${client.commands.size}`,
85+
client.user.displayAvatarURL()
86+
)
87+
.addField(`Rolling back server \`${args[0]}\` to save \`${args[1]}\``, '\u200B');
88+
exec(absPath+'/'+args[0]+'/factorio-init/factorio stop', (error, stdout, stderr) => { //stop the factorio server
89+
if (error) {
90+
console.log(`server restore: stop error: ${error.message}`);
91+
message.channel.send(`server restore: stop error: ${error.message}`)
92+
return;
93+
}
94+
if (stderr) {
95+
console.log(`server restore: stop stderr: ${stderr}`);
96+
message.channel.send(`server restore: stop stderr: ${stderr}`)
97+
return;
98+
}
99+
console.log(`server restore: stop stdout: ${stdout}`);
100+
message.channel.send(`server restore: stop stdout: ${stdout}`);
101+
});
102+
exec(absPath+'/'+args[0]+'/factorio-init/factorio load-save '+args[1], (error, stdout, stderr) => { //reload save of the factorio server
103+
if (error) {
104+
console.log(`server restore: load error: ${error.message}`);
105+
message.channel.send(`server restore: load error: ${error.message}`);
106+
return;
107+
}
108+
if (stderr) {
109+
console.log(`server restore: load stderr: ${stderr}`);
110+
message.channel.send((`server restore: load stderr: ${stderr}`));
111+
return;
112+
}
113+
console.log(`server restore: load stdout: ${stdout}`);
114+
message.channel.send(`server restore: load stdout: ${stdout}`);
115+
});
116+
exec(absPath+'/'+args[0]+'/factorio-init/factorio start', (error, stdout, stderr) => { //start the factorio server
117+
if (error) {
118+
console.log(`server restore: start error: ${error.message}`);
119+
message.channel.send(`server restore: start error: ${error.message}`);
120+
return;
121+
}
122+
if (stderr) {
123+
console.log(`server restore: start stderr: ${stderr}`);
124+
message.channel.send(`server restore: start stderr: ${stderr}`);
125+
return;
126+
}
127+
console.log(`server restore: start stdout: ${stdout}`);
128+
message.channel.send(`server restore: start stdout: ${stdout}`);
129+
});
130+
return message.channel.send(choiceEmbed);
131+
}
132+
}
133+
}
134+
}

functions.js

+15
Original file line numberDiff line numberDiff line change
@@ -234,4 +234,19 @@ module.exports = {
234234
return 0;
235235
}
236236
},
237+
bubbleSort: function (arr) {
238+
var len = arr.length;
239+
240+
for (var i = 0; i < len ; i++) {
241+
for(var j = 0 ; j < len - i - 1; j++){
242+
if (arr[j] > arr[j + 1]) {
243+
// swap
244+
var temp = arr[j];
245+
arr[j] = arr[j+1];
246+
arr[j + 1] = temp;
247+
}
248+
}
249+
}
250+
return arr;
251+
}
237252
}

testJSON.js

-30
This file was deleted.

0 commit comments

Comments
 (0)