diff --git a/src/main/java/org/geysermc/multi/GeyserMultiConfig.java b/src/main/java/org/geysermc/multi/GeyserMultiConfig.java index 9b2e80c..dc2fc03 100644 --- a/src/main/java/org/geysermc/multi/GeyserMultiConfig.java +++ b/src/main/java/org/geysermc/multi/GeyserMultiConfig.java @@ -5,7 +5,7 @@ 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.storage.AbstractStorageManager; import org.geysermc.multi.utils.Server; import java.util.List; @@ -59,6 +59,6 @@ public class GeyserMultiConfig { private int max; @JsonProperty("storage-type") - private PlayerStorageManager.StorageType storageType; + private AbstractStorageManager.StorageType storageType; } } diff --git a/src/main/java/org/geysermc/multi/MasterServer.java b/src/main/java/org/geysermc/multi/MasterServer.java index 586ac71..169ee0b 100644 --- a/src/main/java/org/geysermc/multi/MasterServer.java +++ b/src/main/java/org/geysermc/multi/MasterServer.java @@ -5,9 +5,9 @@ import com.nukkitx.protocol.bedrock.v390.Bedrock_v390; import lombok.Getter; import org.geysermc.connector.utils.FileUtils; import org.geysermc.multi.proxy.GeyserProxyBootstrap; +import org.geysermc.multi.storage.AbstractStorageManager; import org.geysermc.multi.utils.Logger; import org.geysermc.multi.utils.Player; -import org.geysermc.multi.utils.PlayerStorageManager; import java.io.File; import java.io.IOException; @@ -48,6 +48,9 @@ public class MasterServer { @Getter private GeyserMultiConfig geyserMultiConfig; + @Getter + private AbstractStorageManager storageManager; + public MasterServer() { this.instance = this; @@ -72,7 +75,14 @@ public class MasterServer { TimerTask task = new TimerTask() { public void run() { } }; timer.scheduleAtFixedRate(task, 0L, 1000L); - PlayerStorageManager.setupStorage(); + try { + storageManager = geyserMultiConfig.getCustomServers().getStorageType().getStorageManager().newInstance(); + } catch (Exception e) { + logger.severe("Invalid storage manager class!", e); + return; + } + + storageManager.setupStorage(); start(geyserMultiConfig.getPort()); diff --git a/src/main/java/org/geysermc/multi/PacketHandler.java b/src/main/java/org/geysermc/multi/PacketHandler.java index 7fa7c59..feb39cf 100644 --- a/src/main/java/org/geysermc/multi/PacketHandler.java +++ b/src/main/java/org/geysermc/multi/PacketHandler.java @@ -40,6 +40,7 @@ public class PacketHandler implements BedrockPacketHandler { public void disconnect(DisconnectReason reason) { if (player != null) { masterServer.getLogger().info(player.getDisplayName() + " has disconnected from the master server (" + reason + ")"); + masterServer.getStorageManager().saveServers(player); } } diff --git a/src/main/java/org/geysermc/multi/storage/AbstractStorageManager.java b/src/main/java/org/geysermc/multi/storage/AbstractStorageManager.java new file mode 100644 index 0000000..9fdb868 --- /dev/null +++ b/src/main/java/org/geysermc/multi/storage/AbstractStorageManager.java @@ -0,0 +1,36 @@ +package org.geysermc.multi.storage; + +import com.fasterxml.jackson.annotation.JsonValue; +import lombok.Getter; +import org.geysermc.multi.utils.Player; +import org.geysermc.multi.utils.Server; + +import java.util.ArrayList; +import java.util.List; + +public class AbstractStorageManager { + + public void setupStorage() { } + + public void saveServers(Player player) { } + + public List loadServers(Player player) { + return new ArrayList<>(); + } + + @Getter + public enum StorageType { + JSON("json", JsonStorageManager.class), + SQLITE("sqlite", AbstractStorageManager.class); + + @JsonValue + private String name; + + private Class storageManager; + + StorageType(String name, Class storageManager) { + this.name = name; + this.storageManager = storageManager; + } + } +} diff --git a/src/main/java/org/geysermc/multi/storage/JsonStorageManager.java b/src/main/java/org/geysermc/multi/storage/JsonStorageManager.java new file mode 100644 index 0000000..c4ac4c5 --- /dev/null +++ b/src/main/java/org/geysermc/multi/storage/JsonStorageManager.java @@ -0,0 +1,46 @@ +package org.geysermc.multi.storage; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.geysermc.multi.utils.Player; +import org.geysermc.multi.utils.Server; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +public class JsonStorageManager extends AbstractStorageManager { + private ObjectMapper mapper = new ObjectMapper(); + + @Override + public void setupStorage() { + File playersFolder = new File("players/"); + if (!playersFolder.exists()) { + playersFolder.mkdirs(); + } + } + + @Override + public void saveServers(Player player) { + File dataFile = new File("players/" + player.getXuid() + ".json"); + try { + mapper.writeValue(dataFile, player.getServers()); + } catch (IOException e) { } + } + + @Override + public List loadServers(Player player) { + File dataFile = new File("players/" + player.getXuid() + ".json"); + List servers = new ArrayList<>(); + + if (dataFile.exists()) { + try { + List loadedServers = mapper.readValue(dataFile, new TypeReference>(){}); + servers.addAll(loadedServers); + } catch (IOException e) { } + } + + return servers; + } +} diff --git a/src/main/java/org/geysermc/multi/ui/UIHandler.java b/src/main/java/org/geysermc/multi/ui/UIHandler.java index 9438e82..50620f9 100644 --- a/src/main/java/org/geysermc/multi/ui/UIHandler.java +++ b/src/main/java/org/geysermc/multi/ui/UIHandler.java @@ -41,6 +41,8 @@ public class UIHandler { window.getButtons().add(new FormButton("Direct connect")); } + window.getButtons().add(new FormButton("Disconnect")); + return window; } @@ -96,7 +98,10 @@ public class UIHandler { servers.addAll(player.getServers()); // Cant be done in a switch as we need to calculate the last 2 buttons - if (data.getClickedButtonId() == servers.size()) { + + if ((!MasterServer.getInstance().getGeyserMultiConfig().getCustomServers().isEnabled() && data.getClickedButtonId() == servers.size()) || data.getClickedButtonId() == servers.size() + 2) { + player.getSession().disconnect("Bye!"); // Seems to be super slow if we specify an empty string + } else 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()); diff --git a/src/main/java/org/geysermc/multi/utils/Player.java b/src/main/java/org/geysermc/multi/utils/Player.java index f68bec5..9b0f152 100644 --- a/src/main/java/org/geysermc/multi/utils/Player.java +++ b/src/main/java/org/geysermc/multi/utils/Player.java @@ -46,7 +46,7 @@ public class Player { // Should fetch the servers from some form of db if (MasterServer.getInstance().getGeyserMultiConfig().getCustomServers().isEnabled()) { - servers.addAll(PlayerStorageManager.loadServers(this)); + servers.addAll(MasterServer.getInstance().getStorageManager().loadServers(this)); } } diff --git a/src/main/java/org/geysermc/multi/utils/PlayerStorageManager.java b/src/main/java/org/geysermc/multi/utils/PlayerStorageManager.java deleted file mode 100644 index 1b34b19..0000000 --- a/src/main/java/org/geysermc/multi/utils/PlayerStorageManager.java +++ /dev/null @@ -1,51 +0,0 @@ -package org.geysermc.multi.utils; - -import com.fasterxml.jackson.annotation.JsonValue; -import org.geysermc.multi.MasterServer; -import sun.reflect.generics.reflectiveObjects.NotImplementedException; - -import java.io.File; -import java.util.ArrayList; -import java.util.List; - -public class PlayerStorageManager { - - public static void setupStorage() { - if (!MasterServer.getInstance().getGeyserMultiConfig().getCustomServers().isEnabled()) { - return; - } - - switch (MasterServer.getInstance().getGeyserMultiConfig().getCustomServers().getStorageType()) { - case JSON: - File playersFolder = new File("players/"); - if (!playersFolder.exists()) { - playersFolder.mkdirs(); - } - break; - case SQLITE: - throw new NotImplementedException(); - } - } - - public static void saveServers(Player player, List servers) { - - } - - public static List loadServers(Player player) { - List servers = new ArrayList<>(); - servers.add(new Server("81.174.164.211", 25580)); - return servers; - } - - public enum StorageType { - JSON("json"), - SQLITE("sqlite"); - - @JsonValue - private String name; - - StorageType(String name) { - this.name = name; - } - } -}