diff --git a/README.md b/README.md index d795c75..eb88b18 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ GeyserConnect is a server that Minecraft: Bedrock Edition clients can connect to - [x] Add - [x] Remove - [x] Edit -- [ ] Stop Geyser server after its idle for a while +- [x] Stop Geyser server after its idle for a while - [x] Config file - [x] Fix server images not loading straight away on Win10 - [x] Per server online/offline mode diff --git a/src/main/java/org/geysermc/connect/GeyserConnectConfig.java b/src/main/java/org/geysermc/connect/GeyserConnectConfig.java index fee1963..707b362 100644 --- a/src/main/java/org/geysermc/connect/GeyserConnectConfig.java +++ b/src/main/java/org/geysermc/connect/GeyserConnectConfig.java @@ -76,6 +76,9 @@ public class GeyserConnectConfig { @JsonProperty("debug-mode") private boolean debugMode; + + @JsonProperty("shutdown-time") + private int shutdownTime; } @Getter diff --git a/src/main/java/org/geysermc/connect/MasterServer.java b/src/main/java/org/geysermc/connect/MasterServer.java index a59d0ab..a7b5dc3 100644 --- a/src/main/java/org/geysermc/connect/MasterServer.java +++ b/src/main/java/org/geysermc/connect/MasterServer.java @@ -29,6 +29,7 @@ package org.geysermc.connect; import com.nukkitx.protocol.bedrock.*; import com.nukkitx.protocol.bedrock.v390.Bedrock_v390; import lombok.Getter; +import lombok.Setter; import org.geysermc.connect.utils.Server; import org.geysermc.connector.utils.FileUtils; import org.geysermc.connect.proxy.GeyserProxyBootstrap; @@ -78,6 +79,10 @@ public class MasterServer { @Getter private AbstractStorageManager storageManager; + @Setter + @Getter + private long lastDisconnectTime = 0l; + public MasterServer() { this.instance = this; @@ -97,6 +102,8 @@ public class MasterServer { this.generalThreadPool = Executors.newScheduledThreadPool(32); + boolean enableShutdownTimer = geyserConnectConfig.getGeyser().getShutdownTime() != -1; + // Start a timer to keep the thread running timer = new Timer(); TimerTask task = new TimerTask() { public void run() { } }; @@ -157,9 +164,7 @@ public class MasterServer { public void shutdown() { shuttingDown = true; - if (geyserProxy != null) { - geyserProxy.onDisable(); - } + shutdownGeyserProxy(); generalThreadPool.shutdown(); storageManager.closeStorage(); @@ -172,4 +177,11 @@ public class MasterServer { geyserProxy.onEnable(); } } + + public void shutdownGeyserProxy() { + if (geyserProxy != null) { + geyserProxy.onDisable(); + geyserProxy = null; + } + } } diff --git a/src/main/java/org/geysermc/connect/proxy/ProxyConnectorServerEventHandler.java b/src/main/java/org/geysermc/connect/proxy/ProxyConnectorServerEventHandler.java index ba19dee..ce97608 100644 --- a/src/main/java/org/geysermc/connect/proxy/ProxyConnectorServerEventHandler.java +++ b/src/main/java/org/geysermc/connect/proxy/ProxyConnectorServerEventHandler.java @@ -32,6 +32,8 @@ import org.geysermc.connector.network.ConnectorServerEventHandler; import org.geysermc.connect.MasterServer; import org.geysermc.connect.utils.Player; +import java.util.concurrent.TimeUnit; + public class ProxyConnectorServerEventHandler extends ConnectorServerEventHandler { private final GeyserConnector connector; @@ -56,6 +58,21 @@ public class ProxyConnectorServerEventHandler extends ConnectorServerEventHandle if (player != null) { MasterServer.getInstance().getLogger().debug("Player disconnected from Geyser proxy: " + player.getDisplayName() + " (" + disconnectReason + ")"); MasterServer.getInstance().getPlayers().remove(session.getAuthData().getXboxUUID()); + + // Set the last disconnect time + MasterServer.getInstance().setLastDisconnectTime(System.currentTimeMillis()); + + int shutdownTime = MasterServer.getInstance().getGeyserConnectConfig().getGeyser().getShutdownTime(); + + if (shutdownTime != -1) { + MasterServer.getInstance().getGeneralThreadPool().schedule(() -> { + if (System.currentTimeMillis() - MasterServer.getInstance().getLastDisconnectTime() > shutdownTime * 1000 + && connector != null + && connector.getPlayers().size() <= 0) { + MasterServer.getInstance().shutdownGeyserProxy(); + } + }, shutdownTime, TimeUnit.SECONDS); + } } }); } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 3b1c7a8..861ffc7 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -28,6 +28,10 @@ geyser: # If debug messages should be sent through console, has to be enabled in both places to work debug-mode: false + # The time to wait after the last player disconnects to shutdown the proxy + # In seconds, set to -1 to disable + shutdown-time: 300 + # A global list of servers sent to all clients servers: - address: "play.cubecraft.net"