Prepare to sync Mods
This commit is contained in:
parent
55f00c664c
commit
e9fc77ab0d
4 changed files with 108 additions and 15 deletions
|
@ -1,11 +1,14 @@
|
||||||
package ru.bclib.api.dataexchange.handler.autosync;
|
package ru.bclib.api.dataexchange.handler.autosync;
|
||||||
|
|
||||||
import net.minecraft.network.FriendlyByteBuf;
|
import net.minecraft.network.FriendlyByteBuf;
|
||||||
|
import ru.bclib.BCLib;
|
||||||
import ru.bclib.api.dataexchange.DataHandler;
|
import ru.bclib.api.dataexchange.DataHandler;
|
||||||
import ru.bclib.api.dataexchange.SyncFileHash;
|
import ru.bclib.api.dataexchange.SyncFileHash;
|
||||||
import ru.bclib.api.dataexchange.handler.autosync.AutoSync.NeedTransferPredicate;
|
import ru.bclib.api.dataexchange.handler.autosync.AutoSync.NeedTransferPredicate;
|
||||||
import ru.bclib.api.dataexchange.handler.autosync.SyncFolderDescriptor.SubFile;
|
import ru.bclib.api.dataexchange.handler.autosync.SyncFolderDescriptor.SubFile;
|
||||||
import ru.bclib.util.Pair;
|
import ru.bclib.util.Pair;
|
||||||
|
import ru.bclib.util.PathUtil;
|
||||||
|
import ru.bclib.util.PathUtil.ModInfo;
|
||||||
import ru.bclib.util.Triple;
|
import ru.bclib.util.Triple;
|
||||||
|
|
||||||
import java.io.File;
|
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 NeedTransferPredicate needTransfer;
|
||||||
public final File fileName;
|
public final File fileName;
|
||||||
public final boolean requestContent;
|
public final boolean requestContent;
|
||||||
|
@ -101,6 +136,9 @@ class AutoFileSyncEntry extends AutoSyncID {
|
||||||
if (AutoSyncID.ForDirectFileRequest.MOD_ID.equals(modID)) {
|
if (AutoSyncID.ForDirectFileRequest.MOD_ID.equals(modID)) {
|
||||||
entry = AutoFileSyncEntry.ForDirectFileRequest.finishDeserializeContent(uniqueID, buf);
|
entry = AutoFileSyncEntry.ForDirectFileRequest.finishDeserializeContent(uniqueID, buf);
|
||||||
}
|
}
|
||||||
|
else if (AutoSyncID.ForModFileRequest.UNIQUE_ID.equals(uniqueID)) {
|
||||||
|
entry = AutoFileSyncEntry.ForModFileRequest.finishDeserializeContent(uniqueID, buf);
|
||||||
|
}
|
||||||
else {
|
else {
|
||||||
entry = AutoFileSyncEntry.findMatching(modID, uniqueID);
|
entry = AutoFileSyncEntry.findMatching(modID, uniqueID);
|
||||||
}
|
}
|
||||||
|
|
|
@ -39,6 +39,24 @@ public class AutoSyncID {
|
||||||
return new ForDirectFileRequest(uniqueID, fl);
|
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.
|
* A Unique ID for the referenced File.
|
||||||
* <p>
|
* <p>
|
||||||
|
@ -91,7 +109,9 @@ public class AutoSyncID {
|
||||||
|
|
||||||
if (ForDirectFileRequest.MOD_ID.equals(modID)){
|
if (ForDirectFileRequest.MOD_ID.equals(modID)){
|
||||||
return ForDirectFileRequest.finishDeserialize(modID, uID, buf);
|
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);
|
return new AutoSyncID(modID, uID);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -260,6 +260,14 @@ public class HelloClient extends DataHandler.FromServer {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Environment(EnvType.CLIENT)
|
||||||
|
private void processModFileSync(final List<AutoSyncID> filesToRequest) {
|
||||||
|
for (Entry<String, String> e : modVersion.entrySet()) {
|
||||||
|
String ver = PathUtil.getModVersion(e.getKey());
|
||||||
|
BCLib.LOGGER.info(" - " + e.getKey() + " (client=" + ver + ", server=" + ver + ")");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@Environment(EnvType.CLIENT)
|
@Environment(EnvType.CLIENT)
|
||||||
@Override
|
@Override
|
||||||
|
@ -279,11 +287,9 @@ public class HelloClient extends DataHandler.FromServer {
|
||||||
final List<AutoSyncID> filesToRequest = new ArrayList<>(2);
|
final List<AutoSyncID> filesToRequest = new ArrayList<>(2);
|
||||||
final List<AutoSyncID.ForDirectFileRequest> filesToRemove = new ArrayList<>(2);
|
final List<AutoSyncID.ForDirectFileRequest> filesToRemove = new ArrayList<>(2);
|
||||||
|
|
||||||
for (Entry<String, String> e : modVersion.entrySet()) {
|
|
||||||
String ver = PathUtil.getModVersion(e.getKey());
|
|
||||||
BCLib.LOGGER.info(" - " + e.getKey() + " (client=" + ver + ", server=" + ver + ")");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
processModFileSync(filesToRequest);
|
||||||
processSingleFileSync(filesToRequest);
|
processSingleFileSync(filesToRequest);
|
||||||
processAutoSyncFolder(filesToRequest, filesToRemove);
|
processAutoSyncFolder(filesToRequest, filesToRemove);
|
||||||
|
|
||||||
|
|
|
@ -84,7 +84,22 @@ public class PathUtil {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Map<String, ModMetadata> 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<String, ModInfo> mods;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Unloads the cache of available mods created from {@link #getMods()}
|
* Unloads the cache of available mods created from {@link #getMods()}
|
||||||
|
@ -100,9 +115,9 @@ public class PathUtil {
|
||||||
* calling {@link #invalidateCachedMods()}
|
* calling {@link #invalidateCachedMods()}
|
||||||
* <p>
|
* <p>
|
||||||
* An error message is printed if a mod fails to load, but the parsing will continue.
|
* 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<String, ModMetadata> getMods() {
|
public static Map<String, ModInfo> getMods() {
|
||||||
if (mods!=null) return mods;
|
if (mods!=null) return mods;
|
||||||
|
|
||||||
mods = new HashMap<>();
|
mods = new HashMap<>();
|
||||||
|
@ -116,7 +131,7 @@ public class PathUtil {
|
||||||
Path modMetaFile = fs.getPath("fabric.mod.json");
|
Path modMetaFile = fs.getPath("fabric.mod.json");
|
||||||
|
|
||||||
ModMetadata mc = ModMetadataParser.parseMetadata(logger, modMetaFile);
|
ModMetadata mc = ModMetadataParser.parseMetadata(logger, modMetaFile);
|
||||||
mods.put(mc.getId(), mc);
|
mods.put(mc.getId(), new ModInfo(mc, file));
|
||||||
}
|
}
|
||||||
catch (ParseMetadataException e) {
|
catch (ParseMetadataException e) {
|
||||||
BCLib.LOGGER.error(e.getMessage());
|
BCLib.LOGGER.error(e.getMessage());
|
||||||
|
@ -130,6 +145,26 @@ public class PathUtil {
|
||||||
return mods;
|
return mods;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the {@link ModInfo} or {@code null} if the mod was not found.
|
||||||
|
* <p>
|
||||||
|
* 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) {
|
public static String getModVersion(String modID) {
|
||||||
Optional<ModContainer> optional = FabricLoader.getInstance()
|
Optional<ModContainer> optional = FabricLoader.getInstance()
|
||||||
.getModContainer(modID);
|
.getModContainer(modID);
|
||||||
|
@ -141,10 +176,4 @@ public class PathUtil {
|
||||||
}
|
}
|
||||||
return "0.0.0";
|
return "0.0.0";
|
||||||
}
|
}
|
||||||
|
|
||||||
public static ModContainer getModContainer(String modID) {
|
|
||||||
Optional<ModContainer> optional = FabricLoader.getInstance()
|
|
||||||
.getModContainer(modID);
|
|
||||||
return optional.orElse(null);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue