diff --git a/pom.xml b/pom.xml index cf33e8a..258dabc 100644 --- a/pom.xml +++ b/pom.xml @@ -5,15 +5,15 @@ 4.0.0 org.geysermc - geyser-multi + geyser-connect 1.0-SNAPSHOT - GeyserMulti - Allows for players from Minecraft Bedrock Edition to join Minecraft Java Edition servers via a masterServer list. + GeyserConnect + Allows for players from Minecraft Bedrock Edition to join Minecraft Java Edition servers via a server list. https://geysermc.org - GeyserMulti + GeyserConnect UTF-8 UTF-8 1.8 @@ -65,6 +65,12 @@ 3.31.1 compile + + mysql + mysql-connector-java + 8.0.20 + compile + diff --git a/src/main/java/org/geysermc/connect/GeyserConnectConfig.java b/src/main/java/org/geysermc/connect/GeyserConnectConfig.java index 3003752..87d467e 100644 --- a/src/main/java/org/geysermc/connect/GeyserConnectConfig.java +++ b/src/main/java/org/geysermc/connect/GeyserConnectConfig.java @@ -60,5 +60,17 @@ public class GeyserConnectConfig { @JsonProperty("storage-type") private AbstractStorageManager.StorageType storageType; + + private MySQLConnectionSection mysql; + } + + @Getter + public static class MySQLConnectionSection { + + private String user; + private String pass; + private String database; + private String host; + private int port; } } diff --git a/src/main/java/org/geysermc/connect/storage/AbstractStorageManager.java b/src/main/java/org/geysermc/connect/storage/AbstractStorageManager.java index f620999..431d8ea 100644 --- a/src/main/java/org/geysermc/connect/storage/AbstractStorageManager.java +++ b/src/main/java/org/geysermc/connect/storage/AbstractStorageManager.java @@ -23,7 +23,8 @@ public class AbstractStorageManager { @Getter public enum StorageType { JSON("json", JsonStorageManager.class), - SQLITE("sqlite", SqliteStorageManager.class); + SQLITE("sqlite", SQLiteStorageManager.class), + MYSQL("mysql", MySQLStorageManager.class); @JsonValue private String name; diff --git a/src/main/java/org/geysermc/connect/storage/MySQLStorageManager.java b/src/main/java/org/geysermc/connect/storage/MySQLStorageManager.java new file mode 100644 index 0000000..014dd89 --- /dev/null +++ b/src/main/java/org/geysermc/connect/storage/MySQLStorageManager.java @@ -0,0 +1,70 @@ +package org.geysermc.connect.storage; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.geysermc.connect.GeyserConnectConfig; +import org.geysermc.connect.MasterServer; +import org.geysermc.connect.utils.Player; +import org.geysermc.connect.utils.Server; + +import java.io.IOException; +import java.sql.*; +import java.util.ArrayList; +import java.util.List; + +public class MySQLStorageManager extends AbstractStorageManager { + + private final ObjectMapper mapper = new ObjectMapper(); + + private Connection connection; + + @Override + public void setupStorage() { + try { + Class.forName("com.mysql.cj.jdbc.Driver"); + GeyserConnectConfig.MySQLConnectionSection connectionInfomation = MasterServer.getInstance().getGeyserConnectConfig().getCustomServers().getMysql(); + connection = DriverManager.getConnection("jdbc:mysql://" + connectionInfomation.getHost() + "/" + connectionInfomation.getDatabase(), connectionInfomation.getUser(), connectionInfomation.getPass()); + + Statement createPlayersTable = connection.createStatement(); + createPlayersTable.executeUpdate("CREATE TABLE IF NOT EXISTS players (xuid VARCHAR(32), servers TEXT, PRIMARY KEY(xuid));"); + createPlayersTable.close(); + } catch (ClassNotFoundException | SQLException e) { + MasterServer.getInstance().getLogger().severe("Unable to connect to MySQL 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("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() + "';"); + + while (rs.next()) { + 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/storage/SqliteStorageManager.java b/src/main/java/org/geysermc/connect/storage/SQLiteStorageManager.java similarity index 88% rename from src/main/java/org/geysermc/connect/storage/SqliteStorageManager.java rename to src/main/java/org/geysermc/connect/storage/SQLiteStorageManager.java index 2b9bb85..aef8230 100644 --- a/src/main/java/org/geysermc/connect/storage/SqliteStorageManager.java +++ b/src/main/java/org/geysermc/connect/storage/SQLiteStorageManager.java @@ -12,7 +12,7 @@ import java.sql.*; import java.util.ArrayList; import java.util.List; -public class SqliteStorageManager extends AbstractStorageManager { +public class SQLiteStorageManager extends AbstractStorageManager { private final ObjectMapper mapper = new ObjectMapper(); @@ -56,8 +56,10 @@ public class SqliteStorageManager extends AbstractStorageManager { 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); + while (rs.next()) { + List loadedServers = mapper.readValue(rs.getString("servers"), new TypeReference>() {}); + servers.addAll(loadedServers); + } getPlayersServers.close(); } catch (IOException | SQLException e) { } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index c8ff20c..3b1c7a8 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -42,5 +42,14 @@ custom-servers: max: 10 # Storage engine for custom servers - # Can be json, sqlite + # Can be json, sqlite, mysql storage-type: json + + # Connection details for the mysql storage type + mysql: + user: "geyser_connect" + pass: "" + database: "geyser_connect" + host: "localhost" + port: 3306 +