diff --git a/api/src/main/java/com/alttd/essentia/user/User.java b/api/src/main/java/com/alttd/essentia/user/User.java index 1f356b8..240351b 100644 --- a/api/src/main/java/com/alttd/essentia/user/User.java +++ b/api/src/main/java/com/alttd/essentia/user/User.java @@ -35,13 +35,7 @@ public interface User { boolean allowTeleports(); - void setAllowTeleports(boolean allowTeleports); - - @ApiStatus.Internal - boolean saving(); - - @ApiStatus.Internal - void saving(boolean saving); + void allowTeleports(boolean allowTeleports); Request request(); diff --git a/api/src/main/java/com/alttd/essentia/user/UserManager.java b/api/src/main/java/com/alttd/essentia/user/UserManager.java index 32f76ef..58e2616 100644 --- a/api/src/main/java/com/alttd/essentia/user/UserManager.java +++ b/api/src/main/java/com/alttd/essentia/user/UserManager.java @@ -21,4 +21,6 @@ public interface UserManager { User createNewUser(UUID uuid); + void saveAllUsers(); + } diff --git a/plugin/src/main/java/com/alttd/essentia/EssentiaPlugin.java b/plugin/src/main/java/com/alttd/essentia/EssentiaPlugin.java index 4a35cdc..eb70cb9 100644 --- a/plugin/src/main/java/com/alttd/essentia/EssentiaPlugin.java +++ b/plugin/src/main/java/com/alttd/essentia/EssentiaPlugin.java @@ -7,9 +7,7 @@ import com.alttd.essentia.listeners.PlayerListener; import com.alttd.essentia.storage.StorageManager; import com.alttd.essentia.storage.StorageProvider; import com.alttd.essentia.storage.StorageType; -import com.alttd.essentia.storage.mysql.SQLStorageProvider; import com.alttd.essentia.user.EssentiaUserManager; -import com.alttd.essentia.user.User; import com.alttd.essentia.user.UserManager; import lombok.Getter; import org.bukkit.plugin.PluginManager; @@ -44,13 +42,7 @@ public class EssentiaPlugin extends JavaPlugin implements EssentiaAPI { @Override public void onDisable() { getServer().getScheduler().cancelTasks(this); - for (User user : userManager().getUsers().values()) { - try { - storageProvider.save(user); - } catch (Exception e) { - e.printStackTrace(); - } - } + userManager().saveAllUsers(); storageProvider().disable(); } @@ -86,7 +78,7 @@ public class EssentiaPlugin extends JavaPlugin implements EssentiaAPI { } void loadManagers() { - userManager = new EssentiaUserManager(); + userManager = new EssentiaUserManager(this); } void loadStorageProvider() { diff --git a/plugin/src/main/java/com/alttd/essentia/commands/player/TeleportToggleCommand.java b/plugin/src/main/java/com/alttd/essentia/commands/player/TeleportToggleCommand.java index fd0d5f9..7c0f8fa 100644 --- a/plugin/src/main/java/com/alttd/essentia/commands/player/TeleportToggleCommand.java +++ b/plugin/src/main/java/com/alttd/essentia/commands/player/TeleportToggleCommand.java @@ -17,7 +17,7 @@ public class TeleportToggleCommand extends PlayerSubCommand { @Override protected boolean execute(Player player, User user, String... args) { - user.setAllowTeleports(!user.allowTeleports()); + user.allowTeleports(!user.allowTeleports()); TagResolver placeholders = TagResolver.resolver( Placeholder.parsed("toggle", BooleanUtils.toStringOnOff(user.allowTeleports())) ); 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 be85cea..d21d40a 100644 --- a/plugin/src/main/java/com/alttd/essentia/listeners/PlayerListener.java +++ b/plugin/src/main/java/com/alttd/essentia/listeners/PlayerListener.java @@ -2,6 +2,7 @@ package com.alttd.essentia.listeners; import com.alttd.essentia.EssentiaPlugin; import com.alttd.essentia.configuration.Config; +import com.alttd.essentia.user.EssentiaUser; import com.alttd.essentia.user.User; import com.alttd.essentia.user.UserManager; import org.bukkit.Location; @@ -84,7 +85,8 @@ public class PlayerListener implements Listener { User user = userManager.getUser(player); try { - plugin.storageProvider().save(user); + if (user instanceof EssentiaUser essentiaUser) + plugin.storageProvider().save(essentiaUser); 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 6d75825..28b30cf 100644 --- a/plugin/src/main/java/com/alttd/essentia/storage/StorageProvider.java +++ b/plugin/src/main/java/com/alttd/essentia/storage/StorageProvider.java @@ -46,7 +46,17 @@ public abstract class StorageProvider { protected abstract EssentiaUser load(UUID uuid); - public abstract void save(@NotNull User user) throws Exception; + public void startSaving(EssentiaUser user) throws Exception { + if (user.saving() || !user.needsSaving()) return; + user.saving(true); + + save(user); + + user.saving(false); + user.needsSaving(false); + } + + public abstract void save(@NotNull EssentiaUser user) throws Exception; public abstract void delete(UUID uuid) throws Exception; @@ -54,17 +64,7 @@ public abstract class StorageProvider { @Override public void run() { - for (User user : plugin.userManager().getUsers().values()) { - try { - if (user.saving()) { - continue; - } - save(user); - } catch (Exception e) { - user.saving(false); - e.printStackTrace(); - } - } + plugin.userManager().saveAllUsers(); } } 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 ab031b6..962aede 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 @@ -4,7 +4,6 @@ import com.alttd.essentia.EssentiaPlugin; import com.alttd.essentia.configuration.Config; import com.alttd.essentia.storage.StorageProvider; import com.alttd.essentia.user.EssentiaUser; -import com.alttd.essentia.user.User; import org.jetbrains.annotations.NotNull; import java.sql.PreparedStatement; @@ -140,7 +139,7 @@ public class SQLStorageProvider extends StorageProvider { } @Override - public void save(@NotNull User user) throws Exception { + public void save(@NotNull EssentiaUser user) throws Exception { // might not be the best way if new fields are added... // split into multiple tables - users, userdata, userhomes, ... ? String sql = "INSERT INTO users" + diff --git a/plugin/src/main/java/com/alttd/essentia/storage/sqlite/SQLiteStorageProvider.java b/plugin/src/main/java/com/alttd/essentia/storage/sqlite/SQLiteStorageProvider.java index 5cc152a..fee2f69 100644 --- a/plugin/src/main/java/com/alttd/essentia/storage/sqlite/SQLiteStorageProvider.java +++ b/plugin/src/main/java/com/alttd/essentia/storage/sqlite/SQLiteStorageProvider.java @@ -3,7 +3,6 @@ package com.alttd.essentia.storage.sqlite; import com.alttd.essentia.EssentiaPlugin; import com.alttd.essentia.storage.StorageProvider; import com.alttd.essentia.user.EssentiaUser; -import com.alttd.essentia.user.User; import org.jetbrains.annotations.NotNull; import java.util.UUID; @@ -20,7 +19,7 @@ public class SQLiteStorageProvider extends StorageProvider { } @Override - public void save(@NotNull User user) throws Exception { + public void save(@NotNull EssentiaUser user) throws Exception { } diff --git a/plugin/src/main/java/com/alttd/essentia/storage/yaml/YamlStorageProvider.java b/plugin/src/main/java/com/alttd/essentia/storage/yaml/YamlStorageProvider.java index 7e510f8..f332cd3 100644 --- a/plugin/src/main/java/com/alttd/essentia/storage/yaml/YamlStorageProvider.java +++ b/plugin/src/main/java/com/alttd/essentia/storage/yaml/YamlStorageProvider.java @@ -3,7 +3,6 @@ package com.alttd.essentia.storage.yaml; import com.alttd.essentia.EssentiaPlugin; import com.alttd.essentia.storage.StorageProvider; import com.alttd.essentia.user.EssentiaUser; -import com.alttd.essentia.user.User; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.World; @@ -42,10 +41,7 @@ public class YamlStorageProvider extends StorageProvider { } @Override - public void save(@NotNull User user) throws Exception { - if (user.saving()) return; - user.saving(true); - + public void save(@NotNull EssentiaUser user) throws Exception { File configFile = new File(dataDirectory, user.getUUID() + ".yml"); YamlConfiguration config = YamlConfiguration.loadConfiguration(configFile); @@ -57,7 +53,6 @@ public class YamlStorageProvider extends StorageProvider { config.set("allow-teleports", user.allowTeleports()); config.save(configFile); - user.saving(false); } @Override diff --git a/plugin/src/main/java/com/alttd/essentia/user/EssentiaUser.java b/plugin/src/main/java/com/alttd/essentia/user/EssentiaUser.java index cbcb110..3ae51f7 100644 --- a/plugin/src/main/java/com/alttd/essentia/user/EssentiaUser.java +++ b/plugin/src/main/java/com/alttd/essentia/user/EssentiaUser.java @@ -1,8 +1,6 @@ package com.alttd.essentia.user; import com.alttd.essentia.request.Request; -import lombok.Getter; -import lombok.Setter; import org.bukkit.Location; import java.util.*; @@ -19,6 +17,7 @@ public class EssentiaUser implements User { protected Request request; private boolean saving; + private boolean needsSaving; // can we use a decorator for this to set it to true on every change? private EssentiaUser(Builder builder) { this.uuid = builder.uuid; @@ -45,6 +44,7 @@ public class EssentiaUser implements User { return; } backLocation = location; + needsSaving = true; } @Override @@ -60,11 +60,13 @@ public class EssentiaUser implements User { @Override public void setHome(String name, Location location) { homes.put(name, location); + needsSaving = true; } @Override public void removeHome(String name) { homes.remove(name); + needsSaving = true; } @Override @@ -95,20 +97,27 @@ public class EssentiaUser implements User { } @Override - public void setAllowTeleports(boolean allowTeleports) { + public void allowTeleports(boolean allowTeleports) { this.allowTeleports = allowTeleports; + needsSaving = true; } - @Override public boolean saving() { return saving; } - @Override public void saving(boolean saving) { this.saving = saving; } + public boolean needsSaving() { + return needsSaving; + } + + public void needsSaving(boolean needsSaving) { + this.needsSaving = needsSaving; + } + @Override public Request request() { return request; 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 3763397..6aa0733 100644 --- a/plugin/src/main/java/com/alttd/essentia/user/EssentiaUserManager.java +++ b/plugin/src/main/java/com/alttd/essentia/user/EssentiaUserManager.java @@ -1,5 +1,6 @@ package com.alttd.essentia.user; +import com.alttd.essentia.EssentiaPlugin; import org.bukkit.entity.Player; import java.util.Map; @@ -8,8 +9,14 @@ import java.util.concurrent.ConcurrentHashMap; public class EssentiaUserManager implements UserManager { + protected final EssentiaPlugin plugin; + private final Map essentiaPlayers = new ConcurrentHashMap<>(); + public EssentiaUserManager(EssentiaPlugin plugin) { + this.plugin = plugin; + } + @Override public User getUser(Player player) { return getUser(player.getUniqueId()); @@ -50,4 +57,21 @@ public class EssentiaUserManager implements UserManager { return new EssentiaUser.Builder().uuid(uuid).build(); } + @Override + public void saveAllUsers() { + for (User user : getUsers().values()) { + if (user instanceof EssentiaUser essentiaUser) { + try { + if (essentiaUser.saving() || !essentiaUser.needsSaving()) { + continue; + } + plugin.storageProvider().startSaving(essentiaUser); + } catch(Exception e){ + essentiaUser.saving(false); + e.printStackTrace(); + } + } + } + } + }