From e134d0bd0120377c26b56c5f8bf854a88315e974 Mon Sep 17 00:00:00 2001 From: Mathias Wagner Date: Tue, 13 Feb 2024 18:36:26 +0100 Subject: [PATCH] Created the ServerManager.java --- .../de/gnmyt/mcdash/api/ServerManager.java | 148 ++++++++++++++++++ 1 file changed, 148 insertions(+) create mode 100644 src/main/java/de/gnmyt/mcdash/api/ServerManager.java diff --git a/src/main/java/de/gnmyt/mcdash/api/ServerManager.java b/src/main/java/de/gnmyt/mcdash/api/ServerManager.java new file mode 100644 index 0000000..9d72d63 --- /dev/null +++ b/src/main/java/de/gnmyt/mcdash/api/ServerManager.java @@ -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 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. + *

+ * If the server does not exist, it will return null + *

+ * + * @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()); + } + +}