diff --git a/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/command/PremiumCommand.java b/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/command/PremiumCommand.java index 28974bae..761d838f 100644 --- a/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/command/PremiumCommand.java +++ b/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/command/PremiumCommand.java @@ -40,27 +40,27 @@ public class PremiumCommand extends ToggleCommand { return; } - UUID id = ((Player) sender).getUniqueId(); - if (plugin.getConfig().getBoolean("premium-warning") && !plugin.getCore().getPendingConfirms().contains(id)) { - sender.sendMessage(plugin.getCore().getMessage("premium-warning")); - plugin.getCore().getPendingConfirms().add(id); - return; - } + UUID id = ((Player) sender).getUniqueId(); + if (plugin.getConfig().getBoolean("premium-warning") && !plugin.getCore().getPendingConfirms().contains(id)) { + sender.sendMessage(plugin.getCore().getMessage("premium-warning")); + plugin.getCore().getPendingConfirms().add(id); + return; + } - plugin.getCore().getPendingConfirms().remove(id); - //todo: load async - StoredProfile profile = plugin.getCore().getStorage().loadProfile(sender.getName()); - if (profile.isPremium()) { - plugin.getCore().sendLocaleMessage("already-exists", sender); - } else { - //todo: resolve uuid - profile.setPremium(true); - plugin.getScheduler().runAsync(() -> { - plugin.getCore().getStorage().save(profile); - }); + plugin.getCore().getPendingConfirms().remove(id); + //todo: load async + StoredProfile profile = plugin.getCore().getStorage().loadProfile(sender.getName()); + if (profile.isPremium()) { + plugin.getCore().sendLocaleMessage("already-exists", sender); + } else { + //todo: resolve uuid + profile.setPremium(true); + plugin.getScheduler().runAsync(() -> { + plugin.getCore().getStorage().save(profile); + }); - plugin.getCore().sendLocaleMessage("add-premium", sender); - } + plugin.getCore().sendLocaleMessage("add-premium", sender); + } } private void onPremiumOther(CommandSender sender, Command command, String[] args) { diff --git a/core/src/main/java/com/github/games647/fastlogin/core/AuthStorage.java b/core/src/main/java/com/github/games647/fastlogin/core/AuthStorage.java index 904d5921..8dad3a72 100644 --- a/core/src/main/java/com/github/games647/fastlogin/core/AuthStorage.java +++ b/core/src/main/java/com/github/games647/fastlogin/core/AuthStorage.java @@ -184,31 +184,36 @@ public class AuthStorage { try (Connection con = dataSource.getConnection()) { String uuid = playerProfile.getOptId().map(UUIDAdapter::toMojangId).orElse(null); - if (playerProfile.isSaved()) { - try (PreparedStatement saveStmt = con.prepareStatement(UPDATE_PROFILE)) { - saveStmt.setString(1, uuid); - saveStmt.setString(2, playerProfile.getName()); - saveStmt.setBoolean(3, playerProfile.isPremium()); - saveStmt.setString(4, playerProfile.getLastIp()); + playerProfile.getSaveLock().lock(); + try { + if (playerProfile.isSaved()) { + try (PreparedStatement saveStmt = con.prepareStatement(UPDATE_PROFILE)) { + saveStmt.setString(1, uuid); + saveStmt.setString(2, playerProfile.getName()); + saveStmt.setBoolean(3, playerProfile.isPremium()); + saveStmt.setString(4, playerProfile.getLastIp()); - saveStmt.setLong(5, playerProfile.getRowId()); - saveStmt.execute(); - } - } else { - try (PreparedStatement saveStmt = con.prepareStatement(INSERT_PROFILE, RETURN_GENERATED_KEYS)) { - saveStmt.setString(1, uuid); + saveStmt.setLong(5, playerProfile.getRowId()); + saveStmt.execute(); + } + } else { + try (PreparedStatement saveStmt = con.prepareStatement(INSERT_PROFILE, RETURN_GENERATED_KEYS)) { + saveStmt.setString(1, uuid); - saveStmt.setString(2, playerProfile.getName()); - saveStmt.setBoolean(3, playerProfile.isPremium()); - saveStmt.setString(4, playerProfile.getLastIp()); + saveStmt.setString(2, playerProfile.getName()); + saveStmt.setBoolean(3, playerProfile.isPremium()); + saveStmt.setString(4, playerProfile.getLastIp()); - saveStmt.execute(); - try (ResultSet generatedKeys = saveStmt.getGeneratedKeys()) { - if (generatedKeys != null && generatedKeys.next()) { - playerProfile.setRowId(generatedKeys.getInt(1)); + saveStmt.execute(); + try (ResultSet generatedKeys = saveStmt.getGeneratedKeys()) { + if (generatedKeys != null && generatedKeys.next()) { + playerProfile.setRowId(generatedKeys.getInt(1)); + } } } } + } finally { + playerProfile.getSaveLock().unlock(); } } catch (SQLException ex) { core.getPlugin().getLog().error("Failed to save playerProfile {}", playerProfile, ex); diff --git a/core/src/main/java/com/github/games647/fastlogin/core/StoredProfile.java b/core/src/main/java/com/github/games647/fastlogin/core/StoredProfile.java index 786a174d..389ea373 100644 --- a/core/src/main/java/com/github/games647/fastlogin/core/StoredProfile.java +++ b/core/src/main/java/com/github/games647/fastlogin/core/StoredProfile.java @@ -5,10 +5,12 @@ import com.github.games647.craftapi.model.Profile; import java.time.Instant; import java.util.Optional; import java.util.UUID; +import java.util.concurrent.locks.ReentrantLock; public class StoredProfile extends Profile { private long rowId; + private final ReentrantLock saveLock = new ReentrantLock(); private boolean premium; private String lastIp; @@ -27,6 +29,10 @@ public class StoredProfile extends Profile { this(-1, uuid, playerName, premium, lastIp, Instant.now()); } + public ReentrantLock getSaveLock() { + return saveLock; + } + public synchronized boolean isSaved() { return rowId >= 0; }