diff --git a/pom.xml b/pom.xml index f2fd10a..cf33e8a 100644 --- a/pom.xml +++ b/pom.xml @@ -59,6 +59,12 @@ terminalconsoleappender 1.1.1 + + org.xerial + sqlite-jdbc + 3.31.1 + compile + diff --git a/src/main/java/org/geysermc/connect/MasterServer.java b/src/main/java/org/geysermc/connect/MasterServer.java index ad3a412..9289048 100644 --- a/src/main/java/org/geysermc/connect/MasterServer.java +++ b/src/main/java/org/geysermc/connect/MasterServer.java @@ -130,6 +130,7 @@ public class MasterServer { public void shutdown() { shuttingDown = true; generalThreadPool.shutdown(); + storageManager.closeStorage(); if (geyserProxy != null) { geyserProxy.onDisable(); diff --git a/src/main/java/org/geysermc/connect/proxy/GeyserProxyLogger.java b/src/main/java/org/geysermc/connect/proxy/GeyserProxyLogger.java index f9a7ec2..818947c 100644 --- a/src/main/java/org/geysermc/connect/proxy/GeyserProxyLogger.java +++ b/src/main/java/org/geysermc/connect/proxy/GeyserProxyLogger.java @@ -6,6 +6,7 @@ import org.geysermc.connect.utils.Logger; @Log4j2 public class GeyserProxyLogger extends Logger { + /** * Disable debug messages depending on config */ diff --git a/src/main/java/org/geysermc/connect/proxy/ProxyConnectorServerEventHandler.java b/src/main/java/org/geysermc/connect/proxy/ProxyConnectorServerEventHandler.java index cd95550..c3ad835 100644 --- a/src/main/java/org/geysermc/connect/proxy/ProxyConnectorServerEventHandler.java +++ b/src/main/java/org/geysermc/connect/proxy/ProxyConnectorServerEventHandler.java @@ -8,6 +8,7 @@ import org.geysermc.connect.MasterServer; import org.geysermc.connect.utils.Player; public class ProxyConnectorServerEventHandler extends ConnectorServerEventHandler { + private final GeyserConnector connector; public ProxyConnectorServerEventHandler(GeyserConnector connector) { diff --git a/src/main/java/org/geysermc/connect/storage/AbstractStorageManager.java b/src/main/java/org/geysermc/connect/storage/AbstractStorageManager.java index dd04fb5..f620999 100644 --- a/src/main/java/org/geysermc/connect/storage/AbstractStorageManager.java +++ b/src/main/java/org/geysermc/connect/storage/AbstractStorageManager.java @@ -12,6 +12,8 @@ public class AbstractStorageManager { public void setupStorage() { } + public void closeStorage() { } + public void saveServers(Player player) { } public List loadServers(Player player) { @@ -21,7 +23,7 @@ public class AbstractStorageManager { @Getter public enum StorageType { JSON("json", JsonStorageManager.class), - SQLITE("sqlite", AbstractStorageManager.class); + SQLITE("sqlite", SqliteStorageManager.class); @JsonValue private String name; diff --git a/src/main/java/org/geysermc/connect/storage/JsonStorageManager.java b/src/main/java/org/geysermc/connect/storage/JsonStorageManager.java index ee257b8..7ed13ec 100644 --- a/src/main/java/org/geysermc/connect/storage/JsonStorageManager.java +++ b/src/main/java/org/geysermc/connect/storage/JsonStorageManager.java @@ -5,41 +5,39 @@ import com.fasterxml.jackson.databind.ObjectMapper; import org.geysermc.connect.utils.Player; import org.geysermc.connect.utils.Server; -import java.io.File; import java.io.IOException; +import java.nio.file.Path; +import java.nio.file.Paths; import java.util.ArrayList; import java.util.List; public class JsonStorageManager extends AbstractStorageManager { - private ObjectMapper mapper = new ObjectMapper(); + + private final ObjectMapper mapper = new ObjectMapper(); + private final Path dataFolder = Paths.get("players/"); @Override public void setupStorage() { - File playersFolder = new File("players/"); - if (!playersFolder.exists()) { - playersFolder.mkdirs(); + if (!dataFolder.toFile().exists()) { + dataFolder.toFile().mkdirs(); } } @Override public void saveServers(Player player) { - File dataFile = new File("players/" + player.getXuid() + ".json"); try { - mapper.writeValue(dataFile, player.getServers()); + mapper.writeValue(dataFolder.resolve(player.getXuid() + ".json").toFile(), 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) { } - } + try { + List loadedServers = mapper.readValue(dataFolder.resolve(player.getXuid() + ".json").toFile(), new TypeReference>(){}); + servers.addAll(loadedServers); + } catch (IOException e) { } return servers; } diff --git a/src/main/java/org/geysermc/connect/storage/SqliteStorageManager.java b/src/main/java/org/geysermc/connect/storage/SqliteStorageManager.java new file mode 100644 index 0000000..2b9bb85 --- /dev/null +++ b/src/main/java/org/geysermc/connect/storage/SqliteStorageManager.java @@ -0,0 +1,67 @@ +package org.geysermc.connect.storage; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.geysermc.connect.MasterServer; +import org.geysermc.connect.utils.Player; +import org.geysermc.connect.utils.Server; + +import java.io.File; +import java.io.IOException; +import java.sql.*; +import java.util.ArrayList; +import java.util.List; + +public class SqliteStorageManager extends AbstractStorageManager { + + private final ObjectMapper mapper = new ObjectMapper(); + + private Connection connection; + + @Override + public void setupStorage() { + try { + Class.forName("org.sqlite.JDBC"); + connection = DriverManager.getConnection("jdbc:sqlite:players.db"); + + Statement createPlayersTable = connection.createStatement(); + createPlayersTable.executeUpdate("CREATE TABLE IF NOT EXISTS players (xuid TEXT, servers TEXT, PRIMARY KEY(xuid));"); + createPlayersTable.close(); + } catch (ClassNotFoundException | SQLException e) { + MasterServer.getInstance().getLogger().severe("Unable to load sqlite database!", e); + } + } + + @Override + public void closeStorage() { + try { + connection.close(); + } catch (SQLException e) { } + } + + @Override + public void saveServers(Player player) { + try { + Statement updatePlayersServers = connection.createStatement(); + updatePlayersServers.executeUpdate("INSERT OR REPLACE INTO players(xuid, servers) VALUES('" + player.getXuid() + "', '" + mapper.writeValueAsString(player.getServers()) + "');"); + updatePlayersServers.close(); + } catch (IOException | SQLException e) { } + } + + @Override + public List loadServers(Player player) { + List servers = new ArrayList<>(); + + try { + Statement getPlayersServers = connection.createStatement(); + ResultSet rs = getPlayersServers.executeQuery("SELECT servers FROM players WHERE xuid='" + player.getXuid() + "';"); + + List loadedServers = mapper.readValue(rs.getString("servers"), new TypeReference>(){}); + servers.addAll(loadedServers); + + getPlayersServers.close(); + } catch (IOException | SQLException e) { } + + return servers; + } +} diff --git a/src/main/java/org/geysermc/connect/ui/FormID.java b/src/main/java/org/geysermc/connect/ui/FormID.java index 68317dd..1188998 100644 --- a/src/main/java/org/geysermc/connect/ui/FormID.java +++ b/src/main/java/org/geysermc/connect/ui/FormID.java @@ -4,6 +4,7 @@ import lombok.Getter; @Getter public enum FormID { + MAIN, DIRECT_CONNECT(true), EDIT_SERVERS(true), diff --git a/src/main/java/org/geysermc/connect/ui/UIHandler.java b/src/main/java/org/geysermc/connect/ui/UIHandler.java index b1722c6..77b84da 100644 --- a/src/main/java/org/geysermc/connect/ui/UIHandler.java +++ b/src/main/java/org/geysermc/connect/ui/UIHandler.java @@ -17,6 +17,7 @@ import java.util.ArrayList; import java.util.List; public class UIHandler { + /** * Create a list of servers for the client based on the passed servers list * diff --git a/src/main/java/org/geysermc/connect/utils/PalleteManger.java b/src/main/java/org/geysermc/connect/utils/PalleteManger.java index f08c4a2..4d6bdcd 100644 --- a/src/main/java/org/geysermc/connect/utils/PalleteManger.java +++ b/src/main/java/org/geysermc/connect/utils/PalleteManger.java @@ -16,6 +16,7 @@ import java.io.InputStream; * This class is mostly copied from core Geyser */ public class PalleteManger { + public static final ListTag BLOCK_PALLETE; public static final CompoundTag BIOMES_PALLETE; public static final byte[] EMPTY_LEVEL_CHUNK_DATA; diff --git a/src/main/java/org/geysermc/connect/utils/Server.java b/src/main/java/org/geysermc/connect/utils/Server.java index 9c5b2f7..8ab0298 100644 --- a/src/main/java/org/geysermc/connect/utils/Server.java +++ b/src/main/java/org/geysermc/connect/utils/Server.java @@ -6,6 +6,7 @@ import lombok.Getter; @Getter @AllArgsConstructor public class Server { + private String address; private int port = 25565; diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index bf82930..c8ff20c 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -18,7 +18,7 @@ debug-mode: false max-players: 100 # MOTD to display -motd: "GeyserMulti Proxy" +motd: "GeyserConnect Proxy" # Config for the Geyser listener geyser: