From dfe25a959942d77d08682e36dc65f88196049272 Mon Sep 17 00:00:00 2001 From: Frank Date: Thu, 19 Aug 2021 20:12:01 +0200 Subject: [PATCH] Sync Screen offers user-options --- .../handler/autosync/AutoFileSyncEntry.java | 2 + .../handler/autosync/AutoSyncID.java | 5 + .../handler/autosync/HelloClient.java | 65 ++++++--- src/main/java/ru/bclib/config/Config.java | 8 +- .../ru/bclib/gui/screens/BCLibScreen.java | 2 +- .../ru/bclib/gui/screens/SyncFilesScreen.java | 133 +++++++++++------- .../resources/assets/bclib/lang/en_us.json | 5 +- 7 files changed, 144 insertions(+), 76 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 3540623d..4969bb2e 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,6 +6,7 @@ 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; @@ -108,6 +109,7 @@ class AutoFileSyncEntry extends AutoSyncID { this.requestContent = requestContent; } + public SyncFileHash getFileHash() { if (hash == null) { hash = SyncFileHash.create(modID, fileName, uniqueID); diff --git a/src/main/java/ru/bclib/api/dataexchange/handler/autosync/AutoSyncID.java b/src/main/java/ru/bclib/api/dataexchange/handler/autosync/AutoSyncID.java index 12579f2a..9ffbc64f 100644 --- a/src/main/java/ru/bclib/api/dataexchange/handler/autosync/AutoSyncID.java +++ b/src/main/java/ru/bclib/api/dataexchange/handler/autosync/AutoSyncID.java @@ -3,6 +3,7 @@ package ru.bclib.api.dataexchange.handler.autosync; import net.minecraft.network.FriendlyByteBuf; import org.jetbrains.annotations.NotNull; import ru.bclib.api.dataexchange.DataHandler; +import ru.bclib.config.Config; import ru.bclib.util.ModUtil; import java.io.File; @@ -134,4 +135,8 @@ public class AutoSyncID { return new AutoSyncID(modID, uID); } } + + public boolean isConfigFile(){ + return this.uniqueID.startsWith(Config.CONFIG_SYNC_PREFIX); + } } 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 51e115a5..97d5b81f 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 @@ -330,7 +330,7 @@ public class HelloClient extends DataHandler.FromServer { //Files can only get placed within that folder if ((filesToRequest.size() > 0 || filesToRemove.size() > 0) && ClientConfig.isAcceptingFiles()) { - showDownloadConfigs(client, filesToRequest, filesToRemove); + showSyncFilesScreen(client, filesToRequest, filesToRemove); return; } } @@ -350,40 +350,67 @@ public class HelloClient extends DataHandler.FromServer { } @Environment(EnvType.CLIENT) - protected void showDownloadConfigs(Minecraft client, List files, final List filesToRemove) { - client.setScreen(new SyncFilesScreen((download) -> { + protected void showSyncFilesScreen(Minecraft client, List files, final List filesToRemove) { + int configFiles = 0; + int singleFiles = 0; + int folderFiles = 0; + int modFiles = 0; + + for (AutoSyncID aid : files){ + if (aid.isConfigFile()){ + configFiles++; + } else if (aid instanceof AutoSyncID.ForModFileRequest){ + modFiles++; + } else if (aid instanceof AutoSyncID.ForDirectFileRequest){ + folderFiles++; + } else { + singleFiles++; + } + } + + client.setScreen(new SyncFilesScreen(modFiles, configFiles, singleFiles, folderFiles, filesToRemove.size(), (downloadMods, downloadConfigs, downloadFiles, removeFiles) -> { Minecraft.getInstance() .setScreen((Screen) null); - if (download) { + if (downloadMods || downloadConfigs || downloadFiles) { BCLib.LOGGER.info("Updating local Files:"); List localChanges = new ArrayList<>(files.toArray().length); List requestFiles = new ArrayList<>(files.toArray().length); files.forEach(aid -> { - if (aid instanceof WithContentOverride) { - final WithContentOverride aidc = (WithContentOverride) aid; - BCLib.LOGGER.info(" - " + aid + " (updating Content)"); - - SendFiles.writeSyncedFile(aid, aidc.contentWrapper.getRawContent(), aidc.localFile); + if (aid.isConfigFile() && downloadConfigs){ + processOfferedFile(requestFiles, aid); + } else if (aid instanceof AutoSyncID.ForModFileRequest && downloadMods){ + processOfferedFile(requestFiles, aid); + } else if (downloadFiles){ + processOfferedFile(requestFiles, aid); } - else { - requestFiles.add(aid); - BCLib.LOGGER.info(" - " + aid + " (requesting)"); - } - }); - - filesToRemove.forEach(aid -> { - BCLib.LOGGER.info(" - " + aid.relFile + " (removing)"); - - aid.relFile.delete(); }); requestFileDownloads(requestFiles); } + if (removeFiles) { + filesToRemove.forEach(aid -> { + BCLib.LOGGER.info(" - " + aid.relFile + " (removing)"); + aid.relFile.delete(); + }); + } })); } + private void processOfferedFile(List requestFiles, AutoSyncID aid) { + if (aid instanceof WithContentOverride) { + final WithContentOverride aidc = (WithContentOverride) aid; + BCLib.LOGGER.info(" - " + aid + " (updating Content)"); + + SendFiles.writeSyncedFile(aid, aidc.contentWrapper.getRawContent(), aidc.localFile); + } + else { + requestFiles.add(aid); + BCLib.LOGGER.info(" - " + aid + " (requesting)"); + } + } + private void requestBCLibDownload(Consumer whenFinished) { BCLib.LOGGER.warning("Starting download of BCLib"); whenFinished.accept(true); diff --git a/src/main/java/ru/bclib/config/Config.java b/src/main/java/ru/bclib/config/Config.java index df17f5cd..2901021f 100644 --- a/src/main/java/ru/bclib/config/Config.java +++ b/src/main/java/ru/bclib/config/Config.java @@ -18,6 +18,7 @@ import java.util.HashMap; import java.util.Map; public abstract class Config { + public static final String CONFIG_SYNC_PREFIX = "CONFIG_"; protected final static Map autoSyncConfigs = new HashMap<>(); protected final ConfigKeeper keeper; protected final boolean autoSync; @@ -33,16 +34,12 @@ public abstract class Config { } protected Config(String modID, String group, boolean autoSync, boolean diffContent) { - if (autoSync) { - BCLib.LOGGER.info("Added Config " + modID + "." + group + " to auto sync (contentDiff = " + diffContent + ")"); - } - this.keeper = new ConfigKeeper(modID, group); this.registerEntries(); this.autoSync = autoSync; if (autoSync) { - final String uid = "CONFIG_" + modID + "_" + group; + final String uid = CONFIG_SYNC_PREFIX + modID + "_" + group; final AutoSyncID aid = new AutoSyncID(BCLib.MOD_ID, uid); if (diffContent) DataExchangeAPI.addAutoSyncFile(aid.modID, aid.uniqueID, keeper.getConfigFile(),this::compareForSync); @@ -50,6 +47,7 @@ public abstract class Config { DataExchangeAPI.addAutoSyncFile(aid.modID, aid.uniqueID, keeper.getConfigFile()); autoSyncConfigs.put(aid, this); + BCLib.LOGGER.info("Added Config " + modID + "." + group + " to auto sync (" + (diffContent?"content diff":"file hash") + ")"); } } diff --git a/src/main/java/ru/bclib/gui/screens/BCLibScreen.java b/src/main/java/ru/bclib/gui/screens/BCLibScreen.java index 15bdc120..95e51a91 100644 --- a/src/main/java/ru/bclib/gui/screens/BCLibScreen.java +++ b/src/main/java/ru/bclib/gui/screens/BCLibScreen.java @@ -28,7 +28,7 @@ abstract class BCLibScreen extends GridScreen { } protected void addTitle(){ - GridRow row = grid.addRow(VerticalAlignment.BOTTOM); + GridRow row = grid.addRow(VerticalAlignment.CENTER); row.addFiller(); row.addImage(BCLIB_LOGO_LOCATION, 24, GridValueType.CONSTANT, 24, 512, 512); row.addSpacer(4); diff --git a/src/main/java/ru/bclib/gui/screens/SyncFilesScreen.java b/src/main/java/ru/bclib/gui/screens/SyncFilesScreen.java index 1efbbd30..dd246ef7 100644 --- a/src/main/java/ru/bclib/gui/screens/SyncFilesScreen.java +++ b/src/main/java/ru/bclib/gui/screens/SyncFilesScreen.java @@ -11,53 +11,88 @@ import ru.bclib.gui.gridlayout.GridRow; @Environment(EnvType.CLIENT) public class SyncFilesScreen extends BCLibScreen { - private final Component description; - private final SyncFilesScreen.Listener listener; - public SyncFilesScreen(SyncFilesScreen.Listener listener) { - super(new TranslatableComponent("title.bclib.syncfiles")); - - this.description = new TranslatableComponent("message.bclib.syncfiles"); - this.listener = listener; - } - - protected void initLayout() { - final int BUTTON_HEIGHT = 20; - - grid.addRow().addMessage(this.description, this.font, Alignment.CENTER); - - grid.addSpacerRow(10); - - GridRow row = grid.addRow(); - GridCheckboxCell mods = row.addCheckbox(new TranslatableComponent("message.bclib.syncfiles.mods"), true, BUTTON_HEIGHT, this.font); - - grid.addSpacerRow(); - row = grid.addRow(); - GridCheckboxCell files = row.addCheckbox(new TranslatableComponent("message.bclib.syncfiles.files"), true, BUTTON_HEIGHT, this.font); - - grid.addSpacerRow(); - row = grid.addRow(); - GridCheckboxCell folder = row.addCheckbox(new TranslatableComponent("message.bclib.syncfiles.folder"), true, BUTTON_HEIGHT, this.font); - - grid.addSpacerRow(30); - - row = grid.addRow(); - row.addFiller(); - row.addButton(CommonComponents.GUI_NO, BUTTON_HEIGHT, this.font, (button) -> { - listener.proceed(false); - }); - row.addSpacer(); - row.addButton(CommonComponents.GUI_YES, BUTTON_HEIGHT, this.font, (button) -> { - listener.proceed(true); - }); - row.addFiller(); - } - - public boolean shouldCloseOnEsc() { - return false; - } - - @Environment(EnvType.CLIENT) - public interface Listener { - void proceed(boolean download); - } + private final Component description; + private final SyncFilesScreen.Listener listener; + private final boolean hasConfigFiles; + private final boolean hasFiles; + private final boolean hasMods; + private final boolean shouldDelete; + + public SyncFilesScreen(int modFiles, int configFiles, int singleFiles, int folderFiles, int deleteFiles, Listener listener) { + super(new TranslatableComponent("title.bclib.syncfiles")); + + this.description = new TranslatableComponent("message.bclib.syncfiles"); + this.listener = listener; + + this.hasConfigFiles = configFiles>0; + this.hasFiles = singleFiles+folderFiles>0; + this.hasMods = modFiles>0; + this.shouldDelete = deleteFiles>0; + } + + protected void initLayout() { + final int BUTTON_HEIGHT = 20; + + grid.addRow() + .addMessage(this.description, this.font, Alignment.CENTER); + + grid.addSpacerRow(10); + + GridRow row; + + + final GridCheckboxCell mods; + if (hasMods) { + row = grid.addRow(); + mods = row.addCheckbox(new TranslatableComponent("message.bclib.syncfiles.mods"), true, BUTTON_HEIGHT, this.font); + grid.addSpacerRow(); + } else mods=null; + + final GridCheckboxCell configs; + if (hasConfigFiles) { + row = grid.addRow(); + configs = row.addCheckbox(new TranslatableComponent("message.bclib.syncfiles.configs"), true, BUTTON_HEIGHT, this.font); + grid.addSpacerRow(); + } else configs = null; + + row = grid.addRow(); + + final GridCheckboxCell folder; + if (hasFiles) { + folder = row.addCheckbox(new TranslatableComponent("message.bclib.syncfiles.folders"), true, BUTTON_HEIGHT, this.font); + row.addSpacer(); + } else folder = null; + + GridCheckboxCell delete; + if (shouldDelete) { + delete = row.addCheckbox(new TranslatableComponent("message.bclib.syncfiles.delete"), true, BUTTON_HEIGHT, this.font); + } else delete = null; + + grid.addSpacerRow(30); + + row = grid.addRow(); + row.addFiller(); + row.addButton(CommonComponents.GUI_NO, BUTTON_HEIGHT, this.font, (button) -> { + listener.proceed(false, false, false, false); + }); + row.addSpacer(); + row.addButton(CommonComponents.GUI_YES, BUTTON_HEIGHT, this.font, (button) -> { + listener.proceed( + mods!=null && mods.isChecked(), + configs!=null && configs.isChecked(), + folder != null && folder.isChecked(), + delete !=null && delete.isChecked() + ); + }); + row.addFiller(); + } + + public boolean shouldCloseOnEsc() { + return false; + } + + @Environment(EnvType.CLIENT) + public interface Listener { + void proceed(boolean downloadMods, boolean downloadConfigs, boolean downloadFiles, boolean removeFiles); + } } diff --git a/src/main/resources/assets/bclib/lang/en_us.json b/src/main/resources/assets/bclib/lang/en_us.json index 5c65e789..0a734d75 100644 --- a/src/main/resources/assets/bclib/lang/en_us.json +++ b/src/main/resources/assets/bclib/lang/en_us.json @@ -10,8 +10,9 @@ "title.bclib.syncfiles": "Mismatching Data", "message.bclib.syncfiles": "Some Content on the Server does not match the versions on the client.\nDo you want to replace the selected content with the data from the server?", "message.bclib.syncfiles.mods": "Synchronize Mods", - "message.bclib.syncfiles.files": "Synchronize Configs", - "message.bclib.syncfiles.folder": "Synchronize Folders", + "message.bclib.syncfiles.configs": "Synchronize Configs", + "message.bclib.syncfiles.folders": "Synchronize Folders and Files", + "message.bclib.syncfiles.delete": "Delete unneeded", "title.bclib.confirmrestart": "Restart Required", "message.bclib.confirmrestart": "The requested files were processed. You need o restart Minecraft now." } \ No newline at end of file