Created the ServerManager.java
This commit is contained in:
parent
f65423b27f
commit
e134d0bd01
148
src/main/java/de/gnmyt/mcdash/api/ServerManager.java
Normal file
148
src/main/java/de/gnmyt/mcdash/api/ServerManager.java
Normal file
@ -0,0 +1,148 @@
|
|||||||
|
package de.gnmyt.mcdash.api;
|
||||||
|
|
||||||
|
import de.gnmyt.mcdash.MCDashWrapper;
|
||||||
|
import de.gnmyt.mcdash.entities.Server;
|
||||||
|
import de.gnmyt.mcdash.entities.ServerConfiguration;
|
||||||
|
import de.gnmyt.mcdash.entities.ServerStatus;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
public class ServerManager {
|
||||||
|
|
||||||
|
private static final Logger LOG = new Logger(ServerManager.class);
|
||||||
|
private static final ServerVersionManager versionManager = new ServerVersionManager();
|
||||||
|
private final ArrayList<Server> servers = new ArrayList<>();
|
||||||
|
|
||||||
|
private final File serverFolder;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Basic constructor of the {@link ServerManager}
|
||||||
|
*/
|
||||||
|
public ServerManager() {
|
||||||
|
this.serverFolder = MCDashWrapper.getDataSource("servers");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initializes the server manager
|
||||||
|
*/
|
||||||
|
public void initialize() {
|
||||||
|
if (!serverFolder.exists() && !serverFolder.mkdirs()) {
|
||||||
|
LOG.error("An error occurred while creating the server folder");
|
||||||
|
}
|
||||||
|
|
||||||
|
refreshServers();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Starts all servers
|
||||||
|
*/
|
||||||
|
public void startServers() {
|
||||||
|
LOG.info("Starting all servers...");
|
||||||
|
|
||||||
|
servers.forEach(server -> {
|
||||||
|
if (server.getStatus() == ServerStatus.ONLINE) return;
|
||||||
|
startServer(server);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Stops all servers
|
||||||
|
*/
|
||||||
|
public void stopServers() {
|
||||||
|
LOG.info("Stopping all servers...");
|
||||||
|
|
||||||
|
servers.forEach(server -> {
|
||||||
|
if (server.getStatus() == ServerStatus.OFFLINE) return;
|
||||||
|
stopServer(server);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Refreshes the servers
|
||||||
|
*/
|
||||||
|
public void refreshServers() {
|
||||||
|
servers.stream().filter(server -> server.getStatus() == ServerStatus.OFFLINE).forEach(servers::remove);
|
||||||
|
|
||||||
|
for (File file : serverFolder.listFiles()) {
|
||||||
|
if (file.isDirectory() && new File(file, "mcdash.json").exists()) {
|
||||||
|
if (getServer(file.getName()) != null) continue;
|
||||||
|
|
||||||
|
servers.add(new Server(file.getName(), ServerStatus.OFFLINE, new File(file, "mcdash.json")));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets a server by its name.
|
||||||
|
* <p>
|
||||||
|
* If the server does not exist, it will return null
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @param name The name of the server
|
||||||
|
* @return the server with the given name
|
||||||
|
*/
|
||||||
|
public Server getServer(String name) {
|
||||||
|
return servers.stream().filter(server -> server.getName().equals(name)).findFirst().orElse(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Starts a server
|
||||||
|
* @param server The server you want to start
|
||||||
|
*/
|
||||||
|
public void startServer(Server server) {
|
||||||
|
if (server.getStatus() == ServerStatus.ONLINE) return;
|
||||||
|
LOG.info("Starting server {}", server.getName());
|
||||||
|
|
||||||
|
ServerConfiguration config = server.getConfiguration();
|
||||||
|
|
||||||
|
try {
|
||||||
|
ProcessBuilder processBuilder = new ProcessBuilder("java", "-jar", "-Xmx" + config.getMemory() + "M",
|
||||||
|
"-Xms" + config.getMemory() + "M", "-Dcom.mojang.eula.agree=true", // "-Djava.awt.headless=true",
|
||||||
|
versionManager.getPath(config.getType(), config.getVersion())//, "nogui"
|
||||||
|
);
|
||||||
|
processBuilder.directory(new File(serverFolder, server.getName()));
|
||||||
|
Process process = processBuilder.start();
|
||||||
|
|
||||||
|
server.keepAlive();
|
||||||
|
|
||||||
|
server.setStatus(ServerStatus.ONLINE);
|
||||||
|
server.setProcess(process);
|
||||||
|
} catch (Exception e) {
|
||||||
|
LOG.error("An error occurred while starting the server", e);
|
||||||
|
}
|
||||||
|
|
||||||
|
LOG.info("Server {} has been started", server.getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Stops a server
|
||||||
|
* @param server The server you want to stop
|
||||||
|
*/
|
||||||
|
public void stopServer(Server server) {
|
||||||
|
if (server.getStatus() == ServerStatus.OFFLINE) return;
|
||||||
|
|
||||||
|
LOG.info("Stopping server {}", server.getName());
|
||||||
|
|
||||||
|
try {
|
||||||
|
server.getProcess().getOutputStream().write("stop\n".getBytes());
|
||||||
|
|
||||||
|
for (int i = 0; i < 10; i++) {
|
||||||
|
if (server.getProcess().isAlive()) {
|
||||||
|
Thread.sleep(1000);
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
server.getProcess().destroy();
|
||||||
|
server.setStatus(ServerStatus.OFFLINE);
|
||||||
|
server.setProcess(null);
|
||||||
|
} catch (Exception e) {
|
||||||
|
LOG.error("An error occurred while stopping the server", e);
|
||||||
|
}
|
||||||
|
|
||||||
|
LOG.info("Server {} has been stopped", server.getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Reference in New Issue
Block a user