From 55ed7a8df88787d9bef1273e8a7eebf3bc7d5fc9 Mon Sep 17 00:00:00 2001 From: asesidaa <1061472754@qq.com> Date: Mon, 19 Sep 2022 23:02:01 +0800 Subject: [PATCH] Support both json and compressed files Bump versions --- TaikoLocalServer/Common/Constants.cs | 1 + TaikoLocalServer/Services/GameDataService.cs | 17 ++++++++ TaikoLocalServer/TaikoLocalServer.csproj | 13 +++--- TaikoWebUI/Services/GameDataService.cs | 43 ++++++++++++++++---- TaikoWebUI/Shared/Constants.cs | 4 ++ TaikoWebUI/TaikoWebUI.csproj | 14 ++----- 6 files changed, 66 insertions(+), 26 deletions(-) diff --git a/TaikoLocalServer/Common/Constants.cs b/TaikoLocalServer/Common/Constants.cs index aed3b93..15cf172 100644 --- a/TaikoLocalServer/Common/Constants.cs +++ b/TaikoLocalServer/Common/Constants.cs @@ -19,6 +19,7 @@ public static class Constants public const string DEFAULT_DB_NAME = "taiko.db3"; public const string MUSIC_ATTRIBUTE_FILE_NAME = "music_attribute.json"; + public const string MUSIC_ATTRIBUTE_COMPRESSED_FILE_NAME = "music_attribute.bin"; public const string DAN_DATA_FILE_NAME = "dan_data.json"; diff --git a/TaikoLocalServer/Services/GameDataService.cs b/TaikoLocalServer/Services/GameDataService.cs index a22546e..ab3cc9a 100644 --- a/TaikoLocalServer/Services/GameDataService.cs +++ b/TaikoLocalServer/Services/GameDataService.cs @@ -1,5 +1,6 @@ using System.Collections.Immutable; using System.Text.Json; +using ICSharpCode.SharpZipLib.GZip; using SharedProject.Models; using Swan.Mapping; using Throw; @@ -53,6 +54,10 @@ public class GameDataService : IGameDataService var danDataPath = Path.Combine(dataPath, Constants.DAN_DATA_FILE_NAME); var songIntroDataPath = Path.Combine(dataPath, Constants.INTRO_DATA_FILE_NAME); + if (!File.Exists(musicAttributePath)) + { + TryDecompressMusicAttribute(); + } await using var musicAttributeFile = File.OpenRead(musicAttributePath); await using var danDataFile = File.OpenRead(danDataPath); await using var songIntroDataFile = File.OpenRead(songIntroDataPath); @@ -68,6 +73,18 @@ public class GameDataService : IGameDataService InitializeIntroData(introData); } + private static void TryDecompressMusicAttribute() + { + var dataPath = PathHelper.GetDataPath(); + var musicAttributePath = Path.Combine(dataPath, Constants.MUSIC_ATTRIBUTE_FILE_NAME); + var compressedMusicAttributePath = Path.Combine(dataPath, Constants.MUSIC_ATTRIBUTE_COMPRESSED_FILE_NAME); + + using var compressed = File.Open(compressedMusicAttributePath, FileMode.Open); + using var output = File.Create(musicAttributePath); + + GZip.Decompress(compressed, output, true); + } + private void InitializeIntroData(List? introData) { introData.ThrowIfNull("Shouldn't happen!"); diff --git a/TaikoLocalServer/TaikoLocalServer.csproj b/TaikoLocalServer/TaikoLocalServer.csproj index a4f65a9..0fa311e 100644 --- a/TaikoLocalServer/TaikoLocalServer.csproj +++ b/TaikoLocalServer/TaikoLocalServer.csproj @@ -12,10 +12,10 @@ - - - - + + + + all runtime; build; native; contentfiles; analyzers; buildtransitive @@ -23,7 +23,7 @@ - + @@ -38,9 +38,6 @@ - - PreserveNewest - PreserveNewest diff --git a/TaikoWebUI/Services/GameDataService.cs b/TaikoWebUI/Services/GameDataService.cs index 768832c..c72f86b 100644 --- a/TaikoWebUI/Services/GameDataService.cs +++ b/TaikoWebUI/Services/GameDataService.cs @@ -1,4 +1,7 @@ using System.Collections.Immutable; +using System.Net; +using System.Text.Json; +using ICSharpCode.SharpZipLib.GZip; using Swan.Mapping; using TaikoWebUI.Shared.Models; @@ -27,16 +30,12 @@ public class GameDataService : IGameDataService public async Task InitializeAsync(string dataBaseUrl) { - var musicInfo = await client.GetFromJsonAsync($"{dataBaseUrl}/data/musicinfo.json"); - var wordList = await client.GetFromJsonAsync($"{dataBaseUrl}/data/wordlist.json"); - var musicOrder = await client.GetFromJsonAsync($"{dataBaseUrl}/data/music_order.json"); + var musicInfo = await GetData(dataBaseUrl, Constants.MUSIC_INFO_BASE_NAME); + var wordList = await GetData(dataBaseUrl, Constants.WORD_LIST_BASE_NAME); + var musicOrder = await GetData(dataBaseUrl, Constants.MUSIC_ORDER_BASE_NAME); var danData = await client.GetFromJsonAsync>($"{dataBaseUrl}/data/dan_data.json"); - musicInfo.ThrowIfNull(); - wordList.ThrowIfNull(); - musicOrder.ThrowIfNull(); danData.ThrowIfNull(); - danMap = danData.ToImmutableDictionary(data => data.DanId); // To prevent duplicate entries in wordlist @@ -52,6 +51,36 @@ public class GameDataService : IGameDataService await Task.Run(() => InitializeTitles(dict)); } + private async Task GetData(string dataBaseUrl, string fileBaseName) where T : notnull + { + T? data; + try + { + data = await client.GetFromJsonAsync($"{dataBaseUrl}/data/{fileBaseName}.json"); + data.ThrowIfNull(); + return data; + } + catch (HttpRequestException e) + { + if (e.StatusCode != HttpStatusCode.NotFound) + { + throw; + } + await using var compressed = await client.GetStreamAsync($"{dataBaseUrl}/data/{fileBaseName}.bin"); + await using var gZipInputStream = new GZipInputStream(compressed); + using var decompressed = new MemoryStream(); + + // Decompress + await gZipInputStream.CopyToAsync(decompressed); + + // Reset stream for reading + decompressed.Position = 0; + data = await JsonSerializer.DeserializeAsync(decompressed); + data.ThrowIfNull(); + return data; + } + } + public string GetMusicNameBySongId(uint songId) { return musicMap.TryGetValue(songId, out var musicDetail) ? musicDetail.SongName : string.Empty; diff --git a/TaikoWebUI/Shared/Constants.cs b/TaikoWebUI/Shared/Constants.cs index 47eb065..c795ffe 100644 --- a/TaikoWebUI/Shared/Constants.cs +++ b/TaikoWebUI/Shared/Constants.cs @@ -9,4 +9,8 @@ public static class Constants public const int COSTUME_PUCHI_MAX = 129; public const int COSTUME_COLOR_MAX = 63; public const int PLAYER_TITLE_MAX = 750; + + public const string MUSIC_INFO_BASE_NAME = "musicinfo"; + public const string WORD_LIST_BASE_NAME = "wordlist"; + public const string MUSIC_ORDER_BASE_NAME = "music_order"; } \ No newline at end of file diff --git a/TaikoWebUI/TaikoWebUI.csproj b/TaikoWebUI/TaikoWebUI.csproj index d6221e1..808601f 100644 --- a/TaikoWebUI/TaikoWebUI.csproj +++ b/TaikoWebUI/TaikoWebUI.csproj @@ -8,9 +8,10 @@ - - + + + @@ -22,15 +23,6 @@ PreserveNewest - - PreserveNewest - - - PreserveNewest - - - PreserveNewest -