Add mysql storage manager

This commit is contained in:
rtm516 2020-06-17 00:39:37 +01:00
parent 229fab13ca
commit 42c58228f9
6 changed files with 109 additions and 9 deletions

14
pom.xml
View file

@ -5,15 +5,15 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<groupId>org.geysermc</groupId> <groupId>org.geysermc</groupId>
<artifactId>geyser-multi</artifactId> <artifactId>geyser-connect</artifactId>
<version>1.0-SNAPSHOT</version> <version>1.0-SNAPSHOT</version>
<name>GeyserMulti</name> <name>GeyserConnect</name>
<description>Allows for players from Minecraft Bedrock Edition to join Minecraft Java Edition servers via a masterServer list.</description> <description>Allows for players from Minecraft Bedrock Edition to join Minecraft Java Edition servers via a server list.</description>
<url>https://geysermc.org</url> <url>https://geysermc.org</url>
<properties> <properties>
<outputName>GeyserMulti</outputName> <outputName>GeyserConnect</outputName>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.source>1.8</maven.compiler.source>
@ -65,6 +65,12 @@
<version>3.31.1</version> <version>3.31.1</version>
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.20</version>
<scope>compile</scope>
</dependency>
</dependencies> </dependencies>
<build> <build>

View file

@ -60,5 +60,17 @@ public class GeyserConnectConfig {
@JsonProperty("storage-type") @JsonProperty("storage-type")
private AbstractStorageManager.StorageType storageType; 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;
} }
} }

View file

@ -23,7 +23,8 @@ public class AbstractStorageManager {
@Getter @Getter
public enum StorageType { public enum StorageType {
JSON("json", JsonStorageManager.class), JSON("json", JsonStorageManager.class),
SQLITE("sqlite", SqliteStorageManager.class); SQLITE("sqlite", SQLiteStorageManager.class),
MYSQL("mysql", MySQLStorageManager.class);
@JsonValue @JsonValue
private String name; private String name;

View file

@ -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<Server> loadServers(Player player) {
List<Server> servers = new ArrayList<>();
try {
Statement getPlayersServers = connection.createStatement();
ResultSet rs = getPlayersServers.executeQuery("SELECT servers FROM players WHERE xuid='" + player.getXuid() + "';");
while (rs.next()) {
List<Server> loadedServers = mapper.readValue(rs.getString("servers"), new TypeReference<List<Server>>(){});
servers.addAll(loadedServers);
}
getPlayersServers.close();
} catch (IOException | SQLException e) { }
return servers;
}
}

View file

@ -12,7 +12,7 @@ import java.sql.*;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
public class SqliteStorageManager extends AbstractStorageManager { public class SQLiteStorageManager extends AbstractStorageManager {
private final ObjectMapper mapper = new ObjectMapper(); private final ObjectMapper mapper = new ObjectMapper();
@ -56,8 +56,10 @@ public class SqliteStorageManager extends AbstractStorageManager {
Statement getPlayersServers = connection.createStatement(); Statement getPlayersServers = connection.createStatement();
ResultSet rs = getPlayersServers.executeQuery("SELECT servers FROM players WHERE xuid='" + player.getXuid() + "';"); ResultSet rs = getPlayersServers.executeQuery("SELECT servers FROM players WHERE xuid='" + player.getXuid() + "';");
while (rs.next()) {
List<Server> loadedServers = mapper.readValue(rs.getString("servers"), new TypeReference<List<Server>>() {}); List<Server> loadedServers = mapper.readValue(rs.getString("servers"), new TypeReference<List<Server>>() {});
servers.addAll(loadedServers); servers.addAll(loadedServers);
}
getPlayersServers.close(); getPlayersServers.close();
} catch (IOException | SQLException e) { } } catch (IOException | SQLException e) { }

View file

@ -42,5 +42,14 @@ custom-servers:
max: 10 max: 10
# Storage engine for custom servers # Storage engine for custom servers
# Can be json, sqlite # Can be json, sqlite, mysql
storage-type: json storage-type: json
# Connection details for the mysql storage type
mysql:
user: "geyser_connect"
pass: ""
database: "geyser_connect"
host: "localhost"
port: 3306