diff --git a/src/main/java/xyz/ineanto/nicko/NickoBukkit.java b/src/main/java/xyz/ineanto/nicko/NickoBukkit.java index 6ea29a3..2fb4a49 100644 --- a/src/main/java/xyz/ineanto/nicko/NickoBukkit.java +++ b/src/main/java/xyz/ineanto/nicko/NickoBukkit.java @@ -13,7 +13,10 @@ import xyz.ineanto.nicko.config.ConfigurationManager; import xyz.ineanto.nicko.event.PlayerJoinListener; import xyz.ineanto.nicko.event.PlayerQuitListener; import xyz.ineanto.nicko.i18n.Locale; -import xyz.ineanto.nicko.i18n.LocaleFileManager; +import xyz.ineanto.nicko.i18n.CustomLocale; +import xyz.ineanto.nicko.migration.ConfigurationMigrator; +import xyz.ineanto.nicko.migration.CustomLocaleMigrator; +import xyz.ineanto.nicko.migration.Migrator; import xyz.ineanto.nicko.mojang.MojangAPI; import xyz.ineanto.nicko.placeholder.NickoExpansion; import xyz.ineanto.nicko.storage.PlayerDataStore; @@ -24,9 +27,9 @@ import xyz.xenondevs.invui.gui.structure.Structure; import xyz.xenondevs.invui.item.builder.ItemBuilder; import xyz.xenondevs.invui.item.impl.SimpleItem; +import java.io.FileNotFoundException; import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.StandardCopyOption; +import java.util.List; public class NickoBukkit extends JavaPlugin { private static NickoBukkit plugin; @@ -37,7 +40,7 @@ public class NickoBukkit extends JavaPlugin { private PlayerDataStore dataStore; private ConfigurationManager configurationManager; private Configuration configuration; - private LocaleFileManager localeFileManager; + private CustomLocale customLocale; private PlayerNameStore nameStore; private RandomNameFetcher nameFetcher; private Metrics metrics; @@ -95,19 +98,11 @@ public class NickoBukkit extends JavaPlugin { } if (!unitTesting) { - // Migrate configuration (1.0.8-RC1) - if (configuration.getVersion() == null - || configuration.getVersion().isEmpty() - || configuration.getVersionObject().compareTo(Configuration.VERSION) != 0) { - getLogger().info("Migrating configuration file from older version..."); - try { - Files.copy(configurationManager.getFile().toPath(), configurationManager.getBackupFile().toPath(), StandardCopyOption.REPLACE_EXISTING); - Files.delete(configurationManager.getFile().toPath()); - configurationManager.saveDefaultConfig(); - } catch (IOException e) { - getLogger().severe("Failed to migrate your configuration!"); - } - } + final List migrations = List.of( + new ConfigurationMigrator(this), + new CustomLocaleMigrator(this) + ); + migrations.forEach(Migrator::migrate); try { Class.forName("io.papermc.paper.threadedregions.RegionizedServerInitEvent"); @@ -116,11 +111,15 @@ public class NickoBukkit extends JavaPlugin { } catch (ClassNotFoundException ignored) { } if (configuration.isCustomLocale()) { - localeFileManager = new LocaleFileManager(); - if (localeFileManager.dumpFromLocale(Locale.ENGLISH)) { - getLogger().info("Successfully loaded custom language file."); - } else { - getLogger().severe("Failed to load custom language file!"); + try { + customLocale = new CustomLocale(this); + if (customLocale.dumpIntoFile(Locale.ENGLISH)) { + getLogger().info("Successfully loaded custom language file."); + } else { + getLogger().severe("Failed to load custom language file!"); + } + } catch (FileNotFoundException e) { + throw new RuntimeException(e); } } @@ -189,6 +188,10 @@ public class NickoBukkit extends JavaPlugin { return dataStore; } + public ConfigurationManager getConfigurationManager() { + return configurationManager; + } + public PlayerNameStore getNameStore() { return nameStore; } @@ -197,7 +200,7 @@ public class NickoBukkit extends JavaPlugin { return mojangAPI; } - public LocaleFileManager getLocaleFileManager() { - return localeFileManager; + public CustomLocale getCustomLocale() { + return customLocale; } } diff --git a/src/main/java/xyz/ineanto/nicko/i18n/CustomLocale.java b/src/main/java/xyz/ineanto/nicko/i18n/CustomLocale.java new file mode 100644 index 0000000..a70e504 --- /dev/null +++ b/src/main/java/xyz/ineanto/nicko/i18n/CustomLocale.java @@ -0,0 +1,77 @@ +package xyz.ineanto.nicko.i18n; + +import com.github.jsixface.YamlConfig; +import xyz.ineanto.nicko.NickoBukkit; +import xyz.ineanto.nicko.version.Version; +import xyz.xenondevs.invui.util.IOUtils; + +import java.io.*; +import java.time.Instant; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; +import java.util.logging.Logger; + +public class CustomLocale { + private final Logger logger = Logger.getLogger("CustomLocale"); + private final File directory = new File(NickoBukkit.getInstance().getDataFolder() + "/lang/"); + + private final File file; + private final File backupFile; + private final NickoBukkit instance; + private final String version; + private final Version versionObject; + private final BufferedInputStream inputStream; + private final BufferedOutputStream outputStream; + private final YamlConfig yamlFile; + + public CustomLocale(NickoBukkit instance) throws FileNotFoundException { + this.instance = instance; + this.file = new File(directory, "lang.yml"); + final String date = Instant.now() + .atZone(ZoneId.systemDefault()) + .format(DateTimeFormatter.ofPattern("dd-MM-yyyy")); + this.backupFile = new File(directory, "lang.old-" + date + ".yml"); + this.inputStream = new BufferedInputStream(new FileInputStream(file)); + this.outputStream = new BufferedOutputStream(new FileOutputStream(file)); + this.yamlFile = new YamlConfig(inputStream); + this.version = yamlFile.getString("version"); + this.versionObject = Version.fromString(version); + } + + public boolean dumpIntoFile(Locale locale) { + if (locale == Locale.CUSTOM) return true; + if (file.exists()) return true; + + try { + if (directory.mkdirs()) { + if (file.createNewFile()) { + IOUtils.copy(inputStream, outputStream, 8192); + } + } + return true; + } catch (IOException e) { + logger.severe("Unable to dump Locale: " + locale.getCode() + "!"); + return false; + } + } + + public String getVersion() { + return version; + } + + public Version getVersionObject() { + return versionObject; + } + + public YamlConfig getYamlFile() { + return yamlFile; + } + + public File getBackupFile() { + return backupFile; + } + + public File getFile() { + return file; + } +} diff --git a/src/main/java/xyz/ineanto/nicko/i18n/I18N.java b/src/main/java/xyz/ineanto/nicko/i18n/I18N.java index fd33cec..24bddf6 100644 --- a/src/main/java/xyz/ineanto/nicko/i18n/I18N.java +++ b/src/main/java/xyz/ineanto/nicko/i18n/I18N.java @@ -145,7 +145,7 @@ public class I18N { private YamlConfig getYamlConfig() { if (playerLocale == Locale.CUSTOM) { - return instance.getLocaleFileManager().getYamlFile(); + return instance.getCustomLocale().getYamlFile(); } else { final InputStream resource = instance.getResource(playerLocale.getCode() + ".yml"); return new YamlConfig(resource); diff --git a/src/main/java/xyz/ineanto/nicko/i18n/Locale.java b/src/main/java/xyz/ineanto/nicko/i18n/Locale.java index 3d8bd58..13a62c5 100644 --- a/src/main/java/xyz/ineanto/nicko/i18n/Locale.java +++ b/src/main/java/xyz/ineanto/nicko/i18n/Locale.java @@ -1,5 +1,7 @@ package xyz.ineanto.nicko.i18n; +import xyz.ineanto.nicko.version.Version; + import java.io.Serializable; public enum Locale implements Serializable { @@ -7,6 +9,8 @@ public enum Locale implements Serializable { FRENCH("fr", "Français"), CUSTOM("cm", "Server Custom"); + public static final Version VERSION = new Version(1, 1, 0); + private final String code; private transient final String name; diff --git a/src/main/java/xyz/ineanto/nicko/i18n/LocaleFileManager.java b/src/main/java/xyz/ineanto/nicko/i18n/LocaleFileManager.java deleted file mode 100644 index e612ed8..0000000 --- a/src/main/java/xyz/ineanto/nicko/i18n/LocaleFileManager.java +++ /dev/null @@ -1,46 +0,0 @@ -package xyz.ineanto.nicko.i18n; - -import com.github.jsixface.YamlConfig; -import xyz.ineanto.nicko.NickoBukkit; -import xyz.xenondevs.invui.util.IOUtils; - -import java.io.*; -import java.nio.file.Files; -import java.util.logging.Logger; - -public class LocaleFileManager { - private final Logger logger = Logger.getLogger("LocaleFileManager"); - private final File folder = new File(NickoBukkit.getInstance().getDataFolder() + "/lang/"); - private final File file = new File(folder, "lang.yml"); - private YamlConfig yamlFile; - - public boolean dumpFromLocale(Locale locale) { - if (locale == Locale.CUSTOM) return true; - if (file.exists()) return true; - final InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(locale.getCode() + ".yml"); - try { - if (folder.mkdirs()) { - if (file.createNewFile()) { - try (FileOutputStream outputStream = new FileOutputStream(file)) { - IOUtils.copy(inputStream, outputStream, 8192); - } - } - } - return true; - } catch (IOException e) { - logger.severe("Unable to dump Locale: " + locale.getCode() + "!"); - return false; - } - } - - public YamlConfig getYamlFile() { - if (yamlFile == null) { - try (BufferedInputStream inputStream = new BufferedInputStream(Files.newInputStream(file.toPath()))) { - yamlFile = new YamlConfig(inputStream); - } catch (IOException ignored) { - return null; - } - } - return yamlFile; - } -} diff --git a/src/main/java/xyz/ineanto/nicko/migration/ConfigurationMigrator.java b/src/main/java/xyz/ineanto/nicko/migration/ConfigurationMigrator.java new file mode 100644 index 0000000..7ab3a10 --- /dev/null +++ b/src/main/java/xyz/ineanto/nicko/migration/ConfigurationMigrator.java @@ -0,0 +1,36 @@ +package xyz.ineanto.nicko.migration; + +import xyz.ineanto.nicko.NickoBukkit; +import xyz.ineanto.nicko.config.Configuration; +import xyz.ineanto.nicko.config.ConfigurationManager; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.StandardCopyOption; + +public class ConfigurationMigrator implements Migrator { + private final NickoBukkit instance; + + public ConfigurationMigrator(NickoBukkit instance) { + this.instance = instance; + } + + @Override + public void migrate() { + final Configuration configuration = instance.getNickoConfig(); + final ConfigurationManager configurationManager = instance.getConfigurationManager(); + + // Migrate configuration (1.0.8-RC1) + if (configuration.getVersion() == null + || configuration.getVersion().isEmpty() + || configuration.getVersionObject().compareTo(Configuration.VERSION) != 0) { + instance.getLogger().info("Migrating configuration file to match the current version..."); + try { + Files.copy(configurationManager.getFile().toPath(), configurationManager.getBackupFile().toPath(), StandardCopyOption.ATOMIC_MOVE); + configurationManager.saveDefaultConfig(); + } catch (IOException e) { + instance.getLogger().severe("Failed to migrate your configuration!"); + } + } + } +} diff --git a/src/main/java/xyz/ineanto/nicko/migration/CustomLocaleMigrator.java b/src/main/java/xyz/ineanto/nicko/migration/CustomLocaleMigrator.java new file mode 100644 index 0000000..2e9193b --- /dev/null +++ b/src/main/java/xyz/ineanto/nicko/migration/CustomLocaleMigrator.java @@ -0,0 +1,35 @@ +package xyz.ineanto.nicko.migration; + +import xyz.ineanto.nicko.NickoBukkit; +import xyz.ineanto.nicko.i18n.CustomLocale; +import xyz.ineanto.nicko.i18n.Locale; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.StandardCopyOption; + +public class CustomLocaleMigrator implements Migrator { + private final NickoBukkit instance; + + public CustomLocaleMigrator(NickoBukkit instance) { + this.instance = instance; + } + + @Override + public void migrate() { + final CustomLocale customLanguageFile = instance.getCustomLocale(); + + // Migrate custom locale (1.1.0-RC1) + if (customLanguageFile.getVersionObject() == null + || customLanguageFile.getVersion().isEmpty() + || customLanguageFile.getVersionObject().compareTo(Locale.VERSION) != 0) { + instance.getLogger().info("Migrating custom locale to match the current version..."); + try { + Files.copy(customLanguageFile.getFile().toPath(), customLanguageFile.getBackupFile().toPath(), StandardCopyOption.ATOMIC_MOVE); + customLanguageFile.dumpIntoFile(Locale.ENGLISH); + } catch (IOException e) { + instance.getLogger().severe("Failed to migrate your custom locale!"); + } + } + } +} diff --git a/src/main/java/xyz/ineanto/nicko/migration/Migrator.java b/src/main/java/xyz/ineanto/nicko/migration/Migrator.java new file mode 100644 index 0000000..89bb64e --- /dev/null +++ b/src/main/java/xyz/ineanto/nicko/migration/Migrator.java @@ -0,0 +1,5 @@ +package xyz.ineanto.nicko.migration; + +public interface Migrator { + void migrate(); +} diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 27cca69..92219c5 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -1,7 +1,6 @@ # Nicko ${version} - Config: -# Specifies the configuration version. -# Do NOT modify this field. +# Specifies the configuration version. (Don't change!) version: "1.0.8" ############ diff --git a/src/main/resources/en.yml b/src/main/resources/en.yml index c719d68..c6cb3a7 100644 --- a/src/main/resources/en.yml +++ b/src/main/resources/en.yml @@ -1,3 +1,8 @@ +# Nicko ${version} - Language File: + +# Specifies the configuration version, don't change. +version: "1.1.0" + error: generic: "An unknown error occurred." permission: "§cYou do not have the required permission." diff --git a/src/main/resources/fr.yml b/src/main/resources/fr.yml index 491638d..e71d358 100644 --- a/src/main/resources/fr.yml +++ b/src/main/resources/fr.yml @@ -1,3 +1,8 @@ +# Nicko ${version} - Config: + +# Specifies the configuration version, don't change. +version: "1.1.0" + error: generic: "Une erreur inconnue c'est produite." permission: "§cVous ne possédez pas la permission."