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 c3f2695d..29ab0706 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 @@ -16,7 +16,7 @@ import java.util.List; import java.util.function.BiConsumer; public class AutoSync { - public static final String MAIN_SYNC_CATEGORY = "client_sync"; + public static final String SYNC_CATEGORY = "auto_sync"; public final static SyncFolderDescriptor SYNC_FOLDER = new SyncFolderDescriptor("BCLIB-SYNC", FabricLoader.getInstance() .getGameDir() .resolve("bclib-sync") @@ -31,37 +31,41 @@ public class AutoSync { @Environment(EnvType.CLIENT) static class ClientConfig { public static boolean shouldPrintDebugHashes() { - return Configs.CLIENT_CONFIG.getBoolean(MAIN_SYNC_CATEGORY, "debugHashes", true); + return Configs.CLIENT_CONFIG.getBoolean(SYNC_CATEGORY, "debugHashes", true); } public static boolean isAllowingAutoSync() { - return Configs.CLIENT_CONFIG.getBoolean(MAIN_SYNC_CATEGORY, "enabled", true); + return Configs.CLIENT_CONFIG.getBoolean(SYNC_CATEGORY, "enabled", true); + } + + public static boolean isAcceptingMods() { + return Configs.CLIENT_CONFIG.getBoolean(SYNC_CATEGORY, "acceptMods", true) && isAllowingAutoSync(); + } + + public static boolean isAcceptingConfigs() { + return Configs.CLIENT_CONFIG.getBoolean(SYNC_CATEGORY, "acceptConfigs", true) && isAllowingAutoSync(); } public static boolean isAcceptingFiles() { - return Configs.CLIENT_CONFIG.getBoolean(MAIN_SYNC_CATEGORY, "acceptFiles", true) && isAllowingAutoSync(); - } - - public static boolean isAcceptingFolders() { - return Configs.CLIENT_CONFIG.getBoolean(MAIN_SYNC_CATEGORY, "acceptFolders", true) && isAllowingAutoSync(); + return Configs.CLIENT_CONFIG.getBoolean(SYNC_CATEGORY, "acceptFolders", true) && isAllowingAutoSync(); } } static class Config { public static boolean isAllowingAutoSync() { - return Configs.MAIN_CONFIG.getBoolean(MAIN_SYNC_CATEGORY, "enabled", true); + return Configs.SERVER_CONFIG.getBoolean(SYNC_CATEGORY, "enabled", true); + } + + public static boolean isOfferingConfigs() { + return Configs.SERVER_CONFIG.getBoolean(SYNC_CATEGORY, "offerConfigs", true) && isAllowingAutoSync(); } public static boolean isOfferingFiles() { - return Configs.MAIN_CONFIG.getBoolean(MAIN_SYNC_CATEGORY, "offerFiles", true) && isAllowingAutoSync(); - } - - public static boolean isOfferingFolders() { - return Configs.MAIN_CONFIG.getBoolean(MAIN_SYNC_CATEGORY, "offerFolders", true) && isAllowingAutoSync(); + return Configs.SERVER_CONFIG.getBoolean(SYNC_CATEGORY, "offerFolders", true) && isAllowingAutoSync(); } public static boolean isOfferingMods() { - return Configs.MAIN_CONFIG.getBoolean(MAIN_SYNC_CATEGORY, "offerMods", true) && isAllowingAutoSync(); + return Configs.SERVER_CONFIG.getBoolean(SYNC_CATEGORY, "offerMods", true) && isAllowingAutoSync(); } } @@ -165,7 +169,7 @@ public class AutoSync { //we call this from HelloServer to prepare transfer protected static void loadSyncFolder() { - if (Configs.MAIN_CONFIG.getBoolean(AutoSync.MAIN_SYNC_CATEGORY, "offersSyncFolders", true)) { + if (Configs.MAIN_CONFIG.getBoolean(AutoSync.SYNC_CATEGORY, "offersSyncFolders", true)) { syncFolderDescriptions.forEach(desc -> desc.loadCache()); } } 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 97d5b81f..bcb0ce90 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 @@ -97,27 +97,28 @@ public class HelloClient extends DataHandler.FromServer { buf.writeInt(0); } - if (Config.isOfferingFiles()) { + if (Config.isOfferingFiles() || Config.isOfferingConfigs()) { //do only include files that exist on the server final List existingAutoSyncFiles = AutoSync - .getAutoSyncFiles() - .stream() - .filter(e -> e.fileName.exists()) - .collect(Collectors.toList()); + .getAutoSyncFiles() + .stream() + .filter(e -> e.fileName.exists()) + .filter(e -> (e.isConfigFile() && Config.isOfferingConfigs()) || (e instanceof AutoFileSyncEntry.ForDirectFileRequest && Config.isOfferingFiles())) + .collect(Collectors.toList()); //send config Data buf.writeInt(existingAutoSyncFiles.size()); for (AutoFileSyncEntry entry : existingAutoSyncFiles) { entry.serialize(buf); - BCLib.LOGGER.info(" - Offering File " + entry); + BCLib.LOGGER.info(" - Offering " + (entry.isConfigFile()?"Config ":"File ") + entry); } } else { - BCLib.LOGGER.info("Server will not offer Files."); + BCLib.LOGGER.info("Server will neither offer Files nor Configs."); buf.writeInt(0); } - if (Config.isOfferingFolders()) { + if (Config.isOfferingFiles()) { buf.writeInt(AutoSync.syncFolderDescriptions.size()); AutoSync.syncFolderDescriptions.forEach(desc -> { BCLib.LOGGER.info(" - Offering Folder " + desc.localFolder + " (allowDelete=" + desc.removeAdditionalFiles + ")"); @@ -183,7 +184,7 @@ public class HelloClient extends DataHandler.FromServer { @Environment(EnvType.CLIENT) private void processAutoSyncFolder(final List filesToRequest, final List filesToRemove) { - if (!ClientConfig.isAcceptingFolders()) { + if (!ClientConfig.isAcceptingFiles()) { return; } @@ -329,7 +330,10 @@ 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.isAcceptingFiles()) { + if ( + (filesToRequest.size() > 0 || filesToRemove.size() > 0) + && (ClientConfig.isAcceptingMods() || ClientConfig.isAcceptingConfigs() || ClientConfig.isAcceptingFiles()) + ) { showSyncFilesScreen(client, filesToRequest, filesToRemove); 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 8b5d08bf..f149253b 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 @@ -4,7 +4,6 @@ import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.networking.v1.PacketSender; import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.screens.Screen; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.resources.ResourceLocation; import ru.bclib.BCLib; @@ -29,7 +28,7 @@ public class SendFiles extends DataHandler.FromServer { public static DataHandlerDescriptor DESCRIPTOR = new DataHandlerDescriptor(new ResourceLocation(BCLib.MOD_ID, "send_files"), SendFiles::new, false, false); protected List files; - private String token = ""; + private String token; public SendFiles() { this(null, ""); @@ -85,7 +84,7 @@ public class SendFiles extends DataHandler.FromServer { @Environment(EnvType.CLIENT) @Override protected void deserializeIncomingDataOnClient(FriendlyByteBuf buf, PacketSender responseSender) { - if (ClientConfig.isAcceptingFiles()) { + if (ClientConfig.isAcceptingConfigs() || ClientConfig.isAcceptingFiles() || ClientConfig.isAcceptingMods()) { token = readString(buf); if (!token.equals(RequestFiles.currentToken)) { RequestFiles.newToken(); @@ -101,8 +100,20 @@ public class SendFiles extends DataHandler.FromServer { for (int i = 0; i < size; i++) { Triple p = AutoFileSyncEntry.deserializeContent(buf); if (p.first != null) { - receivedFiles.add(p); - BCLib.LOGGER.info(" - " + p.first + " (" + PathUtil.humanReadableFileSize(p.second.length) + ")"); + final String type; + if (p.first.isConfigFile() && ClientConfig.isAcceptingConfigs()) { + receivedFiles.add(p); + type = "Accepted Config "; + } else if (p.first instanceof AutoFileSyncEntry.ForModFileRequest && ClientConfig.isAcceptingMods()){ + receivedFiles.add(p); + type = "Accepted Mod "; + } else if (ClientConfig.isAcceptingFiles()){ + receivedFiles.add(p); + type = "Accepted File "; + } else { + type = "Ignoring "; + } + BCLib.LOGGER.info(" - " + type + p.first + " (" + PathUtil.humanReadableFileSize(p.second.length) + ")"); } else { BCLib.LOGGER.error(" - Failed to receive File " + p.third + ", possibly sent from a Mod that is not installed on the client."); @@ -114,7 +125,7 @@ public class SendFiles extends DataHandler.FromServer { @Environment(EnvType.CLIENT) @Override protected void runOnClientGameThread(Minecraft client) { - if (ClientConfig.isAcceptingFiles()) { + if (ClientConfig.isAcceptingConfigs() || ClientConfig.isAcceptingFiles() || ClientConfig.isAcceptingMods()) { BCLib.LOGGER.info("Writing Files:"); //TODO: Reject files that were not in the last RequestFiles. @@ -131,15 +142,14 @@ public class SendFiles extends DataHandler.FromServer { @Environment(EnvType.CLIENT) - public static void writeSyncedFile(AutoSyncID e, byte[] data, File fileName) { + static void writeSyncedFile(AutoSyncID e, byte[] data, File fileName) { if (!PathUtil.MOD_BAK_FOLDER.toFile().exists()){ PathUtil.MOD_BAK_FOLDER.toFile().mkdirs(); } Path path = fileName!=null?fileName.toPath():null; Path removeAfter = null; - if (e instanceof AutoFileSyncEntry.ForModFileRequest){ - AutoFileSyncEntry.ForModFileRequest mase = (AutoFileSyncEntry.ForModFileRequest)e; + if (e instanceof AutoFileSyncEntry.ForModFileRequest mase){ removeAfter = path; int count = 0; String name = "bclib_synced_" + mase.modID + "_" + mase.version.replace(".", "_") + ".jar"; @@ -193,7 +203,7 @@ public class SendFiles extends DataHandler.FromServer { protected void showConfirmRestart(Minecraft client) { client.setScreen(new ConfirmRestartScreen(() -> { Minecraft.getInstance() - .setScreen((Screen) null); + .setScreen(null); client.stop(); })); diff --git a/src/main/java/ru/bclib/api/dataexchange/handler/autosync/SyncFolderDescriptor.java b/src/main/java/ru/bclib/api/dataexchange/handler/autosync/SyncFolderDescriptor.java index 6076507e..bba41d5e 100644 --- a/src/main/java/ru/bclib/api/dataexchange/handler/autosync/SyncFolderDescriptor.java +++ b/src/main/java/ru/bclib/api/dataexchange/handler/autosync/SyncFolderDescriptor.java @@ -117,7 +117,7 @@ public class SyncFolderDescriptor { } public void serialize(FriendlyByteBuf buf) { - final boolean debugHashes = Configs.CLIENT_CONFIG.getBoolean(AutoSync.MAIN_SYNC_CATEGORY, "debugHashes", false); + final boolean debugHashes = Configs.CLIENT_CONFIG.getBoolean(AutoSync.SYNC_CATEGORY, "debugHashes", false); loadCache(); DataHandler.writeString(buf, folderID); diff --git a/src/main/java/ru/bclib/config/Configs.java b/src/main/java/ru/bclib/config/Configs.java index 2a638a9c..d6569498 100644 --- a/src/main/java/ru/bclib/config/Configs.java +++ b/src/main/java/ru/bclib/config/Configs.java @@ -6,20 +6,17 @@ import ru.bclib.BCLib; public class Configs { public static final PathConfig GENERATOR_CONFIG = new PathConfig(BCLib.MOD_ID, "generator"); - public static final PathConfig MAIN_CONFIG = new PathConfig(BCLib.MOD_ID, "main"); + public static final PathConfig MAIN_CONFIG = new PathConfig(BCLib.MOD_ID, "main", true, true); public static final String MAIN_PATCH_CATEGORY = "patches"; 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"); + 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 void save() { MAIN_CONFIG.saveChanges(); RECIPE_CONFIG.saveChanges(); - - if (BCLib.isClient()) { - CLIENT_CONFIG.saveChanges(); - } } } diff --git a/src/main/java/ru/bclib/config/NamedPathConfig.java b/src/main/java/ru/bclib/config/NamedPathConfig.java new file mode 100644 index 00000000..f30dcf3f --- /dev/null +++ b/src/main/java/ru/bclib/config/NamedPathConfig.java @@ -0,0 +1,2 @@ +package ru.bclib.config;public class NamedPathConfig { +}