From d951f235459dc4ec403ef4e465c495e9b0b406eb Mon Sep 17 00:00:00 2001 From: ManlyMarco <39247311+ManlyMarco@users.noreply.github.com> Date: Fri, 17 Nov 2023 21:24:33 +0100 Subject: [PATCH] [Sideloader] Trim all GUIDs (fixes regression from 18.2) This will fix failing to resolve mods with GUIDs that start or end with spaces --- .../Core.Sideloader.ListLoader.cs | 2 +- .../Core.Sideloader.Manifest.cs | 2 +- src/Core_Sideloader/Core.Sideloader.cs | 4 +- .../Core.UAR.MigrationInfo.cs | 8 ++-- .../Core.UAR.ResolveInfo.cs | 10 ++++- .../UniversalAutoResolver/Core.UAR.cs | 42 ++++++++++++++----- .../Core.UAR.Studio.StudioResolveInfo.cs | 9 +++- .../UniversalAutoResolver/Core.UAR.Studio.cs | 16 +++---- 8 files changed, 66 insertions(+), 27 deletions(-) diff --git a/src/Core_Sideloader/Core.Sideloader.ListLoader.cs b/src/Core_Sideloader/Core.Sideloader.ListLoader.cs index 113af389..93f420c9 100644 --- a/src/Core_Sideloader/Core.Sideloader.ListLoader.cs +++ b/src/Core_Sideloader/Core.Sideloader.ListLoader.cs @@ -181,7 +181,7 @@ internal static void LoadCheckItemList() var checkItemList = checkItemListXML.Element("checkitem"); foreach (var modElement in checkItemList.Elements("mod")) { - string guid = modElement.Attribute("guid")?.Value; + string guid = modElement.Attribute("guid")?.Value?.Trim(); if (!string.IsNullOrEmpty(guid)) { foreach (var categoryElement in modElement.Elements("category")) diff --git a/src/Core_Sideloader/Core.Sideloader.Manifest.cs b/src/Core_Sideloader/Core.Sideloader.Manifest.cs index a41aa4fd..d1708130 100644 --- a/src/Core_Sideloader/Core.Sideloader.Manifest.cs +++ b/src/Core_Sideloader/Core.Sideloader.Manifest.cs @@ -125,7 +125,7 @@ public Manifest(int schemaVer, string guid, string name, string version, string ) { SchemaVer = schemaVer; - GUID = guid; + GUID = guid?.Trim(); Name = name; Version = version; Author = author; diff --git a/src/Core_Sideloader/Core.Sideloader.cs b/src/Core_Sideloader/Core.Sideloader.cs index ec73feb1..deb7cadb 100644 --- a/src/Core_Sideloader/Core.Sideloader.cs +++ b/src/Core_Sideloader/Core.Sideloader.cs @@ -486,7 +486,9 @@ public static bool IsPngFolderOnly(string assetBundleName) /// Manifest of the loaded mod or null if mod is not loaded. public static Manifest GetManifest(string guid) { - if (string.IsNullOrEmpty(guid)) return null; + if (guid == null) return null; + guid = guid.Trim(); + if (guid.Length == 0) return null; Manifests.TryGetValue(guid, out Manifest manifest); return manifest; diff --git a/src/Core_Sideloader/UniversalAutoResolver/Core.UAR.MigrationInfo.cs b/src/Core_Sideloader/UniversalAutoResolver/Core.UAR.MigrationInfo.cs index ce178e30..4680a608 100644 --- a/src/Core_Sideloader/UniversalAutoResolver/Core.UAR.MigrationInfo.cs +++ b/src/Core_Sideloader/UniversalAutoResolver/Core.UAR.MigrationInfo.cs @@ -47,8 +47,8 @@ public MigrationInfo(MigrationType migrationType, ChaListDefine.CategoryNo categ { MigrationType = migrationType; Category = category; - GUIDOld = guidOld; - GUIDNew = guidNew; + GUIDOld = guidOld?.Trim(); + GUIDNew = guidNew?.Trim(); IDOld = idOld; IDNew = idNew; } @@ -56,8 +56,8 @@ public MigrationInfo(MigrationType migrationType, ChaListDefine.CategoryNo categ public MigrationInfo(MigrationType migrationType, string guidOld, string guidNew) { MigrationType = migrationType; - GUIDOld = guidOld; - GUIDNew = guidNew; + GUIDOld = guidOld?.Trim(); + GUIDNew = guidNew?.Trim(); } } } diff --git a/src/Core_Sideloader/UniversalAutoResolver/Core.UAR.ResolveInfo.cs b/src/Core_Sideloader/UniversalAutoResolver/Core.UAR.ResolveInfo.cs index c2e10e1b..99c1c2f4 100644 --- a/src/Core_Sideloader/UniversalAutoResolver/Core.UAR.ResolveInfo.cs +++ b/src/Core_Sideloader/UniversalAutoResolver/Core.UAR.ResolveInfo.cs @@ -13,11 +13,19 @@ namespace Sideloader.AutoResolver [MessagePackObject] public class ResolveInfo { + [IgnoreMember] + private string _guid; + /// /// GUID of the mod as defined in the manifest.xml /// [Key("ModID")] - public string GUID { get; set; } + public string GUID + { + get => _guid; + set => _guid = value?.Trim(); + } + /// /// ID of the item as defined in the mod's list files /// diff --git a/src/Core_Sideloader/UniversalAutoResolver/Core.UAR.cs b/src/Core_Sideloader/UniversalAutoResolver/Core.UAR.cs index 44704da7..bf457327 100644 --- a/src/Core_Sideloader/UniversalAutoResolver/Core.UAR.cs +++ b/src/Core_Sideloader/UniversalAutoResolver/Core.UAR.cs @@ -98,8 +98,12 @@ public static ResolveInfo TryGetResolutionInfo(int slot, string property, ChaLis /// Category number of the item /// /// ResolveInfo - public static ResolveInfo TryGetResolutionInfo(int slot, ChaListDefine.CategoryNo categoryNo, string guid) => - _resolveInfoLookupSlot?[slot].FirstOrDefault(x => x.CategoryNo == categoryNo && x.GUID == guid); + public static ResolveInfo TryGetResolutionInfo(int slot, ChaListDefine.CategoryNo categoryNo, string guid) + { + guid = guid?.Trim(); + return _resolveInfoLookupSlot?[slot].FirstOrDefault(x => x.CategoryNo == categoryNo && x.GUID == guid); + } + /// /// Get the ResolveInfo for an item /// @@ -107,8 +111,12 @@ public static ResolveInfo TryGetResolutionInfo(int slot, ChaListDefine.CategoryN /// /// /// ResolveInfo - public static ResolveInfo TryGetResolutionInfo(int slot, string property, string guid) => - _resolveInfoLookupSlot?[slot].FirstOrDefault(x => x.Property == property && x.GUID == guid); + public static ResolveInfo TryGetResolutionInfo(int slot, string property, string guid) + { + guid = guid?.Trim(); + return _resolveInfoLookupSlot?[slot].FirstOrDefault(x => x.Property == property && x.GUID == guid); + } + /// /// Get the ResolveInfo for an item /// @@ -117,14 +125,18 @@ public static ResolveInfo TryGetResolutionInfo(int slot, string property, string /// /// /// ResolveInfo - public static ResolveInfo TryGetResolutionInfo(int slot, string property, ChaListDefine.CategoryNo categoryNo, string guid) => - _resolveInfoLookupSlot?[slot].FirstOrDefault(x => x.Property == property && x.CategoryNo == categoryNo && x.GUID == guid); + public static ResolveInfo TryGetResolutionInfo(int slot, string property, ChaListDefine.CategoryNo categoryNo, string guid) + { + guid = guid?.Trim(); + return _resolveInfoLookupSlot?[slot].FirstOrDefault(x => x.Property == property && x.CategoryNo == categoryNo && x.GUID == guid); + } + /// /// Get all MigrationInfo for the GUID /// /// GUID that will be migrated /// A list of MigrationInfo - public static List GetMigrationInfo(string guidOld) => _migrationInfoLookupGUID?[guidOld].ToList(); + public static List GetMigrationInfo(string guidOld) => _migrationInfoLookupGUID?[guidOld?.Trim()].ToList(); /// /// Get all MigrationInfo for the ID /// @@ -133,12 +145,20 @@ public static ResolveInfo TryGetResolutionInfo(int slot, string property, ChaLis public static List GetMigrationInfo(int idOld) => _migrationInfoLookupSlot?[idOld].ToList(); #if AI || HS2 - internal static HeadPresetInfo TryGetHeadPresetInfo(int slot, string guid, string preset) => - _headPresetInfoLookupSlot?[slot].FirstOrDefault(x => x.HeadGUID == guid && x.Preset == preset); + internal static HeadPresetInfo TryGetHeadPresetInfo(int slot, string guid, string preset) + { + guid = guid?.Trim(); + return _headPresetInfoLookupSlot?[slot].FirstOrDefault(x => x.HeadGUID == guid && x.Preset == preset); + } + internal static void SetHeadPresetInfos(ICollection results) => _headPresetInfoLookupSlot = results.ToLookup(info => info.HeadID); - internal static FaceSkinInfo TryGetFaceSkinInfo(int slot, string guid) => - _faceSkinInfoLookupSlot?[slot].FirstOrDefault(x => x.SkinSlot == slot && x.SkinGUID == guid); + internal static FaceSkinInfo TryGetFaceSkinInfo(int slot, string guid) + { + guid = guid?.Trim(); + return _faceSkinInfoLookupSlot?[slot].FirstOrDefault(x => x.SkinSlot == slot && x.SkinGUID == guid); + } + internal static FaceSkinInfo TryGetFaceSkinInfo(int localSlot) => _faceSkinInfoLookupLocalSlot?[localSlot].FirstOrDefault(); #endif diff --git a/src/Core_Sideloader_Studio/UniversalAutoResolver/Core.UAR.Studio.StudioResolveInfo.cs b/src/Core_Sideloader_Studio/UniversalAutoResolver/Core.UAR.Studio.StudioResolveInfo.cs index ebf13a89..91d23e93 100644 --- a/src/Core_Sideloader_Studio/UniversalAutoResolver/Core.UAR.Studio.StudioResolveInfo.cs +++ b/src/Core_Sideloader_Studio/UniversalAutoResolver/Core.UAR.Studio.StudioResolveInfo.cs @@ -10,11 +10,18 @@ namespace Sideloader.AutoResolver [MessagePackObject] public class StudioResolveInfo { + private string _guid; + /// /// GUID of the mod as defined in the manifest.xml /// [Key("ModID")] - public string GUID { get; set; } + public string GUID + { + get => _guid; + set => _guid = value?.Trim(); + } + /// /// ID of the item as defined in the mod's list files /// diff --git a/src/Core_Sideloader_Studio/UniversalAutoResolver/Core.UAR.Studio.cs b/src/Core_Sideloader_Studio/UniversalAutoResolver/Core.UAR.Studio.cs index dc055862..a8d13f02 100644 --- a/src/Core_Sideloader_Studio/UniversalAutoResolver/Core.UAR.Studio.cs +++ b/src/Core_Sideloader_Studio/UniversalAutoResolver/Core.UAR.Studio.cs @@ -107,7 +107,7 @@ public static IEnumerable GetStudioResolveInfos(string guid, { UpdateLookupsIfNeeded(); - if (StudioResolutionInfoGuidLookup.TryGetValue(guid, out var slotLookup)) + if (StudioResolutionInfoGuidLookup.TryGetValue(guid.Trim(), out var slotLookup)) { if (slotLookup.TryGetValue(slot, out var result)) return onlyResolveItems ? result.Where(IsResolveItem) : result; @@ -381,16 +381,17 @@ internal static void ResolveStudioObjectPattern(StudioPatternResolveInfo extReso { if (!extResolve.ObjectPatternInfo.TryGetValue(i, out var patternInfo)) continue; - var intResolve = TryGetResolutionInfo(Item.pattern[i].key, ChaListDefine.CategoryNo.mt_pattern, patternInfo.GUID); + var patternGUID = patternInfo.GUID?.Trim(); + var intResolve = TryGetResolutionInfo(Item.pattern[i].key, ChaListDefine.CategoryNo.mt_pattern, patternGUID); if (intResolve != null) { if (resolveType == ResolveType.Load && Sideloader.DebugLogging.Value) - Sideloader.Logger.LogDebug($"Resolving (Studio Item Pattern) [{patternInfo.GUID}] {Item.pattern[i].key}->{intResolve.LocalSlot}"); + Sideloader.Logger.LogDebug($"Resolving (Studio Item Pattern) [{patternGUID}] {Item.pattern[i].key}->{intResolve.LocalSlot}"); Item.pattern[i].key = intResolve.LocalSlot; } else if (resolveType == ResolveType.Load) { - ShowGUIDError(patternInfo.GUID, patternInfo.Author, patternInfo.Website, patternInfo.Name); + ShowGUIDError(patternGUID, patternInfo.Author, patternInfo.Website, patternInfo.Name); Item.pattern[i].key = BaseSlotID - 1; } } @@ -399,16 +400,17 @@ internal static void ResolveStudioObjectPattern(StudioPatternResolveInfo extReso { if (!extResolve.ObjectPatternInfo.TryGetValue(i, out var patternInfo)) continue; - var intResolve = TryGetResolutionInfo(Item.colors[i].pattern.key, AIChara.ChaListDefine.CategoryNo.st_pattern, patternInfo.GUID); + var patternGUID = patternInfo.GUID?.Trim(); + var intResolve = TryGetResolutionInfo(Item.colors[i].pattern.key, AIChara.ChaListDefine.CategoryNo.st_pattern, patternGUID); if (intResolve != null) { if (resolveType == ResolveType.Load && Sideloader.DebugLogging.Value) - Sideloader.Logger.LogDebug($"Resolving (Studio Item Pattern) [{patternInfo.GUID}] {Item.colors[i].pattern.key}->{intResolve.LocalSlot}"); + Sideloader.Logger.LogDebug($"Resolving (Studio Item Pattern) [{patternGUID}] {Item.colors[i].pattern.key}->{intResolve.LocalSlot}"); Item.colors[i].pattern.key = intResolve.LocalSlot; } else if (resolveType == ResolveType.Load) { - ShowGUIDError(patternInfo.GUID, patternInfo.Author, patternInfo.Website, patternInfo.Name); + ShowGUIDError(patternGUID, patternInfo.Author, patternInfo.Website, patternInfo.Name); Item.colors[i].pattern.key = BaseSlotID - 1; } }