From ff54bd4580f60be77ab0f4464251e1a2f9db871f Mon Sep 17 00:00:00 2001 From: rtm516 Date: Tue, 16 Jun 2020 20:06:12 +0100 Subject: [PATCH] Add address config and start of server list edit --- .../org/geysermc/multi/GeyserMultiConfig.java | 13 +++ .../java/org/geysermc/multi/MasterServer.java | 6 +- .../org/geysermc/multi/PacketHandler.java | 2 +- .../java/org/geysermc/multi/ui/FormID.java | 16 +++- .../java/org/geysermc/multi/ui/UIHandler.java | 86 +++++++++++++++---- .../java/org/geysermc/multi/utils/Player.java | 4 +- src/main/resources/config.yml | 6 ++ 7 files changed, 110 insertions(+), 23 deletions(-) diff --git a/src/main/java/org/geysermc/multi/GeyserMultiConfig.java b/src/main/java/org/geysermc/multi/GeyserMultiConfig.java index e0ee894..9b2e80c 100644 --- a/src/main/java/org/geysermc/multi/GeyserMultiConfig.java +++ b/src/main/java/org/geysermc/multi/GeyserMultiConfig.java @@ -4,6 +4,7 @@ package org.geysermc.multi; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Getter; +import org.geysermc.connector.utils.WebUtils; import org.geysermc.multi.utils.PlayerStorageManager; import org.geysermc.multi.utils.Server; @@ -13,6 +14,11 @@ import java.util.List; @JsonIgnoreProperties(ignoreUnknown = true) public class GeyserMultiConfig { + private String address; + + @JsonProperty("remote-address") + private String remoteAddress; + private int port; @JsonProperty("max-players") @@ -30,6 +36,13 @@ public class GeyserMultiConfig { @JsonProperty("custom-servers") private CustomServersSection customServers; + public void checkRemoteIP() { + if ("auto".equals(remoteAddress)) { + remoteAddress = WebUtils.getBody("https://icanhazip.com/").trim(); + MasterServer.getInstance().getLogger().debug("Auto set remote IP to: " + remoteAddress); + } + } + @Getter public static class GeyserConfigSection { diff --git a/src/main/java/org/geysermc/multi/MasterServer.java b/src/main/java/org/geysermc/multi/MasterServer.java index a23a7fc..586ac71 100644 --- a/src/main/java/org/geysermc/multi/MasterServer.java +++ b/src/main/java/org/geysermc/multi/MasterServer.java @@ -63,6 +63,8 @@ public class MasterServer { logger.setDebug(geyserMultiConfig.isDebugMode()); + geyserMultiConfig.checkRemoteIP(); + this.generalThreadPool = Executors.newScheduledThreadPool(32); // Start a timer to keep the thread running @@ -80,7 +82,7 @@ public class MasterServer { private void start(int port) { logger.info("Starting..."); - InetSocketAddress bindAddress = new InetSocketAddress("0.0.0.0", port); + InetSocketAddress bindAddress = new InetSocketAddress(geyserMultiConfig.getAddress(), port); bdServer = new BedrockServer(bindAddress); bdPong = new BedrockPong(); @@ -112,7 +114,7 @@ public class MasterServer { // Start server up bdServer.bind().join(); - logger.info("Server started on 0.0.0.0:" + port); + logger.info("Server started on " + geyserMultiConfig.getAddress() + ":" + port); } public void shutdown() { diff --git a/src/main/java/org/geysermc/multi/PacketHandler.java b/src/main/java/org/geysermc/multi/PacketHandler.java index 3285410..7fa7c59 100644 --- a/src/main/java/org/geysermc/multi/PacketHandler.java +++ b/src/main/java/org/geysermc/multi/PacketHandler.java @@ -170,7 +170,7 @@ public class PacketHandler implements BedrockPacketHandler { window.setResponse(packet.getFormData().trim()); // Resend the form if they closed it - if (window.getResponse() == null && id != FormID.DIRECT_CONNECT) { + if (window.getResponse() == null && !id.isHandlesNull()) { player.resendWindow(); } else { // Send the response to the correct response function diff --git a/src/main/java/org/geysermc/multi/ui/FormID.java b/src/main/java/org/geysermc/multi/ui/FormID.java index 4d8763d..3b27fcf 100644 --- a/src/main/java/org/geysermc/multi/ui/FormID.java +++ b/src/main/java/org/geysermc/multi/ui/FormID.java @@ -1,15 +1,29 @@ package org.geysermc.multi.ui; +import lombok.Getter; + +@Getter public enum FormID { MAIN, - DIRECT_CONNECT, + DIRECT_CONNECT(true), + EDIT_SERVERS(true), ADD_SERVER, REMOVE_SERVER, CONNECTING, ERROR; + private boolean handlesNull; + private static final FormID[] VALUES = values(); + FormID() { + this(false); + } + + FormID(boolean handlesNull) { + this.handlesNull = handlesNull; + } + public static FormID fromId(int id) { return id >= 0 && id < VALUES.length ? VALUES[id] : ERROR; } diff --git a/src/main/java/org/geysermc/multi/ui/UIHandler.java b/src/main/java/org/geysermc/multi/ui/UIHandler.java index 83d93c6..9438e82 100644 --- a/src/main/java/org/geysermc/multi/ui/UIHandler.java +++ b/src/main/java/org/geysermc/multi/ui/UIHandler.java @@ -26,9 +26,6 @@ public class UIHandler { public static FormWindow getServerList(List servers) { SimpleFormWindow window = new SimpleFormWindow("Servers", ""); - window.getButtons().add(new FormButton("Direct connect")); - window.getButtons().add(new FormButton("Edit servers")); - // Add a button for each global server for (Server server : MasterServer.getInstance().getGeyserMultiConfig().getServers()) { window.getButtons().add(new FormButton(server.toString(), new FormImage(FormImage.FormImageType.URL, "https://eu.mc-api.net/v3/server/favicon/" + server.getAddress() + ":" + server.getPort() + ".png"))); @@ -39,6 +36,9 @@ public class UIHandler { for (Server server : servers) { window.getButtons().add(new FormButton(server.toString(), new FormImage(FormImage.FormImageType.URL, "https://eu.mc-api.net/v3/server/favicon/" + server.getAddress() + ":" + server.getPort() + ".png"))); } + + window.getButtons().add(new FormButton("Edit servers")); + window.getButtons().add(new FormButton("Direct connect")); } return window; @@ -68,6 +68,23 @@ public class UIHandler { return window; } + /** + * Create a list of servers for the client to edit + * + * @param servers A list of {@link Server} objects + * @return A {@link SimpleFormWindow} object + */ + public static FormWindow getEditServerList(List servers) { + SimpleFormWindow window = new SimpleFormWindow("Edit Servers", "Select a server to edit"); + + // Add a button for each personal server + for (Server server : servers) { + window.getButtons().add(new FormButton(server.toString(), new FormImage(FormImage.FormImageType.URL, "https://eu.mc-api.net/v3/server/favicon/" + server.getAddress() + ":" + server.getPort() + ".png"))); + } + + return window; + } + /** * Handle the server list response * @@ -75,23 +92,28 @@ public class UIHandler { * @param data The form response data */ public static void handleServerListResponse(Player player, SimpleFormResponse data) { - switch (data.getClickedButtonId()) { - case 0: - player.sendWindow(FormID.DIRECT_CONNECT, getDirectConnect()); - break; - case 1: - break; - default: - // Get the server - List servers = new ArrayList<>(MasterServer.getInstance().getGeyserMultiConfig().getServers()); - servers.addAll(player.getServers()); - Server server = servers.get(data.getClickedButtonId() - 2); + List servers = new ArrayList<>(MasterServer.getInstance().getGeyserMultiConfig().getServers()); + servers.addAll(player.getServers()); - player.sendToServer(server); - break; + // Cant be done in a switch as we need to calculate the last 2 buttons + if (data.getClickedButtonId() == servers.size()) { + player.sendWindow(FormID.EDIT_SERVERS, getEditServerList(player.getServers())); + } else if (data.getClickedButtonId() == servers.size() + 1) { + player.sendWindow(FormID.DIRECT_CONNECT, getDirectConnect()); + } else { + // Get the server + Server server = servers.get(data.getClickedButtonId()); + + player.sendToServer(server); } } + /** + * Handle the direct connect response + * + * @param player The player that submitted the response + * @param data The form response data + */ public static void handleDirectConnectResponse(Player player, CustomFormResponse data) { // Take them back to the main menu if they close the direct connect window if (data == null) { @@ -99,6 +121,36 @@ public class UIHandler { return; } - player.sendToServer(new Server(data.getInputResponses().get(0), Integer.valueOf(data.getInputResponses().get(1)))); + try { + String address = data.getInputResponses().get(0); + int port = Integer.valueOf(data.getInputResponses().get(1)); + + // Make sure we got an address and port + if (address == null || "".equals(address) || port <= 0 || port >= 65535) { + player.resendWindow(); + return; + } + + player.sendToServer(new Server(address, port)); + } catch (NumberFormatException e) { + player.resendWindow(); + } + } + + /** + * Handle the edit server list response + * + * @param player The player that submitted the response + * @param data The form response data + */ + public static void handleEditServerListResponse(Player player, SimpleFormResponse data) { + // Take them back to the main menu if they close the edit server list window + if (data == null) { + player.sendWindow(FormID.MAIN, getServerList(player.getServers()));; + return; + } + + // Just redisplay the form for now + player.resendWindow(); } } diff --git a/src/main/java/org/geysermc/multi/utils/Player.java b/src/main/java/org/geysermc/multi/utils/Player.java index bfea51f..f68bec5 100644 --- a/src/main/java/org/geysermc/multi/utils/Player.java +++ b/src/main/java/org/geysermc/multi/utils/Player.java @@ -155,8 +155,8 @@ public class Player { */ public void connectToProxy() { TransferPacket transferPacket = new TransferPacket(); - transferPacket.setAddress("127.0.0.1"); // Need to find a good way of getting this - transferPacket.setPort(MasterServer.getInstance().getGeyserProxy().getGeyserConfig().getBedrock().getPort()); + transferPacket.setAddress(MasterServer.getInstance().getGeyserMultiConfig().getRemoteAddress()); + transferPacket.setPort(MasterServer.getInstance().getGeyserMultiConfig().getGeyser().getPort()); session.sendPacket(transferPacket); } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index de7829f..41edb0c 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -2,6 +2,12 @@ # GeyserMulti Configuration File # -------------------------------- +# The IP address that will listen for connections +address: 0.0.0.0 + +# The IP address remote clients use to connect, can be set to 'auto' to fetch from the web +remote-address: auto + # The port that will listen for connections port: 19132