Make auto-sync options consistent with UI

This commit is contained in:
Frank 2021-08-20 13:24:47 +02:00
parent 6e2a539232
commit d88462e827
6 changed files with 60 additions and 43 deletions

View file

@ -16,7 +16,7 @@ import java.util.List;
import java.util.function.BiConsumer; import java.util.function.BiConsumer;
public class AutoSync { 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() public final static SyncFolderDescriptor SYNC_FOLDER = new SyncFolderDescriptor("BCLIB-SYNC", FabricLoader.getInstance()
.getGameDir() .getGameDir()
.resolve("bclib-sync") .resolve("bclib-sync")
@ -31,37 +31,41 @@ public class AutoSync {
@Environment(EnvType.CLIENT) @Environment(EnvType.CLIENT)
static class ClientConfig { static class ClientConfig {
public static boolean shouldPrintDebugHashes() { 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() { 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() { public static boolean isAcceptingFiles() {
return Configs.CLIENT_CONFIG.getBoolean(MAIN_SYNC_CATEGORY, "acceptFiles", true) && isAllowingAutoSync(); return Configs.CLIENT_CONFIG.getBoolean(SYNC_CATEGORY, "acceptFolders", true) && isAllowingAutoSync();
}
public static boolean isAcceptingFolders() {
return Configs.CLIENT_CONFIG.getBoolean(MAIN_SYNC_CATEGORY, "acceptFolders", true) && isAllowingAutoSync();
} }
} }
static class Config { static class Config {
public static boolean isAllowingAutoSync() { 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() { public static boolean isOfferingFiles() {
return Configs.MAIN_CONFIG.getBoolean(MAIN_SYNC_CATEGORY, "offerFiles", true) && isAllowingAutoSync(); return Configs.SERVER_CONFIG.getBoolean(SYNC_CATEGORY, "offerFolders", true) && isAllowingAutoSync();
}
public static boolean isOfferingFolders() {
return Configs.MAIN_CONFIG.getBoolean(MAIN_SYNC_CATEGORY, "offerFolders", true) && isAllowingAutoSync();
} }
public static boolean isOfferingMods() { 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 //we call this from HelloServer to prepare transfer
protected static void loadSyncFolder() { 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()); syncFolderDescriptions.forEach(desc -> desc.loadCache());
} }
} }

View file

@ -97,27 +97,28 @@ public class HelloClient extends DataHandler.FromServer {
buf.writeInt(0); buf.writeInt(0);
} }
if (Config.isOfferingFiles()) { if (Config.isOfferingFiles() || Config.isOfferingConfigs()) {
//do only include files that exist on the server //do only include files that exist on the server
final List<AutoFileSyncEntry> existingAutoSyncFiles = AutoSync final List<AutoFileSyncEntry> existingAutoSyncFiles = AutoSync
.getAutoSyncFiles() .getAutoSyncFiles()
.stream() .stream()
.filter(e -> e.fileName.exists()) .filter(e -> e.fileName.exists())
.collect(Collectors.toList()); .filter(e -> (e.isConfigFile() && Config.isOfferingConfigs()) || (e instanceof AutoFileSyncEntry.ForDirectFileRequest && Config.isOfferingFiles()))
.collect(Collectors.toList());
//send config Data //send config Data
buf.writeInt(existingAutoSyncFiles.size()); buf.writeInt(existingAutoSyncFiles.size());
for (AutoFileSyncEntry entry : existingAutoSyncFiles) { for (AutoFileSyncEntry entry : existingAutoSyncFiles) {
entry.serialize(buf); entry.serialize(buf);
BCLib.LOGGER.info(" - Offering File " + entry); BCLib.LOGGER.info(" - Offering " + (entry.isConfigFile()?"Config ":"File ") + entry);
} }
} }
else { else {
BCLib.LOGGER.info("Server will not offer Files."); BCLib.LOGGER.info("Server will neither offer Files nor Configs.");
buf.writeInt(0); buf.writeInt(0);
} }
if (Config.isOfferingFolders()) { if (Config.isOfferingFiles()) {
buf.writeInt(AutoSync.syncFolderDescriptions.size()); buf.writeInt(AutoSync.syncFolderDescriptions.size());
AutoSync.syncFolderDescriptions.forEach(desc -> { AutoSync.syncFolderDescriptions.forEach(desc -> {
BCLib.LOGGER.info(" - Offering Folder " + desc.localFolder + " (allowDelete=" + desc.removeAdditionalFiles + ")"); BCLib.LOGGER.info(" - Offering Folder " + desc.localFolder + " (allowDelete=" + desc.removeAdditionalFiles + ")");
@ -183,7 +184,7 @@ public class HelloClient extends DataHandler.FromServer {
@Environment(EnvType.CLIENT) @Environment(EnvType.CLIENT)
private void processAutoSyncFolder(final List<AutoSyncID> filesToRequest, final List<AutoSyncID.ForDirectFileRequest> filesToRemove) { private void processAutoSyncFolder(final List<AutoSyncID> filesToRequest, final List<AutoSyncID.ForDirectFileRequest> filesToRemove) {
if (!ClientConfig.isAcceptingFolders()) { if (!ClientConfig.isAcceptingFiles()) {
return; 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 //Both client and server need to know about the folder you want to sync
//Files can only get placed within that folder //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); showSyncFilesScreen(client, filesToRequest, filesToRemove);
return; return;
} }

View file

@ -4,7 +4,6 @@ import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment; import net.fabricmc.api.Environment;
import net.fabricmc.fabric.api.networking.v1.PacketSender; import net.fabricmc.fabric.api.networking.v1.PacketSender;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.screens.Screen;
import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import ru.bclib.BCLib; 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); public static DataHandlerDescriptor DESCRIPTOR = new DataHandlerDescriptor(new ResourceLocation(BCLib.MOD_ID, "send_files"), SendFiles::new, false, false);
protected List<AutoFileSyncEntry> files; protected List<AutoFileSyncEntry> files;
private String token = ""; private String token;
public SendFiles() { public SendFiles() {
this(null, ""); this(null, "");
@ -85,7 +84,7 @@ public class SendFiles extends DataHandler.FromServer {
@Environment(EnvType.CLIENT) @Environment(EnvType.CLIENT)
@Override @Override
protected void deserializeIncomingDataOnClient(FriendlyByteBuf buf, PacketSender responseSender) { protected void deserializeIncomingDataOnClient(FriendlyByteBuf buf, PacketSender responseSender) {
if (ClientConfig.isAcceptingFiles()) { if (ClientConfig.isAcceptingConfigs() || ClientConfig.isAcceptingFiles() || ClientConfig.isAcceptingMods()) {
token = readString(buf); token = readString(buf);
if (!token.equals(RequestFiles.currentToken)) { if (!token.equals(RequestFiles.currentToken)) {
RequestFiles.newToken(); RequestFiles.newToken();
@ -101,8 +100,20 @@ public class SendFiles extends DataHandler.FromServer {
for (int i = 0; i < size; i++) { for (int i = 0; i < size; i++) {
Triple<AutoFileSyncEntry, byte[], AutoSyncID> p = AutoFileSyncEntry.deserializeContent(buf); Triple<AutoFileSyncEntry, byte[], AutoSyncID> p = AutoFileSyncEntry.deserializeContent(buf);
if (p.first != null) { if (p.first != null) {
receivedFiles.add(p); final String type;
BCLib.LOGGER.info(" - " + p.first + " (" + PathUtil.humanReadableFileSize(p.second.length) + ")"); 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 { else {
BCLib.LOGGER.error(" - Failed to receive File " + p.third + ", possibly sent from a Mod that is not installed on the client."); 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) @Environment(EnvType.CLIENT)
@Override @Override
protected void runOnClientGameThread(Minecraft client) { protected void runOnClientGameThread(Minecraft client) {
if (ClientConfig.isAcceptingFiles()) { if (ClientConfig.isAcceptingConfigs() || ClientConfig.isAcceptingFiles() || ClientConfig.isAcceptingMods()) {
BCLib.LOGGER.info("Writing Files:"); BCLib.LOGGER.info("Writing Files:");
//TODO: Reject files that were not in the last RequestFiles. //TODO: Reject files that were not in the last RequestFiles.
@ -131,15 +142,14 @@ public class SendFiles extends DataHandler.FromServer {
@Environment(EnvType.CLIENT) @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()){ if (!PathUtil.MOD_BAK_FOLDER.toFile().exists()){
PathUtil.MOD_BAK_FOLDER.toFile().mkdirs(); PathUtil.MOD_BAK_FOLDER.toFile().mkdirs();
} }
Path path = fileName!=null?fileName.toPath():null; Path path = fileName!=null?fileName.toPath():null;
Path removeAfter = null; Path removeAfter = null;
if (e instanceof AutoFileSyncEntry.ForModFileRequest){ if (e instanceof AutoFileSyncEntry.ForModFileRequest mase){
AutoFileSyncEntry.ForModFileRequest mase = (AutoFileSyncEntry.ForModFileRequest)e;
removeAfter = path; removeAfter = path;
int count = 0; int count = 0;
String name = "bclib_synced_" + mase.modID + "_" + mase.version.replace(".", "_") + ".jar"; 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) { protected void showConfirmRestart(Minecraft client) {
client.setScreen(new ConfirmRestartScreen(() -> { client.setScreen(new ConfirmRestartScreen(() -> {
Minecraft.getInstance() Minecraft.getInstance()
.setScreen((Screen) null); .setScreen(null);
client.stop(); client.stop();
})); }));

View file

@ -117,7 +117,7 @@ public class SyncFolderDescriptor {
} }
public void serialize(FriendlyByteBuf buf) { 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(); loadCache();
DataHandler.writeString(buf, folderID); DataHandler.writeString(buf, folderID);

View file

@ -6,20 +6,17 @@ import ru.bclib.BCLib;
public class Configs { public class Configs {
public static final PathConfig GENERATOR_CONFIG = new PathConfig(BCLib.MOD_ID, "generator"); 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 String MAIN_PATCH_CATEGORY = "patches";
public static final PathConfig RECIPE_CONFIG = new PathConfig(BCLib.MOD_ID, "recipes"); public static final PathConfig RECIPE_CONFIG = new PathConfig(BCLib.MOD_ID, "recipes");
@Environment(EnvType.CLIENT) @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() { public static void save() {
MAIN_CONFIG.saveChanges(); MAIN_CONFIG.saveChanges();
RECIPE_CONFIG.saveChanges(); RECIPE_CONFIG.saveChanges();
if (BCLib.isClient()) {
CLIENT_CONFIG.saveChanges();
}
} }
} }

View file

@ -0,0 +1,2 @@
package ru.bclib.config;public class NamedPathConfig {
}