diff --git a/plugin/src/main/java/com/alttd/essentia/EssentiaPlugin.java b/plugin/src/main/java/com/alttd/essentia/EssentiaPlugin.java index 4ebd787..4a35cdc 100644 --- a/plugin/src/main/java/com/alttd/essentia/EssentiaPlugin.java +++ b/plugin/src/main/java/com/alttd/essentia/EssentiaPlugin.java @@ -4,7 +4,12 @@ import com.alttd.essentia.commands.admin.*; import com.alttd.essentia.commands.player.*; import com.alttd.essentia.configuration.Config; 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; @@ -18,6 +23,9 @@ public class EssentiaPlugin extends JavaPlugin implements EssentiaAPI { @Getter private UserManager userManager; + @Getter + private StorageProvider storageProvider; + @Override public void onLoad() { instance = this; @@ -30,11 +38,20 @@ public class EssentiaPlugin extends JavaPlugin implements EssentiaAPI { loadCommands(); loadEventListeners(); loadManagers(); + loadStorageProvider(); } @Override public void onDisable() { getServer().getScheduler().cancelTasks(this); + for (User user : userManager().getUsers().values()) { + try { + storageProvider.save(user); + } catch (Exception e) { + e.printStackTrace(); + } + } + storageProvider().disable(); } public void loadConfiguration() { @@ -72,4 +89,10 @@ public class EssentiaPlugin extends JavaPlugin implements EssentiaAPI { userManager = new EssentiaUserManager(); } + void loadStorageProvider() { + StorageManager storageManager = new StorageManager(this); + storageProvider = storageManager.storageProvider(StorageType.valueOf(Config.STORAGE_TYPE.toUpperCase())); + storageProvider.startAutoSaving(); + } + } diff --git a/plugin/src/main/java/com/alttd/essentia/configuration/Config.java b/plugin/src/main/java/com/alttd/essentia/configuration/Config.java index df4011c..9b20a07 100755 --- a/plugin/src/main/java/com/alttd/essentia/configuration/Config.java +++ b/plugin/src/main/java/com/alttd/essentia/configuration/Config.java @@ -238,6 +238,9 @@ public class Config { FEED_BY_OTHER = config.getString("messages.command.feed.feed-by-other", FEED_BY_OTHER); } + public static String STORAGE_TYPE = "mysql"; + public static boolean AUTO_SAVE = true; + public static int AUTO_SAVE_DELAY = 60; public static String MYSQL_IP = "localhost"; public static String MYSQL_PORT = "3306"; public static String MYSQL_DATABASE_NAME = "essentia"; @@ -246,6 +249,9 @@ public class Config { public static int MYSQL_CONNECTIONS = 10; public static int MYSQL_QUEUE_DELAY = 5; private static void storage() { + STORAGE_TYPE = config.getString("storage.type", STORAGE_TYPE); + AUTO_SAVE = config.getBoolean("storage.auto-save", AUTO_SAVE); + AUTO_SAVE_DELAY = config.getInt("storaeg.auto-save-delay", AUTO_SAVE_DELAY); MYSQL_IP = config.getString("storage.mysql.ip", MYSQL_IP); MYSQL_PORT = config.getString("storage.mysql.port", MYSQL_PORT); MYSQL_DATABASE_NAME = config.getString("storage.mysql.database", MYSQL_DATABASE_NAME); diff --git a/plugin/src/main/java/com/alttd/essentia/storage/StorageManager.java b/plugin/src/main/java/com/alttd/essentia/storage/StorageManager.java index 62ededd..83f0308 100644 --- a/plugin/src/main/java/com/alttd/essentia/storage/StorageManager.java +++ b/plugin/src/main/java/com/alttd/essentia/storage/StorageManager.java @@ -2,12 +2,11 @@ package com.alttd.essentia.storage; import com.alttd.essentia.EssentiaPlugin; import com.alttd.essentia.storage.mysql.SQLStorageProvider; -import com.alttd.essentia.storage.sqlite.SQLiteStorageProvider; import com.alttd.essentia.storage.yaml.YamlStorageProvider; import java.io.File; -public abstract class StorageManager { +public class StorageManager { protected final EssentiaPlugin plugin; 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 9efa5d5..b250c46 100644 --- a/plugin/src/main/java/com/alttd/essentia/storage/StorageProvider.java +++ b/plugin/src/main/java/com/alttd/essentia/storage/StorageProvider.java @@ -1,8 +1,10 @@ package com.alttd.essentia.storage; import com.alttd.essentia.EssentiaPlugin; +import com.alttd.essentia.configuration.Config; import com.alttd.essentia.user.EssentiaUser; import com.alttd.essentia.user.User; +import org.bukkit.scheduler.BukkitRunnable; import org.jetbrains.annotations.NotNull; import java.util.UUID; @@ -10,6 +12,7 @@ import java.util.UUID; public abstract class StorageProvider { protected final EssentiaPlugin plugin; + private AutoSaveTask autoSaveTask; public StorageProvider(EssentiaPlugin plugin) { this.plugin = plugin; @@ -24,9 +27,41 @@ public abstract class StorageProvider { return user; } + public void startAutoSaving() { + if (!Config.AUTO_SAVE) + return; + + autoSaveTask = new AutoSaveTask(); + int delay = Config.AUTO_SAVE_DELAY * 20; + autoSaveTask.runTaskTimerAsynchronously(plugin, delay, delay); + } + + public void disable() { + // Override if some extra steps are required when disabling the plugin. + } + protected abstract EssentiaUser load(UUID uuid); public abstract void save(@NotNull User user) throws Exception; public abstract void delete(UUID uuid) throws Exception; + + private class AutoSaveTask extends BukkitRunnable { + + @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(); + } + } + } + + } } 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 eda0d87..246da91 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 @@ -87,7 +87,8 @@ public class SQLStorageProvider extends StorageProvider { } } - public void unload() { + @Override + public void disable() { if (databaseQueue != null && !databaseQueue.isCancelled()) { databaseQueue.cancel(); databaseQueue.runTaskQueue();