diff --git a/plugin/src/main/java/com/alttd/essentia/listeners/PlayerListener.java b/plugin/src/main/java/com/alttd/essentia/listeners/PlayerListener.java index 4079c1d..be85cea 100644 --- a/plugin/src/main/java/com/alttd/essentia/listeners/PlayerListener.java +++ b/plugin/src/main/java/com/alttd/essentia/listeners/PlayerListener.java @@ -3,11 +3,14 @@ package com.alttd.essentia.listeners; import com.alttd.essentia.EssentiaPlugin; import com.alttd.essentia.configuration.Config; import com.alttd.essentia.user.User; +import com.alttd.essentia.user.UserManager; import org.bukkit.Location; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.event.player.PlayerTeleportEvent; import java.util.HashSet; @@ -15,7 +18,7 @@ import java.util.Set; public class PlayerListener implements Listener { - private EssentiaPlugin plugin; + private final EssentiaPlugin plugin; private final Set backAllowCauses = new HashSet<>(); public PlayerListener(EssentiaPlugin plugin) { @@ -61,4 +64,28 @@ public class PlayerListener implements Listener { user.setBackLocation(false, event.getFrom()); } } + + @EventHandler + public void onPlayerJoin(PlayerJoinEvent event) { + Player player = event.getPlayer(); + if (plugin.userManager().hasUser(player.getUniqueId())) + return; + + plugin.storageProvider().loadUser(player.getUniqueId()); + } + + @EventHandler + public void onPlayerQuit(PlayerQuitEvent event) { + Player player = event.getPlayer(); + UserManager userManager = plugin.userManager(); + if (!userManager.hasUser(player.getUniqueId())) { + return; + } + + User user = userManager.getUser(player); + try { + plugin.storageProvider().save(user); + userManager.removeUser(player.getUniqueId()); + } catch (Exception ignored) {} + } } diff --git a/plugin/src/main/java/com/alttd/essentia/storage/StorageProvider.java b/plugin/src/main/java/com/alttd/essentia/storage/StorageProvider.java index b250c46..6d75825 100644 --- a/plugin/src/main/java/com/alttd/essentia/storage/StorageProvider.java +++ b/plugin/src/main/java/com/alttd/essentia/storage/StorageProvider.java @@ -18,8 +18,12 @@ public abstract class StorageProvider { this.plugin = plugin; } - public EssentiaUser loadUser(UUID uuid) { - EssentiaUser user = load(uuid); + public User loadUser(UUID uuid) { + User user = load(uuid); + + if (user == null) { + user = plugin.userManager().createNewUser(uuid); + } plugin.userManager().addUser(user); diff --git a/plugin/src/main/java/com/alttd/essentia/storage/mysql/DatabaseQuery.java b/plugin/src/main/java/com/alttd/essentia/storage/mysql/DatabaseQuery.java index b55bc79..60e7696 100644 --- a/plugin/src/main/java/com/alttd/essentia/storage/mysql/DatabaseQuery.java +++ b/plugin/src/main/java/com/alttd/essentia/storage/mysql/DatabaseQuery.java @@ -19,7 +19,7 @@ public class DatabaseQuery { this(statement, ps -> {}); } - public ResultSet execute(Connection connection) { + public ResultSet executeQuery(Connection connection) { try (PreparedStatement preparedStatement = connection.prepareStatement(statement)) { databaseTask.edit(preparedStatement); ResultSet resultSet = preparedStatement.executeQuery(); @@ -31,12 +31,24 @@ public class DatabaseQuery { return null; } + public void execute(Connection connection) { + try (PreparedStatement preparedStatement = connection.prepareStatement(statement)) { + databaseTask.edit(preparedStatement); + preparedStatement.execute(); + databaseTask.onSuccess(); + } catch (SQLException e) { + databaseTask.onFailure(e); + } + } + public interface DatabaseTask { void edit(PreparedStatement preparedStatement) throws SQLException; default void onSuccess(ResultSet resultSet) throws SQLException {}; + default void onSuccess() throws SQLException {}; + default void onFailure(SQLException e) { e.printStackTrace(); } diff --git a/plugin/src/main/java/com/alttd/essentia/storage/mysql/DatabaseQueue.java b/plugin/src/main/java/com/alttd/essentia/storage/mysql/DatabaseQueue.java index 41cef6d..4c603d3 100644 --- a/plugin/src/main/java/com/alttd/essentia/storage/mysql/DatabaseQueue.java +++ b/plugin/src/main/java/com/alttd/essentia/storage/mysql/DatabaseQueue.java @@ -42,7 +42,7 @@ public class DatabaseQueue extends BukkitRunnable { if (databaseQuery == null) return; - databaseQuery.execute(connection); + databaseQuery.executeQuery(connection); } if (!connection.getAutoCommit()) { connection.commit(); diff --git a/plugin/src/main/java/com/alttd/essentia/storage/mysql/SQLStorageProvider.java b/plugin/src/main/java/com/alttd/essentia/storage/mysql/SQLStorageProvider.java index 246da91..c2d2f07 100644 --- a/plugin/src/main/java/com/alttd/essentia/storage/mysql/SQLStorageProvider.java +++ b/plugin/src/main/java/com/alttd/essentia/storage/mysql/SQLStorageProvider.java @@ -34,10 +34,11 @@ public class SQLStorageProvider extends StorageProvider { private void createTables() { // TODO -- create table String userTable = "CREATE TABLE IF NOT EXISTS users(" + - "id VARCHAR(36) NOT NULL, " + - "PRIMARY KEY (id)" + + "uuid VARCHAR(36) NOT NULL, " + + "PRIMARY KEY (uuid)" + ")"; - addDatabaseQuery(new DatabaseQuery(userTable), false); + DatabaseQuery databaseQuery = new DatabaseQuery(userTable); + databaseQuery.execute(getDatabaseConnection().get()); } public DatabaseConnection getDatabaseConnection() { @@ -100,7 +101,7 @@ public class SQLStorageProvider extends StorageProvider { if (queue) { databaseQueue.databaseQueryQueue().offer(databaseQuery); } else { - databaseQuery.execute(getDatabaseConnection().get()); + databaseQuery.executeQuery(getDatabaseConnection().get()); } } @@ -120,11 +121,12 @@ public class SQLStorageProvider extends StorageProvider { return match; } + // TODO -- make this async @Override protected EssentiaUser load(UUID uuid) { String sql = "SELECT * FROM users WHERE uuid = ?"; DatabaseQuery databaseQuery = new DatabaseQuery(sql, ps -> ps.setString(1, uuid.toString())); - try (ResultSet resultSet = databaseQuery.execute(getDatabaseConnection().get())) { + try (ResultSet resultSet = databaseQuery.executeQuery(getDatabaseConnection().get())) { if (!resultSet.next()) { return null; // user is not in the db } diff --git a/plugin/src/main/java/com/alttd/essentia/user/EssentiaUserManager.java b/plugin/src/main/java/com/alttd/essentia/user/EssentiaUserManager.java index bcd81be..3763397 100644 --- a/plugin/src/main/java/com/alttd/essentia/user/EssentiaUserManager.java +++ b/plugin/src/main/java/com/alttd/essentia/user/EssentiaUserManager.java @@ -47,7 +47,7 @@ public class EssentiaUserManager implements UserManager { @Override public User createNewUser(UUID uuid) { - return null; + return new EssentiaUser.Builder().uuid(uuid).build(); } }