diff --git a/src/main/java/de/redstonecloud/bridge/platform/waterdogpe/WDPEHandler.java b/src/main/java/de/redstonecloud/bridge/platform/waterdogpe/WDPEHandler.java index 55d2682..5ee57e2 100644 --- a/src/main/java/de/redstonecloud/bridge/platform/waterdogpe/WDPEHandler.java +++ b/src/main/java/de/redstonecloud/bridge/platform/waterdogpe/WDPEHandler.java @@ -1,5 +1,6 @@ package de.redstonecloud.bridge.platform.waterdogpe; +import com.google.gson.JsonObject; import de.redstonecloud.api.redis.broker.packet.defaults.template.BestTemplateResultPacket; import de.redstonecloud.api.redis.broker.packet.defaults.template.GetBestTemplatePacket; import de.redstonecloud.bridge.cloudinterface.CloudInterface; @@ -29,12 +30,12 @@ public WDPEHandler( @Override public ServerInfo resolveForcedHost(@Nullable String domain, @NonNull ProxiedPlayer player) { - return fetchServer(); + return fetchServer(player); } @Override public ServerInfo getFallbackServer(ProxiedPlayer player, ServerInfo oldServer, ReconnectReason reason, String kickMessage) { - return fetchServer(); + return fetchServer(player); } @Override @@ -43,16 +44,33 @@ public ServerInfo getFallbackServer( @NonNull ServerInfo oldServer, @NonNull String kickMessage ) { - return fetchServer(); + return fetchServer(player); } @Override public ServerInfo determineServer(ProxiedPlayer player) { - return fetchServer(); + return fetchServer(player); } - public static ServerInfo fetchServer() { - if(!CloudInterface.getBridgeConfig().has("hub_template")) return null; + public static ServerInfo fetchServer(ProxiedPlayer player) { + JsonObject cfg = CloudInterface.getBridgeConfig(); + ServerInfo fallback = fetchFallback(); + if(!cfg.has("hub_template")) return fallback; + boolean fallbackOnJoin = !cfg.has("fallback_on_join") || cfg.get("fallback_on_join").getAsBoolean(); + + if(!cfg.has("hub_template")) + return fallback; + + ServerInfo hub = fetchHub(); + if(hub != null) return hub; + + if(player.getDownstreamConnection() != null && fallbackOnJoin) + return fallback; + + return null; + } + + public static ServerInfo fetchHub() { CompletableFuture name = new CompletableFuture<>(); new GetBestTemplatePacket(CloudInterface.getBridgeConfig().get("hub_template").getAsString()) @@ -61,9 +79,17 @@ public static ServerInfo fetchServer() { try { BridgeServer srv = CloudInterface.getExecutor().determineServer(name.completeOnTimeout("", 3, TimeUnit.SECONDS).get().toUpperCase()); + if(srv == null) return null; + return ProxyServer.getInstance().getServerInfo(srv.getName()); } catch (Exception e) { return null; } } + + public static ServerInfo fetchFallback() { + JsonObject cfg = CloudInterface.getBridgeConfig(); + if(!cfg.has("fallback_name")) return null; + return ProxyServer.getInstance().getServerInfo(cfg.get("fallback_name").getAsString()); + } } diff --git a/src/main/java/de/redstonecloud/bridge/platform/waterdogpe/commands/HubCommand.java b/src/main/java/de/redstonecloud/bridge/platform/waterdogpe/commands/HubCommand.java index 63a9040..d93c29d 100644 --- a/src/main/java/de/redstonecloud/bridge/platform/waterdogpe/commands/HubCommand.java +++ b/src/main/java/de/redstonecloud/bridge/platform/waterdogpe/commands/HubCommand.java @@ -19,7 +19,7 @@ public HubCommand() { @Override public boolean onExecute(CommandSender sender, String alias, String[] args) { if(!(sender instanceof ProxiedPlayer)) return false; - ServerInfo hub = WDPEHandler.fetchServer(); + ServerInfo hub = WDPEHandler.fetchServer((ProxiedPlayer) sender); if(hub == null) { sender.sendMessage(CloudInterface.getBridgeConfig().has("hubcommand_no_hub_available") ? CloudInterface.getBridgeConfig().get("hubcommand_no_hub_available").getAsString() : "No hub available"); return true;