diff --git a/src/DevilDaggersInfo.DevUtil.DistributeHistoryStats/HighscoreSpreadUtils.cs b/src/DevilDaggersInfo.DevUtil.DistributeHistoryStats/HighscoreSpreadUtils.cs index 4bb009369..e198123fc 100644 --- a/src/DevilDaggersInfo.DevUtil.DistributeHistoryStats/HighscoreSpreadUtils.cs +++ b/src/DevilDaggersInfo.DevUtil.DistributeHistoryStats/HighscoreSpreadUtils.cs @@ -62,7 +62,7 @@ private static void SpreadHighscoreStats(List leaderboards, _log.Append("\tSet missing stats for ").Append(entry.Username).Append(' ').AppendLine(entry.Time.ToString(StringFormats.TimeFormat)); _log.Append("\t\tGems: ").Append(entry.Gems).AppendLine(); _log.Append("\t\tKills: ").Append(entry.Kills).AppendLine(); - _log.Append("\t\tDeathType: ").AppendLine(Deaths.GetDeathByLeaderboardType(GameVersions.GetGameVersionFromDate(leaderboard.DateTime) ?? GameVersion.V1_0, entry.DeathType)?.Name ?? "Unknown"); + _log.Append("\t\tDeathType: ").AppendLine(Deaths.GetDeathByType(GameVersions.GetGameVersionFromDate(leaderboard.DateTime) ?? GameVersion.V1_0, entry.DeathType)?.Name ?? "Unknown"); _log.Append("\t\tAccuracy: ").AppendFormat("{0:00.00%}", entry.DaggersHit / (float)entry.DaggersFired).AppendLine(); } diff --git a/src/DevilDaggersInfo.Web.Client/Utils/MarkupUtils.cs b/src/DevilDaggersInfo.Web.Client/Utils/MarkupUtils.cs index d737e6cc1..8e2f654de 100644 --- a/src/DevilDaggersInfo.Web.Client/Utils/MarkupUtils.cs +++ b/src/DevilDaggersInfo.Web.Client/Utils/MarkupUtils.cs @@ -22,7 +22,7 @@ public static MarkupString CustomLeaderboardDeathString(byte? deathType, GameVer public static MarkupString DeathString(byte deathType, GameVersion gameVersion = GameConstants.CurrentVersion, string textSizeClass = "text-lg") { - Death? death = Deaths.GetDeathByLeaderboardType(gameVersion, deathType); + Death? death = Deaths.GetDeathByType(gameVersion, deathType); return DeathString(death, textSizeClass); } diff --git a/src/DevilDaggersInfo.Web.Server.Domain/Models/ModArchives/ModArchiveCacheData.cs b/src/DevilDaggersInfo.Web.Server.Domain/Models/ModArchives/ModArchiveCacheData.cs index b50af42a0..488c7a3f0 100644 --- a/src/DevilDaggersInfo.Web.Server.Domain/Models/ModArchives/ModArchiveCacheData.cs +++ b/src/DevilDaggersInfo.Web.Server.Domain/Models/ModArchives/ModArchiveCacheData.cs @@ -17,16 +17,18 @@ public ModTypes ModTypes() ModTypes modTypes = Entities.Enums.ModTypes.None; if (Binaries.Exists(b => b.ModBinaryType == ModBinaryType.Audio)) modTypes |= Entities.Enums.ModTypes.Audio; - if (ddBinary?.Chunks.Exists(c => c.AssetType == AssetType.Shader) == true) + if (ddBinary?.TocEntries.Exists(c => c.AssetType == AssetType.Shader) == true) modTypes |= Entities.Enums.ModTypes.Shader; - if (ddBinary?.Chunks.Exists(c => c.AssetType == AssetType.ObjectBinding || c.AssetType == AssetType.Mesh) == true) + if (ddBinary?.TocEntries.Exists(c => c.AssetType == AssetType.ObjectBinding || c.AssetType == AssetType.Mesh) == true) modTypes |= Entities.Enums.ModTypes.Mesh; - if (ddBinary?.Chunks.Exists(c => c.AssetType == AssetType.Texture) == true) + if (ddBinary?.TocEntries.Exists(c => c.AssetType == AssetType.Texture) == true) modTypes |= Entities.Enums.ModTypes.Texture; return modTypes; } public bool ContainsProhibitedAssets() - => Binaries.Exists(b => b.ContainsProhibitedAssets()); + { + return Binaries.Exists(b => b.ContainsProhibitedAssets()); + } } diff --git a/src/DevilDaggersInfo.Web.Server.Domain/Models/ModArchives/ModBinaryCacheData.cs b/src/DevilDaggersInfo.Web.Server.Domain/Models/ModArchives/ModBinaryCacheData.cs index a8217cfea..698c2033b 100644 --- a/src/DevilDaggersInfo.Web.Server.Domain/Models/ModArchives/ModBinaryCacheData.cs +++ b/src/DevilDaggersInfo.Web.Server.Domain/Models/ModArchives/ModBinaryCacheData.cs @@ -2,25 +2,28 @@ using DevilDaggersInfo.Core.Mod; using DevilDaggersInfo.Core.Mod.Exceptions; using DevilDaggersInfo.Core.Mod.Utils; +using Newtonsoft.Json; using System.Text; namespace DevilDaggersInfo.Web.Server.Domain.Models.ModArchives; public class ModBinaryCacheData { - public ModBinaryCacheData(string name, long size, ModBinaryType modBinaryType, List chunks, List? modifiedLoudnessAssets) + public ModBinaryCacheData(string name, long size, ModBinaryType modBinaryType, List tocEntries, List? modifiedLoudnessAssets) { Name = name; Size = size; ModBinaryType = modBinaryType; - Chunks = chunks; + TocEntries = tocEntries; ModifiedLoudnessAssets = modifiedLoudnessAssets; } public string Name { get; } public long Size { get; } public ModBinaryType ModBinaryType { get; } - public List Chunks { get; } + + [JsonProperty("Chunks")] + public List TocEntries { get; } public List? ModifiedLoudnessAssets { get; } public static ModBinaryCacheData CreateFromFile(string fileName, byte[] fileContents) @@ -31,7 +34,7 @@ public static ModBinaryCacheData CreateFromFile(string fileName, byte[] fileCont if (modBinary.Toc.Type != binaryTypeFromFileName) throw new InvalidModBinaryException($"Binary '{fileName}' has type mismatch; file name claims '{binaryTypeFromFileName}' but file contents claim '{modBinary.Toc.Type}'."); - List chunks = modBinary.Toc.Chunks.Select(c => new ModChunkCacheData + List tocEntries = modBinary.Toc.Entries.Select(c => new ModTocEntryCacheData { Name = c.Name, Size = c.Size, @@ -39,22 +42,22 @@ public static ModBinaryCacheData CreateFromFile(string fileName, byte[] fileCont IsProhibited = AssetContainer.IsProhibited(c.AssetType, c.Name), }).ToList(); - ModBinaryChunk? loudnessChunk = modBinary.Toc.Chunks.FirstOrDefault(c => c.IsLoudness()); + ModBinaryTocEntry? loudnessTocEntry = modBinary.Toc.Entries.FirstOrDefault(c => c.IsLoudness()); List? modifiedLoudnessAssets = null; - if (loudnessChunk != null) + if (loudnessTocEntry != null) { - byte[] loudnessBytes = new byte[loudnessChunk.Size]; - Buffer.BlockCopy(fileContents, loudnessChunk.Offset, loudnessBytes, 0, loudnessChunk.Size); + byte[] loudnessBytes = new byte[loudnessTocEntry.Size]; + Buffer.BlockCopy(fileContents, loudnessTocEntry.Offset, loudnessBytes, 0, loudnessTocEntry.Size); string loudnessString = Encoding.UTF8.GetString(loudnessBytes); modifiedLoudnessAssets = ReadModifiedLoudnessValues(loudnessString); } - return new(fileName, fileContents.Length, modBinary.Toc.Type, chunks, modifiedLoudnessAssets); + return new(fileName, fileContents.Length, modBinary.Toc.Type, tocEntries, modifiedLoudnessAssets); } private static List ReadModifiedLoudnessValues(string loudnessString) { - List loudnessAssets = new(); + List loudnessAssets = []; foreach (string line in loudnessString.Split('\n')) { @@ -100,5 +103,7 @@ private static bool TryReadLoudnessLine(string line, out string? assetName, out } public bool ContainsProhibitedAssets() - => Chunks.Any(c => c.IsProhibited); + { + return TocEntries.Exists(c => c.IsProhibited); + } } diff --git a/src/DevilDaggersInfo.Web.Server.Domain/Models/ModArchives/ModChunkCacheData.cs b/src/DevilDaggersInfo.Web.Server.Domain/Models/ModArchives/ModTocEntryCacheData.cs similarity index 89% rename from src/DevilDaggersInfo.Web.Server.Domain/Models/ModArchives/ModChunkCacheData.cs rename to src/DevilDaggersInfo.Web.Server.Domain/Models/ModArchives/ModTocEntryCacheData.cs index 586720652..680582e08 100644 --- a/src/DevilDaggersInfo.Web.Server.Domain/Models/ModArchives/ModChunkCacheData.cs +++ b/src/DevilDaggersInfo.Web.Server.Domain/Models/ModArchives/ModTocEntryCacheData.cs @@ -2,7 +2,7 @@ namespace DevilDaggersInfo.Web.Server.Domain.Models.ModArchives; -public record ModChunkCacheData +public record ModTocEntryCacheData { public required string Name { get; init; } diff --git a/src/DevilDaggersInfo.Web.Server.Domain/Services/Caching/ModArchiveCache.cs b/src/DevilDaggersInfo.Web.Server.Domain/Services/Caching/ModArchiveCache.cs index 21e5ae0b6..eb092d979 100644 --- a/src/DevilDaggersInfo.Web.Server.Domain/Services/Caching/ModArchiveCache.cs +++ b/src/DevilDaggersInfo.Web.Server.Domain/Services/Caching/ModArchiveCache.cs @@ -22,6 +22,8 @@ public ModArchiveCache(IFileSystemService fileSystemService) _fileSystemService = fileSystemService; } + public int Count => _cache.Count; + public async Task GetArchiveDataByBytesAsync(string name, byte[] bytes) { // Check memory cache. @@ -34,7 +36,7 @@ public async Task GetArchiveDataByBytesAsync(string name, b return fileCache; // Unzip zip file bytes. - using MemoryStream ms = new(bytes); + await using MemoryStream ms = new(bytes); return CreateModArchiveCacheDataFromStream(name, ms, false); // Do not add this to the cache because it is not yet validated. } @@ -50,7 +52,7 @@ public async Task GetArchiveDataByFilePathAsync(string file if (fileCache != null) return fileCache; - // Unzip zip file. + // Unzip zip file. TODO: This should only be done manually from the admin pages. lock (_fileStreamLock) { using FileStream fs = new(filePath, FileMode.Open); @@ -60,11 +62,11 @@ public async Task GetArchiveDataByFilePathAsync(string file private async Task LoadFromFileCacheAsync(string name) { - string fileCachePath = Path.Combine(_fileSystemService.GetPath(DataSubDirectory.ModArchiveCache), $"{name}.json"); - if (!File.Exists(fileCachePath)) + string? json = await _fileSystemService.GetModArchiveCacheDataJsonAsync(name); + if (json == null) return null; - ModArchiveCacheData? fileCacheArchiveData = JsonConvert.DeserializeObject(await File.ReadAllTextAsync(fileCachePath)); + ModArchiveCacheData? fileCacheArchiveData = JsonConvert.DeserializeObject(json); if (fileCacheArchiveData == null) return null; @@ -132,8 +134,7 @@ public async Task LoadEntireFileCacheAsync() } public void Clear() - => _cache.Clear(); - - public int GetCount() - => _cache.Count; + { + _cache.Clear(); + } } diff --git a/src/DevilDaggersInfo.Web.Server.Domain/Services/Inversion/IFileSystemService.cs b/src/DevilDaggersInfo.Web.Server.Domain/Services/Inversion/IFileSystemService.cs index 2d4ee1d93..0e35d00a6 100644 --- a/src/DevilDaggersInfo.Web.Server.Domain/Services/Inversion/IFileSystemService.cs +++ b/src/DevilDaggersInfo.Web.Server.Domain/Services/Inversion/IFileSystemService.cs @@ -9,4 +9,6 @@ public interface IFileSystemService string GetLeaderboardHistoryPathFromDate(DateTime dateTime); string GetPath(DataSubDirectory subDirectory); + + Task GetModArchiveCacheDataJsonAsync(string modName); } diff --git a/src/DevilDaggersInfo.Web.Server.Domain/Services/ModArchiveProcessor.cs b/src/DevilDaggersInfo.Web.Server.Domain/Services/ModArchiveProcessor.cs index 3af3545e5..b4cc4ff85 100644 --- a/src/DevilDaggersInfo.Web.Server.Domain/Services/ModArchiveProcessor.cs +++ b/src/DevilDaggersInfo.Web.Server.Domain/Services/ModArchiveProcessor.cs @@ -64,7 +64,7 @@ public async Task ProcessModBinaryUploadAsync(string modName, Dictionary> GetCaches() { new() { Name = "LeaderboardHistory", Count = _leaderboardHistoryCache.GetCount() }, new() { Name = "LeaderboardStatistics", Count = _leaderboardStatisticsCache.GetCount() }, - new() { Name = "ModArchive", Count = _modArchiveCache.GetCount() }, + new() { Name = "ModArchive", Count = _modArchiveCache.Count }, }; } diff --git a/src/DevilDaggersInfo.Web.Server/Converters/DomainToApi/Main/ModConverters.cs b/src/DevilDaggersInfo.Web.Server/Converters/DomainToApi/Main/ModConverters.cs index 517e6472c..37731d283 100644 --- a/src/DevilDaggersInfo.Web.Server/Converters/DomainToApi/Main/ModConverters.cs +++ b/src/DevilDaggersInfo.Web.Server/Converters/DomainToApi/Main/ModConverters.cs @@ -49,7 +49,7 @@ public static MainApi.GetMod ToMainApi(this ModEntity mod, ModFileSystemData mod ModBinaryType = b.ModBinaryType.ToMainApi(), Name = b.Name, Size = b.Size, - Assets = b.Chunks.ConvertAll(c => new MainApi.GetModAsset + Assets = b.TocEntries.ConvertAll(c => new MainApi.GetModAsset { Name = c.Name, Size = c.Size, Type = c.AssetType.ToMainApi(), IsProhibited = c.IsProhibited, }), diff --git a/src/DevilDaggersInfo.Web.Server/Services/FileSystemService.cs b/src/DevilDaggersInfo.Web.Server/Services/FileSystemService.cs index 5549b5456..ffd111c79 100644 --- a/src/DevilDaggersInfo.Web.Server/Services/FileSystemService.cs +++ b/src/DevilDaggersInfo.Web.Server/Services/FileSystemService.cs @@ -42,4 +42,10 @@ public string GetPath(DataSubDirectory subDirectory) { return Path.Combine(_root, subDirectory.ToString()); } + + public async Task GetModArchiveCacheDataJsonAsync(string modName) + { + string filePath = Path.Combine(GetPath(DataSubDirectory.ModArchiveCache), $"{modName}.json"); + return IoFile.Exists(filePath) ? await IoFile.ReadAllTextAsync(filePath) : null; + } } diff --git a/src/Directory.Packages.props b/src/Directory.Packages.props index 70f97a82b..ecfcc753d 100644 --- a/src/Directory.Packages.props +++ b/src/Directory.Packages.props @@ -28,7 +28,7 @@ - + diff --git a/src/test/DevilDaggersInfo.Web.Server.Domain.Test/Tests/ServerDomain/ModArchiveCacheTests.cs b/src/test/DevilDaggersInfo.Web.Server.Domain.Test/Tests/ServerDomain/ModArchiveCacheTests.cs new file mode 100644 index 000000000..a470c1a77 --- /dev/null +++ b/src/test/DevilDaggersInfo.Web.Server.Domain.Test/Tests/ServerDomain/ModArchiveCacheTests.cs @@ -0,0 +1,34 @@ +using DevilDaggersInfo.Core.Asset; +using DevilDaggersInfo.Core.Mod; +using DevilDaggersInfo.Web.Server.Domain.Models.ModArchives; +using DevilDaggersInfo.Web.Server.Domain.Services.Caching; +using DevilDaggersInfo.Web.Server.Domain.Test.Utils; + +namespace DevilDaggersInfo.Web.Server.Domain.Test.Tests.ServerDomain; + +[TestClass] +public class ModArchiveCacheTests +{ + [TestMethod] + public async Task GetModArchiveCacheData() + { + ModArchiveCache cache = new(new TestData()); + ModArchiveCacheData data = await cache.GetArchiveDataByFilePathAsync("test.json"); + Assert.AreEqual(8400, data.FileSize); + Assert.AreEqual(21891, data.FileSizeExtracted); + Assert.AreEqual(1, data.Binaries.Count); + + ModBinaryCacheData binary = data.Binaries[0]; + Assert.AreEqual("dd-test-main", binary.Name); + Assert.AreEqual(21891, binary.Size); + Assert.AreEqual(ModBinaryType.Dd, binary.ModBinaryType); + Assert.AreEqual(1, binary.TocEntries.Count); + + ModTocEntryCacheData tocEntry = binary.TocEntries[0]; + Assert.AreEqual("dagger6", tocEntry.Name); + Assert.AreEqual(21855, tocEntry.Size); + Assert.AreEqual(AssetType.Texture, tocEntry.AssetType); + Assert.IsFalse(tocEntry.IsProhibited); + Assert.IsNull(binary.ModifiedLoudnessAssets); + } +} diff --git a/src/test/DevilDaggersInfo.Web.Server.Domain.Test/Tests/ServerDomain/ModArchiveProcessorProcessTests.cs b/src/test/DevilDaggersInfo.Web.Server.Domain.Test/Tests/ServerDomain/ModArchiveProcessorProcessTests.cs index 64c766ccd..2cf9679c5 100644 --- a/src/test/DevilDaggersInfo.Web.Server.Domain.Test/Tests/ServerDomain/ModArchiveProcessorProcessTests.cs +++ b/src/test/DevilDaggersInfo.Web.Server.Domain.Test/Tests/ServerDomain/ModArchiveProcessorProcessTests.cs @@ -1,5 +1,6 @@ using DevilDaggersInfo.Core.Asset; using DevilDaggersInfo.Core.Mod; +using DevilDaggersInfo.Core.Mod.Builders; using DevilDaggersInfo.Web.Server.Domain.Models.ModArchives; using System.IO.Compression; @@ -16,7 +17,7 @@ public async Task ProcessNewMod_1Binary_1Asset() BinaryName binaryName = new(ModBinaryType.Dd, "main"); const string assetName = "binding"; - ModBinaryBuilder binary = CreateWithBinding(assetName); + DdModBinaryBuilder binary = CreateWithBinding(assetName); await Processor.ProcessModBinaryUploadAsync(modName, new() { [binaryName] = binary.Compile() }); string zipFilePath = Accessor.GetModArchivePath(modName); @@ -26,9 +27,9 @@ public async Task ProcessNewMod_1Binary_1Asset() ModBinaryCacheData processedBinary = GetProcessedBinaryFromArchiveEntry(archive.Entries[0]); Assert.AreEqual(ModBinaryType.Dd, processedBinary.ModBinaryType); AssertBinaryName(binaryName, processedBinary.Name, modName); - Assert.AreEqual(1, processedBinary.Chunks.Count); - Assert.AreEqual(assetName, processedBinary.Chunks[0].Name); - Assert.AreEqual(AssetType.ObjectBinding, processedBinary.Chunks[0].AssetType); + Assert.AreEqual(1, processedBinary.TocEntries.Count); + Assert.AreEqual(assetName, processedBinary.TocEntries[0].Name); + Assert.AreEqual(AssetType.ObjectBinding, processedBinary.TocEntries[0].AssetType); } [TestMethod] @@ -49,11 +50,11 @@ public async Task ProcessNewMod_1Binary_2Assets() ModBinaryCacheData processedBinary = GetProcessedBinaryFromArchiveEntry(archive.Entries[0]); Assert.AreEqual(ModBinaryType.Dd, processedBinary.ModBinaryType); AssertBinaryName(binaryName, processedBinary.Name, modName); - Assert.AreEqual(2, processedBinary.Chunks.Count); - Assert.AreEqual(assetName1, processedBinary.Chunks[0].Name); - Assert.AreEqual(AssetType.ObjectBinding, processedBinary.Chunks[0].AssetType); - Assert.AreEqual(assetName2, processedBinary.Chunks[1].Name); - Assert.AreEqual(AssetType.Texture, processedBinary.Chunks[1].AssetType); + Assert.AreEqual(2, processedBinary.TocEntries.Count); + Assert.AreEqual(assetName1, processedBinary.TocEntries[0].Name); + Assert.AreEqual(AssetType.ObjectBinding, processedBinary.TocEntries[0].AssetType); + Assert.AreEqual(assetName2, processedBinary.TocEntries[1].Name); + Assert.AreEqual(AssetType.Texture, processedBinary.TocEntries[1].AssetType); } [TestMethod] @@ -81,19 +82,19 @@ public async Task ProcessNewMod_2Binaries_2Assets() ModBinaryCacheData processedBinary1 = GetProcessedBinaryFromArchiveEntry(archive.Entries[0]); Assert.AreEqual(ModBinaryType.Dd, processedBinary1.ModBinaryType); AssertBinaryName(binaryName1, processedBinary1.Name, modName); - Assert.AreEqual(2, processedBinary1.Chunks.Count); - Assert.AreEqual(assetName1, processedBinary1.Chunks[0].Name); - Assert.AreEqual(AssetType.ObjectBinding, processedBinary1.Chunks[0].AssetType); - Assert.AreEqual(assetName2, processedBinary1.Chunks[1].Name); - Assert.AreEqual(AssetType.Texture, processedBinary1.Chunks[1].AssetType); + Assert.AreEqual(2, processedBinary1.TocEntries.Count); + Assert.AreEqual(assetName1, processedBinary1.TocEntries[0].Name); + Assert.AreEqual(AssetType.ObjectBinding, processedBinary1.TocEntries[0].AssetType); + Assert.AreEqual(assetName2, processedBinary1.TocEntries[1].Name); + Assert.AreEqual(AssetType.Texture, processedBinary1.TocEntries[1].AssetType); ModBinaryCacheData processedBinary2 = GetProcessedBinaryFromArchiveEntry(archive.Entries[1]); Assert.AreEqual(ModBinaryType.Dd, processedBinary2.ModBinaryType); AssertBinaryName(binaryName2, processedBinary2.Name, modName); - Assert.AreEqual(2, processedBinary2.Chunks.Count); - Assert.AreEqual(assetName1, processedBinary2.Chunks[0].Name); - Assert.AreEqual(AssetType.ObjectBinding, processedBinary2.Chunks[0].AssetType); - Assert.AreEqual(assetName2, processedBinary2.Chunks[1].Name); - Assert.AreEqual(AssetType.Texture, processedBinary2.Chunks[1].AssetType); + Assert.AreEqual(2, processedBinary2.TocEntries.Count); + Assert.AreEqual(assetName1, processedBinary2.TocEntries[0].Name); + Assert.AreEqual(AssetType.ObjectBinding, processedBinary2.TocEntries[0].AssetType); + Assert.AreEqual(assetName2, processedBinary2.TocEntries[1].Name); + Assert.AreEqual(AssetType.Texture, processedBinary2.TocEntries[1].AssetType); } } diff --git a/src/test/DevilDaggersInfo.Web.Server.Domain.Test/Tests/ServerDomain/ModArchiveProcessorTests.cs b/src/test/DevilDaggersInfo.Web.Server.Domain.Test/Tests/ServerDomain/ModArchiveProcessorTests.cs index cebd7a934..34725a58c 100644 --- a/src/test/DevilDaggersInfo.Web.Server.Domain.Test/Tests/ServerDomain/ModArchiveProcessorTests.cs +++ b/src/test/DevilDaggersInfo.Web.Server.Domain.Test/Tests/ServerDomain/ModArchiveProcessorTests.cs @@ -1,5 +1,6 @@ using DevilDaggersInfo.Core.Asset; using DevilDaggersInfo.Core.Mod; +using DevilDaggersInfo.Core.Mod.Builders; using DevilDaggersInfo.Web.Server.Domain.Models.FileSystem; using DevilDaggersInfo.Web.Server.Domain.Models.ModArchives; using DevilDaggersInfo.Web.Server.Domain.Services; @@ -62,18 +63,18 @@ protected static ModBinaryCacheData GetProcessedBinaryFromArchiveEntry(ZipArchiv return ModBinaryCacheData.CreateFromFile(entry.Name, extractedContents); } - protected static ModBinaryBuilder CreateWithBinding(string assetName) + protected static DdModBinaryBuilder CreateWithBinding(string assetName) { - ModBinaryBuilder binary = new(ModBinaryType.Dd); - binary.AddAsset(assetName, AssetType.ObjectBinding, "shader = \"boid\""u8.ToArray()); + DdModBinaryBuilder binary = new(); + binary.AddObjectBinding(assetName, "shader = \"boid\""u8.ToArray()); return binary; } - protected static ModBinaryBuilder CreateWithBindingAndTexture(string shaderName, string textureName) + protected static DdModBinaryBuilder CreateWithBindingAndTexture(string shaderName, string textureName) { - ModBinaryBuilder binary = new(ModBinaryType.Dd); - binary.AddAsset(shaderName, AssetType.ObjectBinding, "shader = \"boid\""u8.ToArray()); - binary.AddAsset(textureName, AssetType.Texture, File.ReadAllBytes(Path.Combine("Resources", "Textures", "green.png"))); + DdModBinaryBuilder binary = new(); + binary.AddObjectBinding(shaderName, "shader = \"boid\""u8.ToArray()); + binary.AddTexture(textureName, File.ReadAllBytes(Path.Combine("Resources", "Textures", "green.png"))); return binary; } } diff --git a/src/test/DevilDaggersInfo.Web.Server.Domain.Test/Tests/ServerDomain/ModArchiveProcessorTransformTests.cs b/src/test/DevilDaggersInfo.Web.Server.Domain.Test/Tests/ServerDomain/ModArchiveProcessorTransformTests.cs index 5b3428b4f..0145744cd 100644 --- a/src/test/DevilDaggersInfo.Web.Server.Domain.Test/Tests/ServerDomain/ModArchiveProcessorTransformTests.cs +++ b/src/test/DevilDaggersInfo.Web.Server.Domain.Test/Tests/ServerDomain/ModArchiveProcessorTransformTests.cs @@ -1,4 +1,5 @@ using DevilDaggersInfo.Core.Mod; +using DevilDaggersInfo.Core.Mod.Builders; using DevilDaggersInfo.Web.Server.Domain.Exceptions; using DevilDaggersInfo.Web.Server.Domain.Models.ModArchives; using System.IO.Compression; @@ -21,8 +22,8 @@ public async Task Transform_Rename(string modName, string newModName) BinaryName binaryName2 = new(ModBinaryType.Dd, "main2"); const string assetName = "binding"; - ModBinaryBuilder binary1 = CreateWithBinding(assetName); - ModBinaryBuilder binary2 = CreateWithBinding(assetName); + DdModBinaryBuilder binary1 = CreateWithBinding(assetName); + DdModBinaryBuilder binary2 = CreateWithBinding(assetName); Dictionary binaries = new() { [binaryName1] = binary1.Compile(), @@ -170,7 +171,7 @@ public async Task Transform_Replace1(string modName, string newModName) // Test if the asset name is actually updated. ModBinaryCacheData modBinaryCacheData = GetProcessedBinaryFromArchiveEntry(archive.Entries[0]); - Assert.AreEqual(1, modBinaryCacheData.Chunks.Count); - Assert.AreEqual(assetName2, modBinaryCacheData.Chunks[0].Name); + Assert.AreEqual(1, modBinaryCacheData.TocEntries.Count); + Assert.AreEqual(assetName2, modBinaryCacheData.TocEntries[0].Name); } } diff --git a/src/test/DevilDaggersInfo.Web.Server.Domain.Test/Utils/TestData.cs b/src/test/DevilDaggersInfo.Web.Server.Domain.Test/Utils/TestData.cs index 638819709..a068867e8 100644 --- a/src/test/DevilDaggersInfo.Web.Server.Domain.Test/Utils/TestData.cs +++ b/src/test/DevilDaggersInfo.Web.Server.Domain.Test/Utils/TestData.cs @@ -7,7 +7,7 @@ namespace DevilDaggersInfo.Web.Server.Domain.Test.Utils; public class TestData : ILeaderboardHistoryCache, IFileSystemService { - private readonly IReadOnlyDictionary _data = new Dictionary + private readonly IReadOnlyDictionary _leaderboardHistory = new Dictionary { ["2022-01-01.bin"] = CreateLeaderboardHistory( new(2022, 1, 1, 0, 0, 0, DateTimeKind.Utc), @@ -39,6 +39,11 @@ public class TestData : ILeaderboardHistoryCache, IFileSystemService ]), }; + private readonly IReadOnlyDictionary _modArchiveCache = new Dictionary + { + ["test"] = """{"FileSize":8400,"FileSizeExtracted":21891,"Binaries":[{"Name":"dd-test-main","Size":21891,"ModBinaryType":1,"Chunks":[{"Name":"dagger6","Size":21855,"AssetType":2,"IsProhibited":false}],"ModifiedLoudnessAssets":null}]}""", + }; + private static LeaderboardHistory CreateLeaderboardHistory(DateTime dateTime, List entries) { return new() @@ -79,20 +84,37 @@ private static EntryHistory CreateEntryHistory(int rank, int id, int time, strin public string[] TryGetFiles(DataSubDirectory subDirectory) { - if (subDirectory != DataSubDirectory.LeaderboardHistory) - throw new NotImplementedException(); - - return _data.Keys.ToArray(); + return subDirectory switch + { + DataSubDirectory.LeaderboardHistory => _leaderboardHistory.Keys.ToArray(), + DataSubDirectory.ModArchiveCache => _modArchiveCache.Keys.ToArray(), + _ => throw new NotImplementedException(), + }; } public LeaderboardHistory GetLeaderboardHistoryByFilePath(string filePath) { - return _data[filePath]; + return _leaderboardHistory[filePath]; + } + + public string GetPath(DataSubDirectory subDirectory) + { + return subDirectory switch + { + DataSubDirectory.LeaderboardHistory => "LeaderboardHistory", + DataSubDirectory.ModArchiveCache => "ModArchiveCache", + _ => throw new NotImplementedException(), + }; + } + + public async Task GetModArchiveCacheDataJsonAsync(string modName) + { + await Task.Yield(); + return _modArchiveCache.GetValueOrDefault(modName); } #pragma warning disable SA1201 public string GetLeaderboardHistoryPathFromDate(DateTime dateTime) => throw new NotImplementedException(); - public string GetPath(DataSubDirectory subDirectory) => throw new NotImplementedException(); public int GetCount() => throw new NotImplementedException(); public void Clear() => throw new NotImplementedException(); #pragma warning restore SA1201