Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Bump DevilDaggersInfo.Core from 0.8.1 to 0.9.1 in /src #512

Merged
merged 8 commits into from
Mar 3, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ private static void SpreadHighscoreStats(List<LeaderboardHistory> 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();
}

Expand Down
2 changes: 1 addition & 1 deletion src/DevilDaggersInfo.Web.Client/Utils/MarkupUtils.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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<ModChunkCacheData> chunks, List<ModifiedLoudnessAssetCacheData>? modifiedLoudnessAssets)
public ModBinaryCacheData(string name, long size, ModBinaryType modBinaryType, List<ModTocEntryCacheData> tocEntries, List<ModifiedLoudnessAssetCacheData>? 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<ModChunkCacheData> Chunks { get; }

[JsonProperty("Chunks")]
public List<ModTocEntryCacheData> TocEntries { get; }
public List<ModifiedLoudnessAssetCacheData>? ModifiedLoudnessAssets { get; }

public static ModBinaryCacheData CreateFromFile(string fileName, byte[] fileContents)
Expand All @@ -31,30 +34,30 @@ 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<ModChunkCacheData> chunks = modBinary.Toc.Chunks.Select(c => new ModChunkCacheData
List<ModTocEntryCacheData> tocEntries = modBinary.Toc.Entries.Select(c => new ModTocEntryCacheData
{
Name = c.Name,
Size = c.Size,
AssetType = c.AssetType,
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<ModifiedLoudnessAssetCacheData>? 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<ModifiedLoudnessAssetCacheData> ReadModifiedLoudnessValues(string loudnessString)
{
List<ModifiedLoudnessAssetCacheData> loudnessAssets = new();
List<ModifiedLoudnessAssetCacheData> loudnessAssets = [];

foreach (string line in loudnessString.Split('\n'))
{
Expand Down Expand Up @@ -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);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

namespace DevilDaggersInfo.Web.Server.Domain.Models.ModArchives;

public record ModChunkCacheData
public record ModTocEntryCacheData
{
public required string Name { get; init; }

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@ public ModArchiveCache(IFileSystemService fileSystemService)
_fileSystemService = fileSystemService;
}

public int Count => _cache.Count;

public async Task<ModArchiveCacheData> GetArchiveDataByBytesAsync(string name, byte[] bytes)
{
// Check memory cache.
Expand All @@ -34,7 +36,7 @@ public async Task<ModArchiveCacheData> 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.
}

Expand All @@ -50,7 +52,7 @@ public async Task<ModArchiveCacheData> 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);
Expand All @@ -60,11 +62,11 @@ public async Task<ModArchiveCacheData> GetArchiveDataByFilePathAsync(string file

private async Task<ModArchiveCacheData?> 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<ModArchiveCacheData>(await File.ReadAllTextAsync(fileCachePath));
ModArchiveCacheData? fileCacheArchiveData = JsonConvert.DeserializeObject<ModArchiveCacheData>(json);
if (fileCacheArchiveData == null)
return null;

Expand Down Expand Up @@ -132,8 +134,7 @@ public async Task LoadEntireFileCacheAsync()
}

public void Clear()
=> _cache.Clear();

public int GetCount()
=> _cache.Count;
{
_cache.Clear();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,6 @@ public interface IFileSystemService
string GetLeaderboardHistoryPathFromDate(DateTime dateTime);

string GetPath(DataSubDirectory subDirectory);

Task<string?> GetModArchiveCacheDataJsonAsync(string modName);
}
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ public async Task ProcessModBinaryUploadAsync(string modName, Dictionary<BinaryN

foreach (ModBinaryCacheData binary in addedBinaries)
{
if (binary.Chunks.Count == 0)
if (binary.TocEntries.Count == 0)
throw new InvalidModBinaryException($"Mod binary '{binary.Name}' does not contain any assets.");

BinaryName expectedName = BinaryName.Parse(binary.Name, modName);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ public ActionResult<List<GetCacheEntry>> 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 },
};
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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,
}),
Expand Down
6 changes: 6 additions & 0 deletions src/DevilDaggersInfo.Web.Server/Services/FileSystemService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -42,4 +42,10 @@ public string GetPath(DataSubDirectory subDirectory)
{
return Path.Combine(_root, subDirectory.ToString());
}

public async Task<string?> GetModArchiveCacheDataJsonAsync(string modName)
{
string filePath = Path.Combine(GetPath(DataSubDirectory.ModArchiveCache), $"{modName}.json");
return IoFile.Exists(filePath) ? await IoFile.ReadAllTextAsync(filePath) : null;
}
}
2 changes: 1 addition & 1 deletion src/Directory.Packages.props
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
</ItemGroup>

<ItemGroup Label="DevilDaggersInfo">
<PackageVersion Include="DevilDaggersInfo.Core" Version="0.8.1" />
<PackageVersion Include="DevilDaggersInfo.Core" Version="0.9.1" />
</ItemGroup>

<ItemGroup Label="Json">
Expand Down
Original file line number Diff line number Diff line change
@@ -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);
}
}
Original file line number Diff line number Diff line change
@@ -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;

Expand All @@ -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);
Expand All @@ -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]
Expand All @@ -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]
Expand Down Expand Up @@ -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);
}
}
Original file line number Diff line number Diff line change
@@ -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;
Expand Down Expand Up @@ -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;
}
}
Loading
Loading