Add sqlite storage manager

This commit is contained in:
rtm516 2020-06-17 00:09:28 +01:00
parent 8a8ea5cd7f
commit 229fab13ca
12 changed files with 96 additions and 16 deletions

View file

@ -59,6 +59,12 @@
<artifactId>terminalconsoleappender</artifactId> <artifactId>terminalconsoleappender</artifactId>
<version>1.1.1</version> <version>1.1.1</version>
</dependency> </dependency>
<dependency>
<groupId>org.xerial</groupId>
<artifactId>sqlite-jdbc</artifactId>
<version>3.31.1</version>
<scope>compile</scope>
</dependency>
</dependencies> </dependencies>
<build> <build>

View file

@ -130,6 +130,7 @@ public class MasterServer {
public void shutdown() { public void shutdown() {
shuttingDown = true; shuttingDown = true;
generalThreadPool.shutdown(); generalThreadPool.shutdown();
storageManager.closeStorage();
if (geyserProxy != null) { if (geyserProxy != null) {
geyserProxy.onDisable(); geyserProxy.onDisable();

View file

@ -6,6 +6,7 @@ import org.geysermc.connect.utils.Logger;
@Log4j2 @Log4j2
public class GeyserProxyLogger extends Logger { public class GeyserProxyLogger extends Logger {
/** /**
* Disable debug messages depending on config * Disable debug messages depending on config
*/ */

View file

@ -8,6 +8,7 @@ import org.geysermc.connect.MasterServer;
import org.geysermc.connect.utils.Player; import org.geysermc.connect.utils.Player;
public class ProxyConnectorServerEventHandler extends ConnectorServerEventHandler { public class ProxyConnectorServerEventHandler extends ConnectorServerEventHandler {
private final GeyserConnector connector; private final GeyserConnector connector;
public ProxyConnectorServerEventHandler(GeyserConnector connector) { public ProxyConnectorServerEventHandler(GeyserConnector connector) {

View file

@ -12,6 +12,8 @@ public class AbstractStorageManager {
public void setupStorage() { } public void setupStorage() { }
public void closeStorage() { }
public void saveServers(Player player) { } public void saveServers(Player player) { }
public List<Server> loadServers(Player player) { public List<Server> loadServers(Player player) {
@ -21,7 +23,7 @@ public class AbstractStorageManager {
@Getter @Getter
public enum StorageType { public enum StorageType {
JSON("json", JsonStorageManager.class), JSON("json", JsonStorageManager.class),
SQLITE("sqlite", AbstractStorageManager.class); SQLITE("sqlite", SqliteStorageManager.class);
@JsonValue @JsonValue
private String name; private String name;

View file

@ -5,41 +5,39 @@ import com.fasterxml.jackson.databind.ObjectMapper;
import org.geysermc.connect.utils.Player; import org.geysermc.connect.utils.Player;
import org.geysermc.connect.utils.Server; import org.geysermc.connect.utils.Server;
import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
public class JsonStorageManager extends AbstractStorageManager { public class JsonStorageManager extends AbstractStorageManager {
private ObjectMapper mapper = new ObjectMapper();
private final ObjectMapper mapper = new ObjectMapper();
private final Path dataFolder = Paths.get("players/");
@Override @Override
public void setupStorage() { public void setupStorage() {
File playersFolder = new File("players/"); if (!dataFolder.toFile().exists()) {
if (!playersFolder.exists()) { dataFolder.toFile().mkdirs();
playersFolder.mkdirs();
} }
} }
@Override @Override
public void saveServers(Player player) { public void saveServers(Player player) {
File dataFile = new File("players/" + player.getXuid() + ".json");
try { try {
mapper.writeValue(dataFile, player.getServers()); mapper.writeValue(dataFolder.resolve(player.getXuid() + ".json").toFile(), player.getServers());
} catch (IOException e) { } } catch (IOException e) { }
} }
@Override @Override
public List<Server> loadServers(Player player) { public List<Server> loadServers(Player player) {
File dataFile = new File("players/" + player.getXuid() + ".json");
List<Server> servers = new ArrayList<>(); List<Server> servers = new ArrayList<>();
if (dataFile.exists()) { try {
try { List<Server> loadedServers = mapper.readValue(dataFolder.resolve(player.getXuid() + ".json").toFile(), new TypeReference<List<Server>>(){});
List<Server> loadedServers = mapper.readValue(dataFile, new TypeReference<List<Server>>(){}); servers.addAll(loadedServers);
servers.addAll(loadedServers); } catch (IOException e) { }
} catch (IOException e) { }
}
return servers; return servers;
} }

View file

@ -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<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() + "';");
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

@ -4,6 +4,7 @@ import lombok.Getter;
@Getter @Getter
public enum FormID { public enum FormID {
MAIN, MAIN,
DIRECT_CONNECT(true), DIRECT_CONNECT(true),
EDIT_SERVERS(true), EDIT_SERVERS(true),

View file

@ -17,6 +17,7 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
public class UIHandler { public class UIHandler {
/** /**
* Create a list of servers for the client based on the passed servers list * Create a list of servers for the client based on the passed servers list
* *

View file

@ -16,6 +16,7 @@ import java.io.InputStream;
* This class is mostly copied from core Geyser * This class is mostly copied from core Geyser
*/ */
public class PalleteManger { public class PalleteManger {
public static final ListTag<CompoundTag> BLOCK_PALLETE; public static final ListTag<CompoundTag> BLOCK_PALLETE;
public static final CompoundTag BIOMES_PALLETE; public static final CompoundTag BIOMES_PALLETE;
public static final byte[] EMPTY_LEVEL_CHUNK_DATA; public static final byte[] EMPTY_LEVEL_CHUNK_DATA;

View file

@ -6,6 +6,7 @@ import lombok.Getter;
@Getter @Getter
@AllArgsConstructor @AllArgsConstructor
public class Server { public class Server {
private String address; private String address;
private int port = 25565; private int port = 25565;

View file

@ -18,7 +18,7 @@ debug-mode: false
max-players: 100 max-players: 100
# MOTD to display # MOTD to display
motd: "GeyserMulti Proxy" motd: "GeyserConnect Proxy"
# Config for the Geyser listener # Config for the Geyser listener
geyser: geyser: