This commit is contained in:
gpatruno
2026-05-19 15:35:55 +02:00
commit 94404156d9
55 changed files with 4518 additions and 0 deletions
@@ -0,0 +1,396 @@
package com.spaceshipproject;
import org.bukkit.entity.Player;
import java.io.File;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
/**
* Gestionnaire de la base de données SQLite.
*
* Tables :
* - players(uuid, name, settings, created_at, updated_at)
* - spaceships(id, owner_uuid, name, size_x/y/z, spawn_x/y/z, schematic, settings, created_at, updated_at)
* - spaceships_loaded(spaceship_id, world, origin_x/y/z, loaded_at)
*/
public class DatabaseManager {
private final SpaceShipProject plugin;
private Connection connection;
public DatabaseManager(SpaceShipProject plugin) {
this.plugin = plugin;
}
public void initialize() {
try {
File dataFolder = plugin.getDataFolder();
if (!dataFolder.exists()) {
dataFolder.mkdirs();
}
File dbFile = new File(dataFolder, "spaceships.db");
connection = DriverManager.getConnection("jdbc:sqlite:" + dbFile.getAbsolutePath());
try (Statement stmt = connection.createStatement()) {
stmt.execute("PRAGMA foreign_keys = ON;");
}
createTables();
plugin.getLogger().info("Base de donnees SpaceShipProject initialisee.");
} catch (SQLException e) {
plugin.getLogger().severe("Erreur a l'initialisation de la base : " + e.getMessage());
}
}
public void close() {
try {
if (connection != null && !connection.isClosed()) {
connection.close();
}
} catch (SQLException e) {
plugin.getLogger().severe("Erreur a la fermeture de la base : " + e.getMessage());
}
}
private void createTables() throws SQLException {
String players = """
CREATE TABLE IF NOT EXISTS players (
uuid TEXT PRIMARY KEY,
name TEXT,
settings TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
""";
String spaceships = """
CREATE TABLE IF NOT EXISTS spaceships (
id INTEGER PRIMARY KEY AUTOINCREMENT,
owner_uuid TEXT NOT NULL,
name TEXT NOT NULL,
size_x INTEGER NOT NULL,
size_y INTEGER NOT NULL,
size_z INTEGER NOT NULL,
spawn_x INTEGER NOT NULL,
spawn_y INTEGER NOT NULL,
spawn_z INTEGER NOT NULL,
schematic TEXT,
settings TEXT,
level INTEGER NOT NULL DEFAULT 1,
money INTEGER NOT NULL DEFAULT 0,
last_loaded_level INTEGER NOT NULL DEFAULT 1,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (owner_uuid) REFERENCES players(uuid) ON DELETE CASCADE
)
""";
String loaded = """
CREATE TABLE IF NOT EXISTS spaceships_loaded (
spaceship_id INTEGER PRIMARY KEY,
world TEXT NOT NULL,
origin_x INTEGER NOT NULL,
origin_y INTEGER NOT NULL,
origin_z INTEGER NOT NULL,
loaded_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (spaceship_id) REFERENCES spaceships(id) ON DELETE CASCADE
)
""";
try (Statement stmt = connection.createStatement()) {
stmt.execute(players);
stmt.execute(spaceships);
stmt.execute(loaded);
// Migrations (idempotentes) pour les bases creees avant l'ajout de level/money.
tryAlter(stmt, "ALTER TABLE spaceships ADD COLUMN level INTEGER NOT NULL DEFAULT 1");
tryAlter(stmt, "ALTER TABLE spaceships ADD COLUMN money INTEGER NOT NULL DEFAULT 0");
tryAlter(stmt, "ALTER TABLE spaceships ADD COLUMN last_loaded_level INTEGER NOT NULL DEFAULT 1");
}
}
private void tryAlter(Statement stmt, String sql) {
try { stmt.execute(sql); } catch (SQLException ignored) { /* colonne deja presente */ }
}
/* ========================= PLAYERS ========================= */
public void upsertPlayer(Player player) {
String sql = """
INSERT INTO players(uuid, name, updated_at)
VALUES(?, ?, CURRENT_TIMESTAMP)
ON CONFLICT(uuid) DO UPDATE SET name = excluded.name, updated_at = CURRENT_TIMESTAMP
""";
try (PreparedStatement stmt = connection.prepareStatement(sql)) {
stmt.setString(1, player.getUniqueId().toString());
stmt.setString(2, player.getName());
stmt.executeUpdate();
} catch (SQLException e) {
plugin.getLogger().severe("Erreur upsertPlayer : " + e.getMessage());
}
}
public void setPlayerSettings(UUID uuid, String settingsJson) {
String sql = "UPDATE players SET settings = ?, updated_at = CURRENT_TIMESTAMP WHERE uuid = ?";
try (PreparedStatement stmt = connection.prepareStatement(sql)) {
stmt.setString(1, settingsJson);
stmt.setString(2, uuid.toString());
stmt.executeUpdate();
} catch (SQLException e) {
plugin.getLogger().severe("Erreur setPlayerSettings : " + e.getMessage());
}
}
public String getPlayerSettings(UUID uuid) {
String sql = "SELECT settings FROM players WHERE uuid = ?";
try (PreparedStatement stmt = connection.prepareStatement(sql)) {
stmt.setString(1, uuid.toString());
try (ResultSet rs = stmt.executeQuery()) {
if (rs.next()) return rs.getString("settings");
}
} catch (SQLException e) {
plugin.getLogger().severe("Erreur getPlayerSettings : " + e.getMessage());
}
return null;
}
/* ========================= SPACESHIPS ========================= */
public long createSpaceship(UUID owner, String name,
int sizeX, int sizeY, int sizeZ,
int spawnX, int spawnY, int spawnZ,
String schematicJson, String settingsJson) {
String sql = """
INSERT INTO spaceships(owner_uuid, name, size_x, size_y, size_z,
spawn_x, spawn_y, spawn_z, schematic, settings, level, money, last_loaded_level)
VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 1, 0, 1)
""";
try (PreparedStatement stmt = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) {
stmt.setString(1, owner.toString());
stmt.setString(2, name);
stmt.setInt(3, sizeX);
stmt.setInt(4, sizeY);
stmt.setInt(5, sizeZ);
stmt.setInt(6, spawnX);
stmt.setInt(7, spawnY);
stmt.setInt(8, spawnZ);
stmt.setString(9, schematicJson);
stmt.setString(10, settingsJson);
stmt.executeUpdate();
try (ResultSet keys = stmt.getGeneratedKeys()) {
if (keys.next()) return keys.getLong(1);
}
} catch (SQLException e) {
plugin.getLogger().severe("Erreur createSpaceship : " + e.getMessage());
}
return -1;
}
public Spaceship getSpaceship(long id) {
String sql = "SELECT * FROM spaceships WHERE id = ?";
try (PreparedStatement stmt = connection.prepareStatement(sql)) {
stmt.setLong(1, id);
try (ResultSet rs = stmt.executeQuery()) {
if (rs.next()) return rowToSpaceship(rs);
}
} catch (SQLException e) {
plugin.getLogger().severe("Erreur getSpaceship : " + e.getMessage());
}
return null;
}
public List<Spaceship> getSpaceshipsByOwner(UUID owner) {
List<Spaceship> list = new ArrayList<>();
String sql = "SELECT * FROM spaceships WHERE owner_uuid = ? ORDER BY id ASC";
try (PreparedStatement stmt = connection.prepareStatement(sql)) {
stmt.setString(1, owner.toString());
try (ResultSet rs = stmt.executeQuery()) {
while (rs.next()) list.add(rowToSpaceship(rs));
}
} catch (SQLException e) {
plugin.getLogger().severe("Erreur getSpaceshipsByOwner : " + e.getMessage());
}
return list;
}
public int countSpaceshipsByOwner(UUID owner) {
String sql = "SELECT COUNT(*) FROM spaceships WHERE owner_uuid = ?";
try (PreparedStatement stmt = connection.prepareStatement(sql)) {
stmt.setString(1, owner.toString());
try (ResultSet rs = stmt.executeQuery()) {
if (rs.next()) return rs.getInt(1);
}
} catch (SQLException e) {
plugin.getLogger().severe("Erreur countSpaceshipsByOwner : " + e.getMessage());
}
return 0;
}
@SuppressWarnings("deprecation")
public void updateSpaceship(Spaceship ship) {
String sql = """
UPDATE spaceships SET
name = ?, size_x = ?, size_y = ?, size_z = ?,
spawn_x = ?, spawn_y = ?, spawn_z = ?,
schematic = ?, settings = ?, level = ?, money = ?, last_loaded_level = ?,
updated_at = CURRENT_TIMESTAMP
WHERE id = ?
""";
try (PreparedStatement stmt = connection.prepareStatement(sql)) {
stmt.setString(1, ship.getName());
stmt.setInt(2, ship.getSizeX());
stmt.setInt(3, ship.getSizeY());
stmt.setInt(4, ship.getSizeZ());
stmt.setInt(5, ship.getSpawnX());
stmt.setInt(6, ship.getSpawnY());
stmt.setInt(7, ship.getSpawnZ());
stmt.setString(8, ship.getSchematicJson());
stmt.setString(9, ship.getSettingsJson());
stmt.setInt(10, ship.getLevel());
stmt.setInt(11, ship.getMoney());
stmt.setInt(12, ship.getLastLoadedLevel());
stmt.setLong(13, ship.getId());
stmt.executeUpdate();
} catch (SQLException e) {
plugin.getLogger().severe("Erreur updateSpaceship : " + e.getMessage());
}
}
public void deleteSpaceship(long id) {
try (PreparedStatement st1 = connection.prepareStatement("DELETE FROM spaceships_loaded WHERE spaceship_id = ?");
PreparedStatement st2 = connection.prepareStatement("DELETE FROM spaceships WHERE id = ?")) {
st1.setLong(1, id);
st1.executeUpdate();
st2.setLong(1, id);
st2.executeUpdate();
} catch (SQLException e) {
plugin.getLogger().severe("Erreur deleteSpaceship : " + e.getMessage());
}
}
private Spaceship rowToSpaceship(ResultSet rs) throws SQLException {
int level = 1, money = 0, lastLoadedLevel = 1;
try { level = rs.getInt("level"); if (rs.wasNull()) level = 1; } catch (SQLException ignored) {}
try { money = rs.getInt("money"); } catch (SQLException ignored) {}
try { lastLoadedLevel = rs.getInt("last_loaded_level"); if (rs.wasNull()) lastLoadedLevel = 1; } catch (SQLException ignored) {}
return new Spaceship(
rs.getLong("id"),
UUID.fromString(rs.getString("owner_uuid")),
rs.getString("name"),
rs.getInt("size_x"), rs.getInt("size_y"), rs.getInt("size_z"),
rs.getInt("spawn_x"), rs.getInt("spawn_y"), rs.getInt("spawn_z"),
rs.getString("schematic"),
rs.getString("settings"),
level, money, lastLoadedLevel
);
}
/* ========================= SPACESHIPS_LOADED ========================= */
public void markLoaded(long spaceshipId, String world, int x, int y, int z) {
String sql = """
INSERT INTO spaceships_loaded(spaceship_id, world, origin_x, origin_y, origin_z, loaded_at)
VALUES(?, ?, ?, ?, ?, CURRENT_TIMESTAMP)
ON CONFLICT(spaceship_id) DO UPDATE SET
world = excluded.world,
origin_x = excluded.origin_x,
origin_y = excluded.origin_y,
origin_z = excluded.origin_z,
loaded_at = CURRENT_TIMESTAMP
""";
try (PreparedStatement stmt = connection.prepareStatement(sql)) {
stmt.setLong(1, spaceshipId);
stmt.setString(2, world);
stmt.setInt(3, x);
stmt.setInt(4, y);
stmt.setInt(5, z);
stmt.executeUpdate();
} catch (SQLException e) {
plugin.getLogger().severe("Erreur markLoaded : " + e.getMessage());
}
}
public void markUnloaded(long spaceshipId) {
String sql = "DELETE FROM spaceships_loaded WHERE spaceship_id = ?";
try (PreparedStatement stmt = connection.prepareStatement(sql)) {
stmt.setLong(1, spaceshipId);
stmt.executeUpdate();
} catch (SQLException e) {
plugin.getLogger().severe("Erreur markUnloaded : " + e.getMessage());
}
}
public LoadedSpaceship getLoaded(long spaceshipId) {
String sql = """
SELECT l.spaceship_id, l.world, l.origin_x, l.origin_y, l.origin_z,
s.size_x, s.size_y, s.size_z
FROM spaceships_loaded l
JOIN spaceships s ON s.id = l.spaceship_id
WHERE l.spaceship_id = ?
""";
try (PreparedStatement stmt = connection.prepareStatement(sql)) {
stmt.setLong(1, spaceshipId);
try (ResultSet rs = stmt.executeQuery()) {
if (rs.next()) {
return new LoadedSpaceship(
rs.getLong("spaceship_id"),
rs.getString("world"),
rs.getInt("origin_x"), rs.getInt("origin_y"), rs.getInt("origin_z"),
rs.getInt("size_x"), rs.getInt("size_y"), rs.getInt("size_z")
);
}
}
} catch (SQLException e) {
plugin.getLogger().severe("Erreur getLoaded : " + e.getMessage());
}
return null;
}
public List<LoadedSpaceship> getLoadedByOwner(UUID owner) {
List<LoadedSpaceship> list = new ArrayList<>();
String sql = """
SELECT l.spaceship_id, l.world, l.origin_x, l.origin_y, l.origin_z,
s.size_x, s.size_y, s.size_z
FROM spaceships_loaded l
JOIN spaceships s ON s.id = l.spaceship_id
WHERE s.owner_uuid = ?
""";
try (PreparedStatement stmt = connection.prepareStatement(sql)) {
stmt.setString(1, owner.toString());
try (ResultSet rs = stmt.executeQuery()) {
while (rs.next()) {
list.add(new LoadedSpaceship(
rs.getLong("spaceship_id"),
rs.getString("world"),
rs.getInt("origin_x"), rs.getInt("origin_y"), rs.getInt("origin_z"),
rs.getInt("size_x"), rs.getInt("size_y"), rs.getInt("size_z")
));
}
}
} catch (SQLException e) {
plugin.getLogger().severe("Erreur getLoadedByOwner : " + e.getMessage());
}
return list;
}
public List<LoadedSpaceship> getAllLoaded() {
List<LoadedSpaceship> list = new ArrayList<>();
String sql = """
SELECT l.spaceship_id, l.world, l.origin_x, l.origin_y, l.origin_z,
s.size_x, s.size_y, s.size_z
FROM spaceships_loaded l
JOIN spaceships s ON s.id = l.spaceship_id
""";
try (PreparedStatement stmt = connection.prepareStatement(sql);
ResultSet rs = stmt.executeQuery()) {
while (rs.next()) {
list.add(new LoadedSpaceship(
rs.getLong("spaceship_id"),
rs.getString("world"),
rs.getInt("origin_x"), rs.getInt("origin_y"), rs.getInt("origin_z"),
rs.getInt("size_x"), rs.getInt("size_y"), rs.getInt("size_z")
));
}
} catch (SQLException e) {
plugin.getLogger().severe("Erreur getAllLoaded : " + e.getMessage());
}
return list;
}
}