feat(sql): player storage

This commit is contained in:
aro 2023-01-23 16:26:53 +01:00
parent 2d2e315793
commit 72c2c5ed12
3 changed files with 52 additions and 17 deletions

View file

@ -8,6 +8,7 @@ import net.artelnatif.nicko.disguise.NickoProfile;
import net.artelnatif.nicko.i18n.I18NDict; import net.artelnatif.nicko.i18n.I18NDict;
import net.artelnatif.nicko.storage.Storage; import net.artelnatif.nicko.storage.Storage;
import net.artelnatif.nicko.storage.StorageProvider; import net.artelnatif.nicko.storage.StorageProvider;
import net.artelnatif.nicko.storage.sql.SQLStorageProvider;
import java.io.*; import java.io.*;
import java.util.Optional; import java.util.Optional;
@ -16,13 +17,20 @@ import java.util.UUID;
public class JSONStorage extends Storage { public class JSONStorage extends Storage {
private final NickoBukkit instance; private final NickoBukkit instance;
private JSONStorageProvider provider;
final Gson gson = new GsonBuilder().serializeNulls().setPrettyPrinting().create(); final Gson gson = new GsonBuilder().serializeNulls().setPrettyPrinting().create();
final File directory = new File(NickoBukkit.getInstance().getDataFolder() + "/players/"); final File directory = new File(NickoBukkit.getInstance().getDataFolder() + "/players/");
public JSONStorage(NickoBukkit instance) { this.instance = instance; } public JSONStorage(NickoBukkit instance) { this.instance = instance; }
@Override @Override
public StorageProvider getProvider() { return new JSONStorageProvider(directory); } public StorageProvider getProvider() {
if (provider == null) {
provider = new JSONStorageProvider(directory);
}
return provider;
}
@Override @Override
public ActionResult<Void> store(UUID uuid, NickoProfile profile) { public ActionResult<Void> store(UUID uuid, NickoProfile profile) {

View file

@ -6,20 +6,29 @@ import net.artelnatif.nicko.disguise.NickoProfile;
import net.artelnatif.nicko.i18n.I18NDict; import net.artelnatif.nicko.i18n.I18NDict;
import net.artelnatif.nicko.storage.Storage; import net.artelnatif.nicko.storage.Storage;
import java.sql.*; import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Optional; import java.util.Optional;
import java.util.UUID; import java.util.UUID;
public class SQLStorage extends Storage { public class SQLStorage extends Storage {
private final NickoBukkit instance; private final NickoBukkit instance;
private SQLStorageProvider provider;
public SQLStorage(NickoBukkit instance) { public SQLStorage(NickoBukkit instance) {
this.instance = instance; this.instance = instance;
} }
@Override @Override
public SQLStorageProvider getProvider() { public SQLStorageProvider getProvider() {
return new SQLStorageProvider(instance); if (provider == null) {
provider = new SQLStorageProvider(instance);
}
return provider;
} }
@Override @Override
@ -27,21 +36,21 @@ public class SQLStorage extends Storage {
final Connection connection = getProvider().getConnection(); final Connection connection = getProvider().getConnection();
try { try {
final String sql = """ final String sql = """
INSERT INTO nicko.DATA INSERT IGNORE INTO nicko.DATA
(uuid, name, skin, bungeecord) (`uuid`, `name`, `skin`, `bungeecord`)
VALUES VALUES
(?, ?, ?, ?) (?, ?, ?, ?)
ON DUPLICATE KEY UPDATE uuid = %s """;
""".formatted(uuid.toString());
final PreparedStatement statement = connection.prepareStatement(sql); final PreparedStatement statement = connection.prepareStatement(sql);
statement.setObject(0, uuid); statement.setObject(1, uuidToBin(uuid));
statement.setString(1, profile.getName()); statement.setString(2, profile.getName());
statement.setString(2, profile.getSkin()); statement.setString(3, profile.getSkin());
statement.setBoolean(3, profile.isBungeecordTransfer()); statement.setBoolean(4, profile.isBungeecordTransfer());
statement.executeUpdate();
return new ActionResult<>(); return new ActionResult<>();
} catch (SQLException e) { } catch (SQLException e) {
instance.getLogger().warning("Unable to store player."); instance.getLogger().warning("Unable to store player. (%s)".formatted(e.getMessage()));
return new ActionResult<>(I18NDict.Error.SQL_ERROR); return new ActionResult<>(I18NDict.Error.SQL_ERROR);
} }
} }
@ -55,4 +64,18 @@ public class SQLStorage extends Storage {
public Optional<NickoProfile> retrieve(UUID uuid) { public Optional<NickoProfile> retrieve(UUID uuid) {
return Optional.empty(); return Optional.empty();
} }
private byte[] uuidToBin(UUID uuid) {
final byte[] uuidBytes = new byte[16];
final ByteBuffer buffer = ByteBuffer.wrap(uuidBytes)
.order(ByteOrder.BIG_ENDIAN)
.putLong(uuid.getMostSignificantBits())
.putLong(uuid.getLeastSignificantBits());
return buffer.array();
}
private UUID binToUUID(byte[] array) {
final ByteBuffer buffer = ByteBuffer.wrap(array);
return new UUID(buffer.getLong(), buffer.getLong());
}
} }

View file

@ -3,15 +3,16 @@ package net.artelnatif.nicko.storage.sql;
import net.artelnatif.nicko.NickoBukkit; import net.artelnatif.nicko.NickoBukkit;
import net.artelnatif.nicko.config.NickoConfiguration; import net.artelnatif.nicko.config.NickoConfiguration;
import net.artelnatif.nicko.storage.StorageProvider; import net.artelnatif.nicko.storage.StorageProvider;
import org.mariadb.jdbc.MariaDbDataSource;
import java.sql.Connection; import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement; import java.sql.PreparedStatement;
import java.sql.SQLException; import java.sql.SQLException;
public class SQLStorageProvider implements StorageProvider { public class SQLStorageProvider implements StorageProvider {
private final NickoBukkit instance; private final NickoBukkit instance;
private Connection connection; private Connection connection;
private MariaDbDataSource dataSource;
private final String schemaName = "nicko"; private final String schemaName = "nicko";
@ -23,9 +24,11 @@ public class SQLStorageProvider implements StorageProvider {
public boolean init() { public boolean init() {
try { try {
final NickoConfiguration config = instance.getNickoConfig(); final NickoConfiguration config = instance.getNickoConfig();
connection = DriverManager.getConnection("jdbc:mariadb://" + config.getSQLAddress(), dataSource = new MariaDbDataSource();
config.getSQLUsername(), dataSource.setUrl("jdbc:mariadb://" + config.getSQLAddress());
config.getSQLPassword()); dataSource.setUser(config.getSQLUsername());
dataSource.setPassword(config.getSQLPassword());
connection = dataSource.getConnection();
final boolean initialized = connection != null && !connection.isClosed(); final boolean initialized = connection != null && !connection.isClosed();
if (!initialized) return false; if (!initialized) return false;
@ -37,6 +40,7 @@ public class SQLStorageProvider implements StorageProvider {
createTable(); createTable();
return true; return true;
} catch (SQLException e) { } catch (SQLException e) {
e.printStackTrace();
return false; return false;
} }
} }
@ -57,7 +61,7 @@ public class SQLStorageProvider implements StorageProvider {
final String query = """ final String query = """
CREATE TABLE IF NOT EXISTS %s.DATA ( CREATE TABLE IF NOT EXISTS %s.DATA (
uuid uuid NOT NULL, uuid binary(16) NOT NULL,
name varchar(16) NOT NULL, name varchar(16) NOT NULL,
skin varchar(16) NOT NULL, skin varchar(16) NOT NULL,
bungeecord boolean NOT NULL, bungeecord boolean NOT NULL,