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 92abed37..0b1ee2ca 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 @@ -1,11 +1,14 @@ package ru.bclib.api.dataexchange.handler.autosync; import net.minecraft.network.FriendlyByteBuf; +import ru.bclib.BCLib; 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.util.Pair; +import ru.bclib.util.PathUtil; +import ru.bclib.util.PathUtil.ModInfo; import ru.bclib.util.Triple; import java.io.File; @@ -50,6 +53,38 @@ class AutoFileSyncEntry extends AutoSyncID { } } + static class ForModFileRequest extends AutoFileSyncEntry { + public static Path getLocalPathForID(String modID){ + ModInfo mi = PathUtil.getModInfo(modID); + if (mi!=null){ + return mi.jarPath; + } + return null; + } + + ForModFileRequest(String modID) { + super(modID, AutoSyncID.ForModFileRequest.UNIQUE_ID, getLocalPathForID(modID).toFile(), false, (a, b, c) -> false); + if (this.fileName == null){ + BCLib.LOGGER.error("Unknown mod '"+modID+"'."); + } + } + + @Override + public int serializeContent(FriendlyByteBuf buf) { + final int res = super.serializeContent(buf); + return res; + } + + static AutoFileSyncEntry.ForModFileRequest finishDeserializeContent(String modID, FriendlyByteBuf buf) { + return new AutoFileSyncEntry.ForModFileRequest(modID); + } + + @Override + public String toString() { + return modID; + } + } + public final NeedTransferPredicate needTransfer; public final File fileName; public final boolean requestContent; @@ -101,6 +136,9 @@ class AutoFileSyncEntry extends AutoSyncID { if (AutoSyncID.ForDirectFileRequest.MOD_ID.equals(modID)) { entry = AutoFileSyncEntry.ForDirectFileRequest.finishDeserializeContent(uniqueID, buf); } + else if (AutoSyncID.ForModFileRequest.UNIQUE_ID.equals(uniqueID)) { + entry = AutoFileSyncEntry.ForModFileRequest.finishDeserializeContent(uniqueID, buf); + } else { entry = AutoFileSyncEntry.findMatching(modID, 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 ea4891ed..d2a3c180 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 @@ -39,6 +39,24 @@ public class AutoSyncID { return new ForDirectFileRequest(uniqueID, fl); } } + + static class ForModFileRequest extends AutoSyncID { + public final static String UNIQUE_ID = "bclib::MOD"; + + ForModFileRequest(String modID) { + super(modID, ForModFileRequest.UNIQUE_ID); + } + + @Override + void serializeData(FriendlyByteBuf buf) { + super.serializeData(buf); + } + + static ForModFileRequest finishDeserialize(String modID, String uniqueID, FriendlyByteBuf buf){ + return new ForModFileRequest(modID); + } + } + /** * A Unique ID for the referenced File. *

@@ -91,7 +109,9 @@ public class AutoSyncID { if (ForDirectFileRequest.MOD_ID.equals(modID)){ return ForDirectFileRequest.finishDeserialize(modID, uID, buf); - } else { + } else if (ForModFileRequest.UNIQUE_ID.equals(uID)){ + return ForModFileRequest.finishDeserialize(modID, uID, buf); + } else{ return new AutoSyncID(modID, uID); } } 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 5f458795..f1d0ec39 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 @@ -260,6 +260,14 @@ public class HelloClient extends DataHandler.FromServer { } } + @Environment(EnvType.CLIENT) + private void processModFileSync(final List filesToRequest) { + for (Entry e : modVersion.entrySet()) { + String ver = PathUtil.getModVersion(e.getKey()); + BCLib.LOGGER.info(" - " + e.getKey() + " (client=" + ver + ", server=" + ver + ")"); + } + } + @Environment(EnvType.CLIENT) @Override @@ -279,11 +287,9 @@ public class HelloClient extends DataHandler.FromServer { final List filesToRequest = new ArrayList<>(2); final List filesToRemove = new ArrayList<>(2); - for (Entry e : modVersion.entrySet()) { - String ver = PathUtil.getModVersion(e.getKey()); - BCLib.LOGGER.info(" - " + e.getKey() + " (client=" + ver + ", server=" + ver + ")"); - } + + processModFileSync(filesToRequest); processSingleFileSync(filesToRequest); processAutoSyncFolder(filesToRequest, filesToRemove); diff --git a/src/main/java/ru/bclib/util/PathUtil.java b/src/main/java/ru/bclib/util/PathUtil.java index 0653d3a6..eb6f7aac 100644 --- a/src/main/java/ru/bclib/util/PathUtil.java +++ b/src/main/java/ru/bclib/util/PathUtil.java @@ -84,7 +84,22 @@ public class PathUtil { } } - private static Map mods; + public static class ModInfo { + public final ModMetadata metadata; + public final Path jarPath; + + ModInfo(ModMetadata metadata, Path jarPath) { + this.metadata = metadata; + this.jarPath = jarPath; + } + + @Override + public String toString() { + return "ModInfo{" + "id=" + metadata.getId()+ "version=" + metadata.getVersion() + "jarPath=" + jarPath + '}'; + } + } + + private static Map mods; /** * Unloads the cache of available mods created from {@link #getMods()} @@ -100,9 +115,9 @@ public class PathUtil { * calling {@link #invalidateCachedMods()} *

* An error message is printed if a mod fails to load, but the parsing will continue. - * @return A map of all found mods. (key=ModID, value={@link ModMetadata}) + * @return A map of all found mods. (key=ModID, value={@link ModInfo}) */ - public static Map getMods() { + public static Map getMods() { if (mods!=null) return mods; mods = new HashMap<>(); @@ -116,7 +131,7 @@ public class PathUtil { Path modMetaFile = fs.getPath("fabric.mod.json"); ModMetadata mc = ModMetadataParser.parseMetadata(logger, modMetaFile); - mods.put(mc.getId(), mc); + mods.put(mc.getId(), new ModInfo(mc, file)); } catch (ParseMetadataException e) { BCLib.LOGGER.error(e.getMessage()); @@ -130,6 +145,26 @@ public class PathUtil { return mods; } + /** + * Returns the {@link ModInfo} or {@code null} if the mod was not found. + *

+ * The call will also return null if the mode-Version in the jar-File is not the same + * as the version of the loaded Mod. + * @param modID The mod ID to query + * @return A {@link ModInfo}-Object for the querried Mod. + */ + public static ModInfo getModInfo(String modID){ + getMods(); + final ModInfo mi = mods.get(modID); + if (!getModVersion(modID).equals(mi.metadata.getVersion())) return null; + return mi; + } + + /** + * Local Mod Version for the queried Mod + * @param modID The mod ID to query + * @return The version of the locally installed Mod + */ public static String getModVersion(String modID) { Optional optional = FabricLoader.getInstance() .getModContainer(modID); @@ -141,10 +176,4 @@ public class PathUtil { } return "0.0.0"; } - - public static ModContainer getModContainer(String modID) { - Optional optional = FabricLoader.getInstance() - .getModContainer(modID); - return optional.orElse(null); - } }