Add automatic shutdown when proxy is empty

This commit is contained in:
rtm516 2020-06-19 16:16:16 +01:00
parent 166006594b
commit 03979f2808
5 changed files with 40 additions and 4 deletions

View file

@ -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

View file

@ -76,6 +76,9 @@ public class GeyserConnectConfig {
@JsonProperty("debug-mode")
private boolean debugMode;
@JsonProperty("shutdown-time")
private int shutdownTime;
}
@Getter

View file

@ -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;
}
}
}

View file

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

View file

@ -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"