From 87469a6c8b3e9a54e53deba98115718d7e8afd15 Mon Sep 17 00:00:00 2001 From: BuildTools Date: Thu, 15 Oct 2020 12:02:49 +0100 Subject: [PATCH] Added enchantment config autoupdate --- .../ecoenchants/config/ConfigManager.java | 2 +- .../config/EnchantmentYamlConfig.java | 82 ++++++++----------- .../config/configs/EnchantmentConfig.java | 4 +- .../ecoenchants/enchantments/EcoEnchant.java | 10 --- .../enchantments/EcoEnchantBuilder.java | 13 +-- 5 files changed, 39 insertions(+), 72 deletions(-) diff --git a/Plugin/src/main/java/com/willfp/ecoenchants/config/ConfigManager.java b/Plugin/src/main/java/com/willfp/ecoenchants/config/ConfigManager.java index 7215dfdf..8f115754 100644 --- a/Plugin/src/main/java/com/willfp/ecoenchants/config/ConfigManager.java +++ b/Plugin/src/main/java/com/willfp/ecoenchants/config/ConfigManager.java @@ -39,7 +39,7 @@ public class ConfigManager { * Update enchantment configs */ public static void updateEnchantmentConfigs() { - enchantmentConfigs.forEach((EnchantmentYamlConfig::reload)); + enchantmentConfigs.forEach((EnchantmentYamlConfig::update)); } /** diff --git a/Plugin/src/main/java/com/willfp/ecoenchants/config/EnchantmentYamlConfig.java b/Plugin/src/main/java/com/willfp/ecoenchants/config/EnchantmentYamlConfig.java index 54e3b130..780e685a 100644 --- a/Plugin/src/main/java/com/willfp/ecoenchants/config/EnchantmentYamlConfig.java +++ b/Plugin/src/main/java/com/willfp/ecoenchants/config/EnchantmentYamlConfig.java @@ -2,19 +2,18 @@ package com.willfp.ecoenchants.config; import com.willfp.ecoenchants.EcoEnchantsPlugin; import com.willfp.ecoenchants.enchantments.EcoEnchant; -import com.willfp.ecoenchants.util.Logger; import org.bukkit.configuration.InvalidConfigurationException; import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.plugin.java.JavaPlugin; +import java.io.BufferedReader; import java.io.File; -import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; +import java.io.InputStreamReader; import java.io.OutputStream; -import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; +import java.nio.charset.StandardCharsets; /** * Class implemented by enchantment configs @@ -25,23 +24,20 @@ public abstract class EnchantmentYamlConfig { public YamlConfiguration config; protected File configFile; private final File directory; - private final double latestVersion; private final JavaPlugin plugin = EcoEnchantsPlugin.getInstance(); private final Class plugin2; private final EcoEnchant.EnchantmentType type; - private File basedir = new File(this.plugin.getDataFolder(), "enchants/"); + private final File basedir = new File(this.plugin.getDataFolder(), "enchants/"); /** * Create new config yml * * @param name The config name - * @param latestVersion The latest config version * @param plugin The class of the main class of plugin or extension * @param type The enchantment type */ - public EnchantmentYamlConfig(String name, double latestVersion, Class plugin, EcoEnchant.EnchantmentType type) { + public EnchantmentYamlConfig(String name, Class plugin, EcoEnchant.EnchantmentType type) { this.name = name; - this.latestVersion = latestVersion; this.plugin2 = plugin; this.type = type; @@ -64,7 +60,7 @@ public abstract class EnchantmentYamlConfig { this.configFile = new File(directory, name + ".yml"); this.config = YamlConfiguration.loadConfiguration(configFile); - checkVersion(); + update(); } private void saveResource(boolean replace) { @@ -97,50 +93,36 @@ public abstract class EnchantmentYamlConfig { private void createFile() { saveResource(false); } - private void replaceFile() { - saveResource(true); - } - public void reload() { + public void update() { try { - this.config.load(this.configFile); + config.load(configFile); + + String resourcePath = "/enchants/" + type.name().toLowerCase() + "/" + name + ".yml"; + InputStream newIn = plugin2.getResourceAsStream(resourcePath); + + BufferedReader reader = new BufferedReader(new InputStreamReader(newIn, StandardCharsets.UTF_8)); + YamlConfiguration newConfig = new YamlConfiguration(); + newConfig.load(reader); + + if(newConfig.getKeys(true).equals(config.getKeys(true))) + return; + + newConfig.getKeys(true).forEach((s -> { + if (!config.getKeys(true).contains(s)) { + config.set(s, newConfig.get(s)); + } + })); + + config.getKeys(true).forEach((s -> { + if(!newConfig.getKeys(true).contains(s)) { + config.set(s, null); + } + })); + + config.save(configFile); } catch (IOException | InvalidConfigurationException e) { e.printStackTrace(); - Logger.error("§cCould not reload " + name + ".yml - Contact Auxilor."); - } - } - - private void checkVersion() { - if (latestVersion != config.getDouble("config-version")) { - Logger.warn("EcoEnchants detected an older or invalid " + name + ".yml. Replacing it with the default config..."); - Logger.warn("If you've edited the config, copy over your changes!"); - performOverwrite(); - Logger.info("§aReplacement complete!"); - } - } - - private void performOverwrite() { - DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd-HH-mm-ss"); - LocalDateTime now = LocalDateTime.now(); - String dateTime = dtf.format(now); - try { - File backupDir = new File(plugin.getDataFolder(), "backup/"); - if(!backupDir.exists()) backupDir.mkdirs(); - File oldConf = new File(backupDir, name + "_" + dateTime + ".yml"); - oldConf.createNewFile(); - FileInputStream fis = new FileInputStream(directory + "/" + name + ".yml"); - FileOutputStream fos = new FileOutputStream(oldConf); - byte[] buffer = new byte[1024]; - int length; - while ((length = fis.read(buffer)) > 0) { - fos.write(buffer, 0, length); - } - fis.close(); - fos.close(); - replaceFile(); - } catch (IOException e) { - e.printStackTrace(); - Logger.error("§cCould not update config. Try reinstalling EcoEnchants"); } } } diff --git a/Plugin/src/main/java/com/willfp/ecoenchants/config/configs/EnchantmentConfig.java b/Plugin/src/main/java/com/willfp/ecoenchants/config/configs/EnchantmentConfig.java index cce54dd2..529b7310 100644 --- a/Plugin/src/main/java/com/willfp/ecoenchants/config/configs/EnchantmentConfig.java +++ b/Plugin/src/main/java/com/willfp/ecoenchants/config/configs/EnchantmentConfig.java @@ -22,8 +22,8 @@ import java.util.Set; public class EnchantmentConfig extends EnchantmentYamlConfig { private final String name; - public EnchantmentConfig(String name, double version, Class plugin, EcoEnchant.EnchantmentType type) { - super(name, version, plugin, type); + public EnchantmentConfig(String name, Class plugin, EcoEnchant.EnchantmentType type) { + super(name, plugin, type); this.name = name; } diff --git a/Plugin/src/main/java/com/willfp/ecoenchants/enchantments/EcoEnchant.java b/Plugin/src/main/java/com/willfp/ecoenchants/enchantments/EcoEnchant.java index 0b3050ad..b70bab9b 100644 --- a/Plugin/src/main/java/com/willfp/ecoenchants/enchantments/EcoEnchant.java +++ b/Plugin/src/main/java/com/willfp/ecoenchants/enchantments/EcoEnchant.java @@ -30,7 +30,6 @@ public abstract class EcoEnchant extends Enchantment implements Listener, Regist private final String permissionName; private final EnchantmentType type; - private final double configVersion; private final EnchantmentConfig config; private boolean grindstoneable; @@ -54,7 +53,6 @@ public abstract class EcoEnchant extends Enchantment implements Listener, Regist this.type = builder.type; this.permissionName = builder.permission; - this.configVersion = builder.configVersion; this.config = builder.config; if(!Prerequisite.areMet(prerequisites)) @@ -237,14 +235,6 @@ public abstract class EcoEnchant extends Enchantment implements Listener, Regist return target; } - /** - * Get latest config version - * @return The latest version - */ - public double getConfigVersion() { - return configVersion; - } - /** * Get {@link EnchantmentConfig} of enchantment * @return The config diff --git a/Plugin/src/main/java/com/willfp/ecoenchants/enchantments/EcoEnchantBuilder.java b/Plugin/src/main/java/com/willfp/ecoenchants/enchantments/EcoEnchantBuilder.java index 8e1be75c..b0c156e5 100644 --- a/Plugin/src/main/java/com/willfp/ecoenchants/enchantments/EcoEnchantBuilder.java +++ b/Plugin/src/main/java/com/willfp/ecoenchants/enchantments/EcoEnchantBuilder.java @@ -10,7 +10,6 @@ public class EcoEnchantBuilder { public final String name; public final String key; public final String permission; - public double configVersion; public final EnchantmentConfig config; public Class plugin; public final EcoEnchant.EnchantmentType type; @@ -21,10 +20,9 @@ public class EcoEnchantBuilder { * * @param key The enchantment key name * @param type The enchantment type - * @param version The config version */ - public EcoEnchantBuilder(String key, EcoEnchant.EnchantmentType type, double version) { - this(key, type, version, EcoEnchantsPlugin.class); + public EcoEnchantBuilder(String key, EcoEnchant.EnchantmentType type) { + this(key, type, EcoEnchantsPlugin.class); } /** @@ -33,10 +31,9 @@ public class EcoEnchantBuilder { * * @param key The enchantment key name * @param type The enchantment type - * @param version The config version * @param plugin The main class of extension */ - public EcoEnchantBuilder(String key, EcoEnchant.EnchantmentType type, double version, Class plugin) { + public EcoEnchantBuilder(String key, EcoEnchant.EnchantmentType type, Class plugin) { if(Pattern.matches("[a-z_]", key)) throw new InvalidEnchantmentException("Key must only contain lowercase letters and underscores"); this.key = key; this.permission = key.replace("_",""); @@ -45,9 +42,7 @@ public class EcoEnchantBuilder { this.plugin = plugin; - this.configVersion = version; - - ConfigManager.addEnchantmentConfig(new EnchantmentConfig(permission, configVersion, plugin, this.type)); + ConfigManager.addEnchantmentConfig(new EnchantmentConfig(permission, plugin, this.type)); this.config = ConfigManager.getEnchantmentConfig(permission); this.name = config.getString("name");