From c5d471ca0ac921a6c716c7eab8d1bdf392fbba22 Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Sat, 7 Jun 2025 05:10:51 +0800 Subject: [PATCH] =?UTF-8?q?config=E8=BF=98=E6=98=AF=E5=A4=AA=E6=85=A2?= =?UTF-8?q?=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../feature/DisableResourceCommand.java | 2 +- .../feature/EnableResourceCommand.java | 2 +- .../core/pack/AbstractPackManager.java | 6 +- .../core/plugin/config/Config.java | 108 ++++++++++-------- .../locale/MiniMessageTranslatorImpl.java | 3 - .../plugin/locale/TranslationManagerImpl.java | 36 +----- 6 files changed, 70 insertions(+), 87 deletions(-) diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/DisableResourceCommand.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/DisableResourceCommand.java index c92513366..0aa938cb9 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/DisableResourceCommand.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/DisableResourceCommand.java @@ -53,7 +53,7 @@ public class DisableResourceCommand extends BukkitCommandFeature return; } } - YamlDocument document = plugin().config().loadYamlData(packMetaPath.toFile()); + YamlDocument document = plugin().config().loadYamlData(packMetaPath); document.set("enable", false); try { document.save(packMetaPath.toFile()); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/EnableResourceCommand.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/EnableResourceCommand.java index e565f9935..58960b6bc 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/EnableResourceCommand.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/EnableResourceCommand.java @@ -52,7 +52,7 @@ public class EnableResourceCommand extends BukkitCommandFeature { return; } } - YamlDocument document = plugin().config().loadYamlData(packMetaPath.toFile()); + YamlDocument document = plugin().config().loadYamlData(packMetaPath); document.set("enable", true); try { document.save(packMetaPath.toFile()); diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/AbstractPackManager.java b/core/src/main/java/net/momirealms/craftengine/core/pack/AbstractPackManager.java index bbfe9f75f..d9befc7a4 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/AbstractPackManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/AbstractPackManager.java @@ -266,7 +266,7 @@ public abstract class AbstractPackManager implements PackManager { String author = null; boolean enable = true; if (Files.exists(metaFile) && Files.isRegularFile(metaFile)) { - YamlDocument metaYML = Config.instance().loadYamlData(metaFile.toFile()); + YamlDocument metaYML = Config.instance().loadYamlData(metaFile); enable = metaYML.getBoolean("enable", true); namespace = metaYML.getString("namespace", namespace); description = metaYML.getString("description"); @@ -837,8 +837,8 @@ public abstract class AbstractPackManager implements PackManager { } private void generateBlockOverrides(Path generatedPackPath) { - File blockStatesFile = new File(plugin.dataFolderFile(), "blockstates.yml"); - if (!blockStatesFile.exists()) plugin.saveResource("blockstates.yml"); + Path blockStatesFile = this.plugin.dataFolderPath().resolve("blockstates.yml"); + if (!Files.exists(blockStatesFile)) this.plugin.saveResource("blockstates.yml"); YamlDocument preset = Config.instance().loadYamlData(blockStatesFile); for (Map.Entry> entry : plugin.blockManager().blockOverrides().entrySet()) { Key key = entry.getKey(); diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/Config.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/Config.java index af49ec1b7..4eaecf1f9 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/Config.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/Config.java @@ -25,12 +25,10 @@ import net.momirealms.craftengine.core.util.MiscUtils; import net.momirealms.craftengine.core.world.InjectionTarget; import net.momirealms.craftengine.core.world.chunk.storage.CompressionMethod; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; +import java.io.*; import java.nio.file.Files; import java.nio.file.Path; +import java.nio.file.attribute.BasicFileAttributes; import java.util.*; import java.util.stream.Collectors; @@ -40,6 +38,8 @@ public class Config { private final Path configFilePath; private final String configVersion; private YamlDocument config; + private long lastModified; + private long size; protected boolean firstTime = true; protected boolean debug; @@ -152,49 +152,63 @@ public class Config { } public void load() { - if (Files.exists(this.configFilePath)) { - this.config = this.loadYamlData(this.configFilePath.toFile()); - String configVersion = config.getString("config-version"); - if (configVersion.equals(this.configVersion)) { - loadSettings(); - return; - } + // 文件不存在,则保存 + if (!Files.exists(this.configFilePath)) { + this.plugin.saveResource("config.yml"); + } + try { + BasicFileAttributes attributes = Files.readAttributes(this.configFilePath, BasicFileAttributes.class); + long lastModified = attributes.lastModifiedTime().toMillis(); + long size = attributes.size(); + if (lastModified != this.lastModified || size != this.size) { + byte[] configFileBytes = Files.readAllBytes(this.configFilePath); + try (InputStream inputStream = new ByteArrayInputStream(configFileBytes)) { + this.config = YamlDocument.create(inputStream); + String configVersion = this.config.getString("config-version"); + if (!configVersion.equals(this.configVersion)) { + this.updateConfigVersion(configFileBytes); + } + } + // 加载配置文件 + this.loadSettings(); + this.lastModified = lastModified; + this.size = size; + } + } catch (IOException e) { + this.plugin.logger().severe("Failed to load config.yml", e); } - this.updateConfigVersion(); - loadSettings(); } - private void updateConfigVersion() { - this.config = this.loadYamlConfig( - "config.yml", - GeneralSettings.builder() - .setRouteSeparator('.') - .setUseDefaults(false) - .build(), - LoaderSettings - .builder() - .setAutoUpdate(true) - .build(), - DumperSettings.builder() - .setEscapeUnprintable(false) - .setScalarFormatter((tag, value, role, def) -> { - if (role == NodeRole.KEY) { - return ScalarStyle.PLAIN; - } else { - return tag == Tag.STR ? ScalarStyle.DOUBLE_QUOTED : ScalarStyle.PLAIN; - } - }) - .build(), - UpdaterSettings - .builder() - .setVersioning(new BasicVersioning("config-version")) - .addIgnoredRoute(PluginProperties.getValue("config"), "resource-pack.delivery.hosting", '.') - .build() - ); + private void updateConfigVersion(byte[] bytes) throws IOException { + try (InputStream inputStream = new ByteArrayInputStream(bytes)) { + this.config = YamlDocument.create(inputStream, this.plugin.resourceStream("config.yml"), GeneralSettings.builder() + .setRouteSeparator('.') + .setUseDefaults(false) + .build(), + LoaderSettings + .builder() + .setAutoUpdate(true) + .build(), + DumperSettings.builder() + .setEscapeUnprintable(false) + .setScalarFormatter((tag, value, role, def) -> { + if (role == NodeRole.KEY) { + return ScalarStyle.PLAIN; + } else { + return tag == Tag.STR ? ScalarStyle.DOUBLE_QUOTED : ScalarStyle.PLAIN; + } + }) + .build(), + UpdaterSettings + .builder() + .setVersioning(new BasicVersioning("config-version")) + .addIgnoredRoute(PluginProperties.getValue("config"), "resource-pack.delivery.hosting", '.') + .build()); + } try { - config.save(new File(plugin.dataFolderFile(), "config.yml")); + this.config.save(new File(plugin.dataFolderFile(), "config.yml")); } catch (IOException e) { - throw new RuntimeException(e); + this.plugin.logger().warn("Could not save config.yml", e); } } @@ -714,11 +728,11 @@ public class Config { } public YamlDocument loadOrCreateYamlData(String fileName) { - File file = new File(this.plugin.dataFolderFile(), fileName); - if (!file.exists()) { + Path path = this.plugin.dataFolderPath().resolve(fileName); + if (!Files.exists(path)) { this.plugin.saveResource(fileName); } - return this.loadYamlData(file); + return this.loadYamlData(path); } public YamlDocument loadYamlConfig(String filePath, GeneralSettings generalSettings, LoaderSettings loaderSettings, DumperSettings dumperSettings, UpdaterSettings updaterSettings) { @@ -730,8 +744,8 @@ public class Config { } } - public YamlDocument loadYamlData(File file) { - try (InputStream inputStream = new FileInputStream(file)) { + public YamlDocument loadYamlData(Path file) { + try (InputStream inputStream = Files.newInputStream(file)) { return YamlDocument.create(inputStream); } catch (IOException e) { this.plugin.logger().severe("Failed to load config " + file, e); diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/MiniMessageTranslatorImpl.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/MiniMessageTranslatorImpl.java index d43db429f..8bbfe0ecc 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/MiniMessageTranslatorImpl.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/MiniMessageTranslatorImpl.java @@ -11,10 +11,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.text.MessageFormat; -import java.util.Collections; import java.util.Locale; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Stream; public class MiniMessageTranslatorImpl implements MiniMessageTranslator { diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/TranslationManagerImpl.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/TranslationManagerImpl.java index b4308602a..ce70f2b48 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/TranslationManagerImpl.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/TranslationManagerImpl.java @@ -139,8 +139,6 @@ public class TranslationManagerImpl implements TranslationManager { } private void loadFromCache() { - Map> loaded = new HashMap<>(); - for (Map.Entry entry : this.cachedTranslations.entrySet()) { Locale locale = TranslationManager.parseLocale(entry.getKey()); if (locale == null) { @@ -150,26 +148,20 @@ public class TranslationManagerImpl implements TranslationManager { Map translations = entry.getValue().translations(); this.registry.registerAll(locale, translations); this.installed.add(locale); - loaded.put(locale, translations); - } - - // try registering the locale without a country code - if we don't already have a registration for that - loaded.forEach((locale, bundle) -> { Locale localeWithoutCountry = Locale.of(locale.getLanguage()); if (!locale.equals(localeWithoutCountry) && !localeWithoutCountry.equals(DEFAULT_LOCALE) && this.installed.add(localeWithoutCountry)) { try { - this.registry.registerAll(localeWithoutCountry, bundle); + this.registry.registerAll(localeWithoutCountry, translations); } catch (IllegalArgumentException e) { // ignore } } - }); + } } public void loadFromFileSystem(Path directory) { Map previousTranslations = this.cachedTranslations; this.cachedTranslations = new HashMap<>(); - Yaml yaml = new Yaml(new TranslationConfigConstructor(new LoaderOptions())); try { Files.walkFileTree(directory, new SimpleFileVisitor<>() { @Override @@ -184,6 +176,7 @@ public class TranslationManagerImpl implements TranslationManager { TranslationManagerImpl.this.cachedTranslations.put(localeName, cachedFile); } else { try (InputStreamReader inputStream = new InputStreamReader(Files.newInputStream(path), StandardCharsets.UTF_8)) { + Yaml yaml = new Yaml(new TranslationConfigConstructor(new LoaderOptions())); Map data = yaml.load(inputStream); if (data == null) return FileVisitResult.CONTINUE; String langVersion = data.getOrDefault("lang-version", ""); @@ -317,27 +310,6 @@ public class TranslationManagerImpl implements TranslationManager { } } - private static class CachedTranslation { - private final Map translations; - private final long lastModified; - private final long size; - - public CachedTranslation(Map translations, long lastModified, long size) { - this.lastModified = lastModified; - this.translations = translations; - this.size = size; - } - - public long lastModified() { - return lastModified; - } - - public long size() { - return size; - } - - public Map translations() { - return translations; - } + private record CachedTranslation(Map translations, long lastModified, long size) { } }