From fe7e1aa28d548c61cdd6ea1c6e53d2f3ad696464 Mon Sep 17 00:00:00 2001 From: Frank Date: Fri, 20 Aug 2021 14:15:21 +0200 Subject: [PATCH] Prepare Configs that enable us to derive a ConfigScreen --- .../handler/autosync/AutoFileSyncEntry.java | 10 +- .../handler/autosync/AutoSync.java | 74 +++++++---- .../handler/autosync/HelloClient.java | 74 +++++------ .../handler/autosync/HelloServer.java | 7 +- .../handler/autosync/RequestFiles.java | 7 +- .../handler/autosync/SendFiles.java | 19 +-- src/main/java/ru/bclib/config/Configs.java | 6 +- .../java/ru/bclib/config/NamedPathConfig.java | 118 +++++++++++++++++- src/main/java/ru/bclib/config/PathConfig.java | 4 +- 9 files changed, 238 insertions(+), 81 deletions(-) diff --git a/src/main/java/ru/bclib/api/dataexchange/handler/autosync/AutoFileSyncEntry.java b/src/main/java/ru/bclib/api/dataexchange/handler/autosync/AutoFileSyncEntry.java index 4969bb2e..83e4ff0b 100644 --- a/src/main/java/ru/bclib/api/dataexchange/handler/autosync/AutoFileSyncEntry.java +++ b/src/main/java/ru/bclib/api/dataexchange/handler/autosync/AutoFileSyncEntry.java @@ -6,10 +6,10 @@ import ru.bclib.api.dataexchange.DataHandler; import ru.bclib.api.dataexchange.SyncFileHash; import ru.bclib.api.dataexchange.handler.autosync.AutoSync.NeedTransferPredicate; import ru.bclib.api.dataexchange.handler.autosync.SyncFolderDescriptor.SubFile; -import ru.bclib.config.Config; import ru.bclib.util.ModUtil; -import ru.bclib.util.Pair; import ru.bclib.util.ModUtil.ModInfo; +import ru.bclib.util.Pair; +import ru.bclib.util.PathUtil; import ru.bclib.util.Triple; import java.io.File; @@ -182,6 +182,12 @@ class AutoFileSyncEntry extends AutoSyncID { } private int serializeFileContent(FriendlyByteBuf buf) { + if (!PathUtil.isChildOf(PathUtil.GAME_FOLDER, fileName.toPath())){ + BCLib.LOGGER.error(fileName + " is not within game folder " + PathUtil.GAME_FOLDER + ". Pretending it does not exist."); + buf.writeInt(0); + return 0; + } + byte[] content = getContent(); buf.writeInt(content.length); buf.writeByteArray(content); diff --git a/src/main/java/ru/bclib/api/dataexchange/handler/autosync/AutoSync.java b/src/main/java/ru/bclib/api/dataexchange/handler/autosync/AutoSync.java index 29ab0706..53f98388 100644 --- a/src/main/java/ru/bclib/api/dataexchange/handler/autosync/AutoSync.java +++ b/src/main/java/ru/bclib/api/dataexchange/handler/autosync/AutoSync.java @@ -6,6 +6,8 @@ import net.fabricmc.loader.api.FabricLoader; import ru.bclib.BCLib; import ru.bclib.api.dataexchange.SyncFileHash; import ru.bclib.config.Configs; +import ru.bclib.config.NamedPathConfig; +import ru.bclib.config.NamedPathConfig.ConfigToken.Bool; import ru.bclib.util.PathUtil; import java.io.File; @@ -29,43 +31,63 @@ public class AutoSync { } @Environment(EnvType.CLIENT) - static class ClientConfig { - public static boolean shouldPrintDebugHashes() { - return Configs.CLIENT_CONFIG.getBoolean(SYNC_CATEGORY, "debugHashes", true); + public static class ClientConfig extends NamedPathConfig{ + public static final ConfigToken.Bool DEBUG_HASHES = new Bool(true, SYNC_CATEGORY, "debugHashes"); + public static final ConfigToken.Bool ENABLED = new Bool(true, SYNC_CATEGORY, "enabled"); + public static final ConfigToken.Bool ACCEPT_CONFIGS = new Bool(true, "acceptConfigs", "enabled"); + public static final ConfigToken.Bool ACCEPT_FILES = new Bool(true, "acceptFiles", "enabled"); + public static final ConfigToken.Bool ACCEPT_MODS = new Bool(true, "acceptMods", "enabled"); + + public ClientConfig(){ + super(BCLib.MOD_ID, "client", false); } - public static boolean isAllowingAutoSync() { - return Configs.CLIENT_CONFIG.getBoolean(SYNC_CATEGORY, "enabled", true); + public boolean shouldPrintDebugHashes() { + return get(DEBUG_HASHES); } - public static boolean isAcceptingMods() { - return Configs.CLIENT_CONFIG.getBoolean(SYNC_CATEGORY, "acceptMods", true) && isAllowingAutoSync(); + public boolean isAllowingAutoSync() { + return get(ENABLED); } - public static boolean isAcceptingConfigs() { - return Configs.CLIENT_CONFIG.getBoolean(SYNC_CATEGORY, "acceptConfigs", true) && isAllowingAutoSync(); + public boolean isAcceptingMods() { + return get(ACCEPT_MODS) && isAllowingAutoSync(); } - public static boolean isAcceptingFiles() { - return Configs.CLIENT_CONFIG.getBoolean(SYNC_CATEGORY, "acceptFolders", true) && isAllowingAutoSync(); + public boolean isAcceptingConfigs() { + return get(ACCEPT_CONFIGS) && isAllowingAutoSync(); + } + + public boolean isAcceptingFiles() { + return get(ACCEPT_FILES) && isAllowingAutoSync(); } } - static class Config { - public static boolean isAllowingAutoSync() { - return Configs.SERVER_CONFIG.getBoolean(SYNC_CATEGORY, "enabled", true); + public static class ServerConfig extends NamedPathConfig { + public static final ConfigToken.Bool ENABLED = new Bool(true, SYNC_CATEGORY, "enabled"); + public static final ConfigToken.Bool OFFER_CONFIGS = new Bool(true, "offerConfigs", "enabled"); + public static final ConfigToken.Bool OFFER_FILES = new Bool(true, "offerFiles", "enabled"); + public static final ConfigToken.Bool OFFER_MODS = new Bool(true, "offerMods", "enabled"); + + + public ServerConfig(){ + super(BCLib.MOD_ID, "server", false); } - public static boolean isOfferingConfigs() { - return Configs.SERVER_CONFIG.getBoolean(SYNC_CATEGORY, "offerConfigs", true) && isAllowingAutoSync(); + public boolean isAllowingAutoSync() { + return get(ENABLED); } - public static boolean isOfferingFiles() { - return Configs.SERVER_CONFIG.getBoolean(SYNC_CATEGORY, "offerFolders", true) && isAllowingAutoSync(); + public boolean isOfferingConfigs() { + return get(OFFER_CONFIGS) && isAllowingAutoSync(); } - public static boolean isOfferingMods() { - return Configs.SERVER_CONFIG.getBoolean(SYNC_CATEGORY, "offerMods", true) && isAllowingAutoSync(); + public boolean isOfferingFiles() { + return get(OFFER_FILES) && isAllowingAutoSync(); + } + + public boolean isOfferingMods() { + return get(OFFER_MODS) && isAllowingAutoSync(); } } @@ -120,7 +142,11 @@ public class AutoSync { * for comparison is sufficient. */ public static void addAutoSyncFileData(String modID, File fileName, boolean requestContent, NeedTransferPredicate needTransfer) { - autoSyncFiles.add(new AutoFileSyncEntry(modID, fileName, requestContent, needTransfer)); + if (!PathUtil.isChildOf(PathUtil.GAME_FOLDER, fileName.toPath())){ + BCLib.LOGGER.error(fileName + " is outside of Game Folder " + PathUtil.GAME_FOLDER); + } else { + autoSyncFiles.add(new AutoFileSyncEntry(modID, fileName, requestContent, needTransfer)); + } } /** @@ -139,7 +165,11 @@ public class AutoSync { * for comparison is sufficient. */ public static void addAutoSyncFileData(String modID, String uniqueID, File fileName, boolean requestContent, NeedTransferPredicate needTransfer) { - autoSyncFiles.add(new AutoFileSyncEntry(modID, uniqueID, fileName, requestContent, needTransfer)); + if (!PathUtil.isChildOf(PathUtil.GAME_FOLDER, fileName.toPath())){ + BCLib.LOGGER.error(fileName + " is outside of Game Folder " + PathUtil.GAME_FOLDER); + } else { + autoSyncFiles.add(new AutoFileSyncEntry(modID, uniqueID, fileName, requestContent, needTransfer)); + } } /** diff --git a/src/main/java/ru/bclib/api/dataexchange/handler/autosync/HelloClient.java b/src/main/java/ru/bclib/api/dataexchange/handler/autosync/HelloClient.java index bcb0ce90..3f6a9c3b 100644 --- a/src/main/java/ru/bclib/api/dataexchange/handler/autosync/HelloClient.java +++ b/src/main/java/ru/bclib/api/dataexchange/handler/autosync/HelloClient.java @@ -11,16 +11,15 @@ import ru.bclib.BCLib; import ru.bclib.api.dataexchange.DataExchangeAPI; import ru.bclib.api.dataexchange.DataHandler; import ru.bclib.api.dataexchange.DataHandlerDescriptor; -import ru.bclib.api.dataexchange.handler.autosync.AutoSync.ClientConfig; -import ru.bclib.api.dataexchange.handler.autosync.AutoSync.Config; import ru.bclib.api.dataexchange.handler.autosync.AutoSyncID.WithContentOverride; import ru.bclib.api.dataexchange.handler.autosync.SyncFolderDescriptor.SubFile; +import ru.bclib.config.Configs; import ru.bclib.gui.screens.SyncFilesScreen; import ru.bclib.gui.screens.WarnBCLibVersionMismatch; import ru.bclib.util.ModUtil; +import ru.bclib.util.ModUtil.ModInfo; import ru.bclib.util.Pair; import ru.bclib.util.PathUtil; -import ru.bclib.util.ModUtil.ModInfo; import java.io.File; import java.io.IOException; @@ -51,7 +50,7 @@ public class HelloClient extends DataHandler.FromServer { @Override protected boolean prepareDataOnServer() { - if (!Config.isAllowingAutoSync()) { + if (!Configs.SERVER_CONFIG.isAllowingAutoSync()) { BCLib.LOGGER.info("Auto-Sync was disabled on the server."); return false; } @@ -69,16 +68,16 @@ public class HelloClient extends DataHandler.FromServer { //write BCLibVersion (=protocol version) buf.writeInt(ModUtil.convertModVersion(vbclib)); - if (Config.isOfferingMods()) { + if (Configs.SERVER_CONFIG.isOfferingMods()) { //write Plugin Versions buf.writeInt(mods.size()); for (String modID : mods) { final String ver = ModUtil.getModVersion(modID); final ModInfo mi = ModUtil.getModInfo(modID); int size = 0; - if (mi!=null) { + if (mi != null) { try { - size = (int)Files.size(mi.jarPath); + size = (int) Files.size(mi.jarPath); } catch (IOException e) { BCLib.LOGGER.error("Unable to get File Size: " + e.getMessage()); @@ -89,7 +88,7 @@ public class HelloClient extends DataHandler.FromServer { buf.writeInt(ModUtil.convertModVersion(ver)); buf.writeInt(size); - BCLib.LOGGER.info(" - Listing Mod " + modID + " v" + ver + " ("+PathUtil.humanReadableFileSize(size)+")"); + BCLib.LOGGER.info(" - Listing Mod " + modID + " v" + ver + " (" + PathUtil.humanReadableFileSize(size) + ")"); } } else { @@ -97,20 +96,19 @@ public class HelloClient extends DataHandler.FromServer { buf.writeInt(0); } - if (Config.isOfferingFiles() || Config.isOfferingConfigs()) { + if (Configs.SERVER_CONFIG.isOfferingFiles() || Configs.SERVER_CONFIG.isOfferingConfigs()) { //do only include files that exist on the server - final List existingAutoSyncFiles = AutoSync - .getAutoSyncFiles() - .stream() - .filter(e -> e.fileName.exists()) - .filter(e -> (e.isConfigFile() && Config.isOfferingConfigs()) || (e instanceof AutoFileSyncEntry.ForDirectFileRequest && Config.isOfferingFiles())) - .collect(Collectors.toList()); + final List existingAutoSyncFiles = AutoSync.getAutoSyncFiles() + .stream() + .filter(e -> e.fileName.exists()) + .filter(e -> (e.isConfigFile() && Configs.SERVER_CONFIG.isOfferingConfigs()) || (e instanceof AutoFileSyncEntry.ForDirectFileRequest && Configs.SERVER_CONFIG.isOfferingFiles())) + .collect(Collectors.toList()); //send config Data buf.writeInt(existingAutoSyncFiles.size()); for (AutoFileSyncEntry entry : existingAutoSyncFiles) { entry.serialize(buf); - BCLib.LOGGER.info(" - Offering " + (entry.isConfigFile()?"Config ":"File ") + entry); + BCLib.LOGGER.info(" - Offering " + (entry.isConfigFile() ? "Config " : "File ") + entry); } } else { @@ -118,7 +116,7 @@ public class HelloClient extends DataHandler.FromServer { buf.writeInt(0); } - if (Config.isOfferingFiles()) { + if (Configs.SERVER_CONFIG.isOfferingFiles()) { buf.writeInt(AutoSync.syncFolderDescriptions.size()); AutoSync.syncFolderDescriptions.forEach(desc -> { BCLib.LOGGER.info(" - Offering Folder " + desc.localFolder + " (allowDelete=" + desc.removeAdditionalFiles + ")"); @@ -154,7 +152,8 @@ public class HelloClient extends DataHandler.FromServer { //since v0.4.1 we also send the size of the mod-File if (protocolVersion_0_4_1) { size = buf.readInt(); - } else { + } + else { size = 0; } modVersion.put(id, new Pair<>(version, size)); @@ -184,7 +183,7 @@ public class HelloClient extends DataHandler.FromServer { @Environment(EnvType.CLIENT) private void processAutoSyncFolder(final List filesToRequest, final List filesToRemove) { - if (!ClientConfig.isAcceptingFiles()) { + if (!Configs.CLIENT_CONFIG.isAcceptingFiles()) { return; } @@ -250,7 +249,7 @@ public class HelloClient extends DataHandler.FromServer { @Environment(EnvType.CLIENT) private void processSingleFileSync(final List filesToRequest) { - final boolean debugHashes = ClientConfig.shouldPrintDebugHashes(); + final boolean debugHashes = Configs.CLIENT_CONFIG.shouldPrintDebugHashes(); if (autoSyncedFiles.size() > 0) { BCLib.LOGGER.info("Files offered by Server:"); @@ -292,10 +291,10 @@ public class HelloClient extends DataHandler.FromServer { for (Entry> e : modVersion.entrySet()) { final String localVersion = ModUtil.getModVersion(e.getKey()); final Pair serverInfo = e.getValue(); - final boolean requestMod = !serverInfo.first.equals(localVersion) && serverInfo.second>0; + final boolean requestMod = !serverInfo.first.equals(localVersion) && serverInfo.second > 0; - BCLib.LOGGER.info(" - " + e.getKey() + " (client=" + localVersion + ", server=" + serverInfo.first + ", size=" + PathUtil.humanReadableFileSize(serverInfo.second) + (requestMod?", requesting":"") +")"); - if (requestMod){ + BCLib.LOGGER.info(" - " + e.getKey() + " (client=" + localVersion + ", server=" + serverInfo.first + ", size=" + PathUtil.humanReadableFileSize(serverInfo.second) + (requestMod ? ", requesting" : "") + ")"); + if (requestMod) { filesToRequest.add(new AutoSyncID.ForModFileRequest(e.getKey(), serverInfo.first)); } } @@ -305,7 +304,7 @@ public class HelloClient extends DataHandler.FromServer { @Environment(EnvType.CLIENT) @Override protected void runOnClientGameThread(Minecraft client) { - if (!ClientConfig.isAllowingAutoSync()) { + if (!Configs.CLIENT_CONFIG.isAllowingAutoSync()) { BCLib.LOGGER.info("Auto-Sync was disabled on the client."); return; } @@ -321,7 +320,6 @@ public class HelloClient extends DataHandler.FromServer { final List filesToRemove = new ArrayList<>(2); - processModFileSync(filesToRequest); processSingleFileSync(filesToRequest); processAutoSyncFolder(filesToRequest, filesToRemove); @@ -330,10 +328,7 @@ public class HelloClient extends DataHandler.FromServer { //Both client and server need to know about the folder you want to sync //Files can only get placed within that folder - if ( - (filesToRequest.size() > 0 || filesToRemove.size() > 0) - && (ClientConfig.isAcceptingMods() || ClientConfig.isAcceptingConfigs() || ClientConfig.isAcceptingFiles()) - ) { + if ((filesToRequest.size() > 0 || filesToRemove.size() > 0) && ( Configs.CLIENT_CONFIG.isAcceptingMods() || Configs.CLIENT_CONFIG.isAcceptingConfigs() || Configs.CLIENT_CONFIG.isAcceptingFiles())) { showSyncFilesScreen(client, filesToRequest, filesToRemove); return; } @@ -360,14 +355,17 @@ public class HelloClient extends DataHandler.FromServer { int folderFiles = 0; int modFiles = 0; - for (AutoSyncID aid : files){ - if (aid.isConfigFile()){ + for (AutoSyncID aid : files) { + if (aid.isConfigFile()) { configFiles++; - } else if (aid instanceof AutoSyncID.ForModFileRequest){ + } + else if (aid instanceof AutoSyncID.ForModFileRequest) { modFiles++; - } else if (aid instanceof AutoSyncID.ForDirectFileRequest){ + } + else if (aid instanceof AutoSyncID.ForDirectFileRequest) { folderFiles++; - } else { + } + else { singleFiles++; } } @@ -381,11 +379,13 @@ public class HelloClient extends DataHandler.FromServer { List requestFiles = new ArrayList<>(files.toArray().length); files.forEach(aid -> { - if (aid.isConfigFile() && downloadConfigs){ + if (aid.isConfigFile() && downloadConfigs) { processOfferedFile(requestFiles, aid); - } else if (aid instanceof AutoSyncID.ForModFileRequest && downloadMods){ + } + else if (aid instanceof AutoSyncID.ForModFileRequest && downloadMods) { processOfferedFile(requestFiles, aid); - } else if (downloadFiles){ + } + else if (downloadFiles) { processOfferedFile(requestFiles, aid); } }); diff --git a/src/main/java/ru/bclib/api/dataexchange/handler/autosync/HelloServer.java b/src/main/java/ru/bclib/api/dataexchange/handler/autosync/HelloServer.java index 1bab883d..90c5f403 100644 --- a/src/main/java/ru/bclib/api/dataexchange/handler/autosync/HelloServer.java +++ b/src/main/java/ru/bclib/api/dataexchange/handler/autosync/HelloServer.java @@ -10,8 +10,7 @@ import ru.bclib.BCLib; import ru.bclib.api.dataexchange.DataExchangeAPI; import ru.bclib.api.dataexchange.DataHandler; import ru.bclib.api.dataexchange.DataHandlerDescriptor; -import ru.bclib.api.dataexchange.handler.autosync.AutoSync.ClientConfig; -import ru.bclib.api.dataexchange.handler.autosync.AutoSync.Config; +import ru.bclib.config.Configs; import ru.bclib.util.ModUtil; import java.io.File; @@ -70,7 +69,7 @@ public class HelloServer extends DataHandler.FromClient { @Environment(EnvType.CLIENT) @Override protected boolean prepareDataOnClient() { - if (!ClientConfig.isAllowingAutoSync()) { + if (! Configs.CLIENT_CONFIG.isAllowingAutoSync()) { BCLib.LOGGER.info("Auto-Sync was disabled on the client."); return false; } @@ -91,7 +90,7 @@ public class HelloServer extends DataHandler.FromClient { @Override protected void runOnServerGameThread(MinecraftServer server) { - if (!Config.isAllowingAutoSync()) { + if (!Configs.SERVER_CONFIG.isAllowingAutoSync()) { BCLib.LOGGER.info("Auto-Sync was disabled on the server."); return; } diff --git a/src/main/java/ru/bclib/api/dataexchange/handler/autosync/RequestFiles.java b/src/main/java/ru/bclib/api/dataexchange/handler/autosync/RequestFiles.java index 2caafdc9..45579906 100644 --- a/src/main/java/ru/bclib/api/dataexchange/handler/autosync/RequestFiles.java +++ b/src/main/java/ru/bclib/api/dataexchange/handler/autosync/RequestFiles.java @@ -9,8 +9,7 @@ import net.minecraft.server.MinecraftServer; import ru.bclib.BCLib; import ru.bclib.api.dataexchange.DataHandler; import ru.bclib.api.dataexchange.DataHandlerDescriptor; -import ru.bclib.api.dataexchange.handler.autosync.AutoSync.ClientConfig; -import ru.bclib.api.dataexchange.handler.autosync.AutoSync.Config; +import ru.bclib.config.Configs; import java.util.ArrayList; import java.util.List; @@ -35,7 +34,7 @@ public class RequestFiles extends DataHandler.FromClient { @Environment(EnvType.CLIENT) @Override protected boolean prepareDataOnClient() { - if (!ClientConfig.isAllowingAutoSync()) { + if (! Configs.CLIENT_CONFIG.isAllowingAutoSync()) { BCLib.LOGGER.info("Auto-Sync was disabled on the client."); return false; } @@ -75,7 +74,7 @@ public class RequestFiles extends DataHandler.FromClient { @Override protected void runOnServerGameThread(MinecraftServer server) { - if (!Config.isAllowingAutoSync()) { + if (!Configs.SERVER_CONFIG.isAllowingAutoSync()) { BCLib.LOGGER.info("Auto-Sync was disabled on the server."); return; } diff --git a/src/main/java/ru/bclib/api/dataexchange/handler/autosync/SendFiles.java b/src/main/java/ru/bclib/api/dataexchange/handler/autosync/SendFiles.java index f149253b..ea768910 100644 --- a/src/main/java/ru/bclib/api/dataexchange/handler/autosync/SendFiles.java +++ b/src/main/java/ru/bclib/api/dataexchange/handler/autosync/SendFiles.java @@ -10,7 +10,7 @@ import ru.bclib.BCLib; import ru.bclib.api.dataexchange.DataHandler; import ru.bclib.api.dataexchange.DataHandlerDescriptor; import ru.bclib.api.dataexchange.handler.autosync.AutoSync.ClientConfig; -import ru.bclib.api.dataexchange.handler.autosync.AutoSync.Config; +import ru.bclib.config.Configs; import ru.bclib.gui.screens.ConfirmRestartScreen; import ru.bclib.util.Pair; import ru.bclib.util.PathUtil; @@ -42,7 +42,7 @@ public class SendFiles extends DataHandler.FromServer { @Override protected boolean prepareDataOnServer() { - if (!Config.isAllowingAutoSync()) { + if (!Configs.SERVER_CONFIG.isAllowingAutoSync()) { BCLib.LOGGER.info("Auto-Sync was disabled on the server."); return false; } @@ -84,7 +84,7 @@ public class SendFiles extends DataHandler.FromServer { @Environment(EnvType.CLIENT) @Override protected void deserializeIncomingDataOnClient(FriendlyByteBuf buf, PacketSender responseSender) { - if (ClientConfig.isAcceptingConfigs() || ClientConfig.isAcceptingFiles() || ClientConfig.isAcceptingMods()) { + if ( Configs.CLIENT_CONFIG.isAcceptingConfigs() || Configs.CLIENT_CONFIG.isAcceptingFiles() || Configs.CLIENT_CONFIG.isAcceptingMods()) { token = readString(buf); if (!token.equals(RequestFiles.currentToken)) { RequestFiles.newToken(); @@ -101,13 +101,13 @@ public class SendFiles extends DataHandler.FromServer { Triple p = AutoFileSyncEntry.deserializeContent(buf); if (p.first != null) { final String type; - if (p.first.isConfigFile() && ClientConfig.isAcceptingConfigs()) { + if (p.first.isConfigFile() && Configs.CLIENT_CONFIG.isAcceptingConfigs()) { receivedFiles.add(p); type = "Accepted Config "; - } else if (p.first instanceof AutoFileSyncEntry.ForModFileRequest && ClientConfig.isAcceptingMods()){ + } else if (p.first instanceof AutoFileSyncEntry.ForModFileRequest && Configs.CLIENT_CONFIG.isAcceptingMods()){ receivedFiles.add(p); type = "Accepted Mod "; - } else if (ClientConfig.isAcceptingFiles()){ + } else if ( Configs.CLIENT_CONFIG.isAcceptingFiles()){ receivedFiles.add(p); type = "Accepted File "; } else { @@ -125,7 +125,7 @@ public class SendFiles extends DataHandler.FromServer { @Environment(EnvType.CLIENT) @Override protected void runOnClientGameThread(Minecraft client) { - if (ClientConfig.isAcceptingConfigs() || ClientConfig.isAcceptingFiles() || ClientConfig.isAcceptingMods()) { + if ( Configs.CLIENT_CONFIG.isAcceptingConfigs() || Configs.CLIENT_CONFIG.isAcceptingFiles() || Configs.CLIENT_CONFIG.isAcceptingMods()) { BCLib.LOGGER.info("Writing Files:"); //TODO: Reject files that were not in the last RequestFiles. @@ -143,6 +143,11 @@ public class SendFiles extends DataHandler.FromServer { @Environment(EnvType.CLIENT) static void writeSyncedFile(AutoSyncID e, byte[] data, File fileName) { + if (!PathUtil.isChildOf(PathUtil.GAME_FOLDER, fileName.toPath())){ + BCLib.LOGGER.error(fileName + " is not within game folder " + PathUtil.GAME_FOLDER); + return; + } + if (!PathUtil.MOD_BAK_FOLDER.toFile().exists()){ PathUtil.MOD_BAK_FOLDER.toFile().mkdirs(); } diff --git a/src/main/java/ru/bclib/config/Configs.java b/src/main/java/ru/bclib/config/Configs.java index d6569498..621fd848 100644 --- a/src/main/java/ru/bclib/config/Configs.java +++ b/src/main/java/ru/bclib/config/Configs.java @@ -3,6 +3,8 @@ package ru.bclib.config; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import ru.bclib.BCLib; +import ru.bclib.api.dataexchange.handler.autosync.AutoSync.ClientConfig; +import ru.bclib.api.dataexchange.handler.autosync.AutoSync.ServerConfig; public class Configs { public static final PathConfig GENERATOR_CONFIG = new PathConfig(BCLib.MOD_ID, "generator"); @@ -12,8 +14,8 @@ public class Configs { public static final PathConfig RECIPE_CONFIG = new PathConfig(BCLib.MOD_ID, "recipes"); @Environment(EnvType.CLIENT) - public static final PathConfig CLIENT_CONFIG = new PathConfig(BCLib.MOD_ID, "client", false); - public static final PathConfig SERVER_CONFIG = new PathConfig(BCLib.MOD_ID, "server", false); + public static final ClientConfig CLIENT_CONFIG = new ClientConfig(); + public static final ServerConfig SERVER_CONFIG = new ServerConfig(); public static void save() { MAIN_CONFIG.saveChanges(); diff --git a/src/main/java/ru/bclib/config/NamedPathConfig.java b/src/main/java/ru/bclib/config/NamedPathConfig.java index f30dcf3f..71733d0b 100644 --- a/src/main/java/ru/bclib/config/NamedPathConfig.java +++ b/src/main/java/ru/bclib/config/NamedPathConfig.java @@ -1,2 +1,118 @@ -package ru.bclib.config;public class NamedPathConfig { +package ru.bclib.config; + +import net.minecraft.resources.ResourceLocation; +import ru.bclib.BCLib; + +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; +import java.util.LinkedList; +import java.util.List; + +public class NamedPathConfig extends PathConfig{ + public abstract static class ConfigToken extends ConfigKey{ + public static class Int extends ConfigToken{ + public final int defaultValue; + public Int(int def, String entry, String... path) { super(entry, path); this.defaultValue=def;} + public Int(int def, String entry, ResourceLocation path) { super(entry, path); this.defaultValue=def;} + } + + public static class Float extends ConfigToken{ + public final float defaultValue; + public Float(float def, String entry, String... path) { super(entry, path); this.defaultValue=def;} + public Float(float def, String entry, ResourceLocation path) { super(entry, path); this.defaultValue=def;} + } + + public static class Bool extends ConfigToken{ + public final boolean defaultValue; + public Bool(boolean def, String entry, String... path) { super(entry, path); this.defaultValue=def;} + public Bool(boolean def, String entry, ResourceLocation path) { super(entry, path); this.defaultValue=def;} + } + + + public static class Str extends ConfigToken{ + public final String defaultValue; + public Str(String def, String entry, String... path) { super(entry, path); this.defaultValue=def;} + public Str(String def, String entry, ResourceLocation path) { super(entry, path); this.defaultValue=def;} + } + + ConfigToken(String entry, String... path) { super(entry, path); } + ConfigToken(String entry, ResourceLocation path) { super(entry, path); } + } + + public NamedPathConfig(String modID, String group, boolean autoSync, boolean diffContent) { + super(modID, group, autoSync, diffContent); + onInit(); + } + + public NamedPathConfig(String modID, String group, boolean autoSync) { + super(modID, group, autoSync); + onInit(); + } + + public NamedPathConfig(String modID, String group) { + super(modID, group); + onInit(); + } + + List getAllOptions(){ + List res = new LinkedList<>(); + for (Field fl : this.getClass().getDeclaredFields()){ + int modifiers = fl.getModifiers(); + if (Modifier.isPublic(modifiers) && Modifier.isStatic(modifiers) && ConfigToken.class.isAssignableFrom(fl.getType())) { + try { + res.add((ConfigToken) fl.get(null)); + } + catch (IllegalAccessException e) { + BCLib.LOGGER.error("Could not access " + fl); + } + } + } + return res; + } + + protected void onInit(){ + getAllOptions().forEach(e -> get(e)); + this.saveChanges(); + } + + private void set(ConfigToken what, Object value) { + BCLib.LOGGER.error("Accessing " + what + " as general type is not supported."); + } + + private Object get(ConfigToken what){ + BCLib.LOGGER.error("Accessing " + what + " as general type is not supported."); + return null; + } + + public void set(ConfigToken.Int what, int value) { + this.setInt(what, value); + } + + public int get(ConfigToken.Int what){ + return this.getInt(what, what.defaultValue); + } + + public void set(ConfigToken.Bool what, boolean value) { + this.setBoolean(what, value); + } + + public boolean get(ConfigToken.Bool what){ + return this.getBoolean(what, what.defaultValue); + } + + public void set(ConfigToken.Str what, String value) { + this.setString(what, value); + } + + public String get(ConfigToken.Str what){ + return this.getString(what, what.defaultValue); + } + + public void set(ConfigToken.Float what, float value) { + this.setFloat(what, value); + } + + public float get(ConfigToken.Float what){ + return this.getFloat(what, what.defaultValue); + } } diff --git a/src/main/java/ru/bclib/config/PathConfig.java b/src/main/java/ru/bclib/config/PathConfig.java index 8bd6c364..062e60ec 100644 --- a/src/main/java/ru/bclib/config/PathConfig.java +++ b/src/main/java/ru/bclib/config/PathConfig.java @@ -22,11 +22,11 @@ public class PathConfig extends Config { @Override protected void registerEntries() {} - protected ConfigKey createKey(String category, String key) { + protected static ConfigKey createKey(String category, String key) { return new ConfigKey(key, category.split("\\.")); } - protected ConfigKey createKey(String key) { + protected static ConfigKey createKey(String key) { return createKey("", key); }