package fr.jessydavid.dimension_access.config; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonArray; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import fr.jessydavid.dimension_access.DimensionAccessMod; import net.fabricmc.loader.api.FabricLoader; import java.io.IOException; import java.io.Reader; import java.io.Writer; import java.nio.file.Files; import java.nio.file.Path; import java.util.Collections; import java.util.HashSet; import java.util.Set; public class DimensionAccessConfig { private static final Gson GSON = new GsonBuilder().setPrettyPrinting().create(); private static final String CONFIG_FILE = "dimension_access.json"; private final Path configPath; private final Set disabledDimensions = Collections.synchronizedSet(new HashSet<>()); public DimensionAccessConfig() { this.configPath = FabricLoader.getInstance().getConfigDir().resolve(CONFIG_FILE); } public void load() { if (!Files.exists(configPath)) { DimensionAccessMod.LOGGER.info("[DimensionAccess] No config found, creating default at: {}", configPath); save(); return; } try (Reader reader = Files.newBufferedReader(configPath)) { JsonObject root = JsonParser.parseReader(reader).getAsJsonObject(); JsonArray disabled = root.getAsJsonArray("disabled_dimensions"); synchronized (disabledDimensions) { disabledDimensions.clear(); if (disabled != null) { disabled.forEach(el -> disabledDimensions.add(el.getAsString())); } } DimensionAccessMod.LOGGER.info("[DimensionAccess] Config loaded: {} dimension(s) disabled.", disabledDimensions.size()); } catch (IOException e) { DimensionAccessMod.LOGGER.error("[DimensionAccess] Failed to load config: {}", e.getMessage()); } } public void save() { JsonObject root = new JsonObject(); JsonArray disabled = new JsonArray(); synchronized (disabledDimensions) { disabledDimensions.stream().sorted().forEach(disabled::add); } root.add("disabled_dimensions", disabled); try { Files.createDirectories(configPath.getParent()); try (Writer writer = Files.newBufferedWriter(configPath)) { GSON.toJson(root, writer); } } catch (IOException e) { DimensionAccessMod.LOGGER.error("[DimensionAccess] Failed to save config: {}", e.getMessage()); } } public boolean disableDimension(String dimensionId) { boolean added = disabledDimensions.add(dimensionId); if (added) save(); return added; } public boolean enableDimension(String dimensionId) { boolean removed = disabledDimensions.remove(dimensionId); if (removed) save(); return removed; } public boolean isDimensionDisabled(String dimensionId) { return disabledDimensions.contains(dimensionId); } public Set getDisabledDimensions() { synchronized (disabledDimensions) { return Collections.unmodifiableSet(new HashSet<>(disabledDimensions)); } } public Path getConfigPath() { return configPath; } }