Add address config and start of server list edit

This commit is contained in:
rtm516 2020-06-16 20:06:12 +01:00
parent 3679fd5034
commit ff54bd4580
7 changed files with 110 additions and 23 deletions

View file

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

View file

@ -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() {

View file

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

View file

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

View file

@ -26,9 +26,6 @@ public class UIHandler {
public static FormWindow getServerList(List<Server> 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<Server> 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<Server> servers = new ArrayList<>(MasterServer.getInstance().getGeyserMultiConfig().getServers());
servers.addAll(player.getServers());
Server server = servers.get(data.getClickedButtonId() - 2);
// 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);
break;
}
}
/**
* 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();
}
}

View file

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

View file

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