From 66b4a31b78774c397b853bba9396004bf0364d01 Mon Sep 17 00:00:00 2001 From: Jacob Morrison Date: Mon, 4 Nov 2024 10:53:06 -0500 Subject: [PATCH] Fix json serializer issues in trimmed mode (#28) * - Shorten logging to make it clearer - Add more colors to logging to make it clearer - Add more exe exclusion words - Allow NonPublic DefaultConstructor (fixes #26) - Add app version/runtime version at the top for future diagnostics - Fix typos * Fix json serializer reflection issues in trimmed mode --- SunshineGameFinder/FileWriter.cs | 4 +-- SunshineGameFinder/ImageScraper.cs | 6 ++-- SunshineGameFinder/Logger.cs | 1 + SunshineGameFinder/Program.cs | 8 ++--- SunshineGameFinder/SunshineAppsConfig.cs | 36 +++++++------------- SunshineGameFinder/SunshineGameFinder.csproj | 9 ++--- 6 files changed, 27 insertions(+), 37 deletions(-) diff --git a/SunshineGameFinder/FileWriter.cs b/SunshineGameFinder/FileWriter.cs index 495b431..75cc464 100644 --- a/SunshineGameFinder/FileWriter.cs +++ b/SunshineGameFinder/FileWriter.cs @@ -1,4 +1,4 @@ -using Newtonsoft.Json; +using System.Text.Json; namespace SunshineGameFinder { @@ -22,7 +22,7 @@ internal static bool UpdateConfig(string filePath, SunshineConfig config) string backUpFilePath = Path.Combine(folderPath, $"{Path.GetFileNameWithoutExtension(filePath)}_{DateTime.Now.ToString("MMddyyyy_HHmmss")}.{backupFileExtension}"); File.Move(filePath, backUpFilePath); - File.WriteAllText(filePath, JsonConvert.SerializeObject(config, Newtonsoft.Json.Formatting.Indented, new JsonSerializerSettings() { NullValueHandling = NullValueHandling.Ignore })); + File.WriteAllText(filePath, JsonSerializer.Serialize(config, SourceGenerationContext.Default.SunshineConfig)); } catch (Exception e) { diff --git a/SunshineGameFinder/ImageScraper.cs b/SunshineGameFinder/ImageScraper.cs index 9436b84..5fe0b4b 100644 --- a/SunshineGameFinder/ImageScraper.cs +++ b/SunshineGameFinder/ImageScraper.cs @@ -1,4 +1,4 @@ -using Newtonsoft.Json; +using System.Text.Json; namespace SunshineGameFinder { @@ -127,7 +127,7 @@ private static double CalculateSimilarity(string source, string target) private static async Task GetIDForGame(string gameName) { var rawJson = await (await HttpClient.GetAsync(bucketTemplate.Replace("@FIRSTTWOLETTERS", string.Join("", gameName.Take(2)).ToLower()))).Content.ReadAsStringAsync(); - var dict = JsonConvert.DeserializeObject>(rawJson); + var dict = JsonSerializer.Deserialize>(rawJson); KeyValuePair? FindGameFuzzy(double percentage) { return dict.FirstOrDefault(kvp => CalculateSimilarity(kvp.Value.name.ToLower(), gameName.ToLower()) > (percentage / 100)); @@ -147,7 +147,7 @@ public static async Task SaveIGDBImageToCoversFolder(string gameName, st { int gameId = await GetIDForGame(gameName); var rawJson = await (await HttpClient.GetAsync(gameTemplate.Replace("@ID", gameId.ToString()))).Content.ReadAsStringAsync(); - var game = JsonConvert.DeserializeObject(rawJson); + var game = JsonSerializer.Deserialize(rawJson); if (game == null) return null; var coverUrl = game.cover.url; var stream = await (await HttpClient.GetAsync("https:" + coverUrl.Replace("thumb", "cover_big"))).Content.ReadAsStreamAsync(); diff --git a/SunshineGameFinder/Logger.cs b/SunshineGameFinder/Logger.cs index 0d4a14a..8f2d16e 100644 --- a/SunshineGameFinder/Logger.cs +++ b/SunshineGameFinder/Logger.cs @@ -42,6 +42,7 @@ public static void Log(string message, LogLevel level, bool newline = true) Console.Write(message); } + Console.ForegroundColor = ConsoleColor.White; } } diff --git a/SunshineGameFinder/Program.cs b/SunshineGameFinder/Program.cs index 0e735da..ec5e4a2 100644 --- a/SunshineGameFinder/Program.cs +++ b/SunshineGameFinder/Program.cs @@ -1,7 +1,7 @@ // See https://aka.ms/new-console-template for more information using Gameloop.Vdf; using Gameloop.Vdf.Linq; -using Newtonsoft.Json; +using System.Text.Json; using SunshineGameFinder; using System.CommandLine; using System.Text.RegularExpressions; @@ -65,10 +65,8 @@ Logger.Log($"Could not find Sunshine Apps config at specified path: {sunshineAppsJson}", LogLevel.Error); return; } - var sunshineAppInstance = JsonConvert.DeserializeObject(File.ReadAllText(sunshineAppsJson), new JsonSerializerSettings() - { - ConstructorHandling = ConstructorHandling.AllowNonPublicDefaultConstructor - }); + var sunshineAppInstance = JsonSerializer.Deserialize(File.ReadAllText(sunshineAppsJson), SourceGenerationContext.Default.SunshineConfig); + var gamesAdded = 0; var gamesRemoved = 0; diff --git a/SunshineGameFinder/SunshineAppsConfig.cs b/SunshineGameFinder/SunshineAppsConfig.cs index 9b25f42..ea56404 100644 --- a/SunshineGameFinder/SunshineAppsConfig.cs +++ b/SunshineGameFinder/SunshineAppsConfig.cs @@ -1,55 +1,45 @@ -using Newtonsoft.Json; +using System.Text.Json; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using System.Text.Json.Serialization; namespace SunshineGameFinder { + [JsonSourceGenerationOptions(WriteIndented = true)] + [JsonSerializable(typeof(SunshineConfig))] + internal partial class SourceGenerationContext : JsonSerializerContext + { + } public class SunshineApp { public string name { get; set; } - [JsonProperty("image-path")] + [JsonPropertyName("image-path")] public string imagepath { get; set; } public List detached { get; set; } public string output { get; set; } public string cmd { get; set; } - [JsonProperty("working-dir")] + [JsonPropertyName("working-dir")] public string workingdir { get; set; } - [JsonProperty("exclude-global-prep-cmd")] + [JsonPropertyName("exclude-global-prep-cmd")] public bool excludeglobalprepcmd { get; set; } public bool elevated { get; set; } - [JsonProperty("auto-detach")] + [JsonPropertyName("auto-detach")] public bool autodetach { get; set; } - [JsonProperty("wait-all")] + [JsonPropertyName("wait-all")] public bool waitall { get; set; } - [JsonProperty("exit-timeout")] + [JsonPropertyName("exit-timeout")] public int exittimeout { get; set; } = 5; } - public class Env - { - public string PATH { get; set; } - } - public class SunshineConfig { - public SunshineConfig() - { - - } - public SunshineConfig(Env env, List apps) - { - this.env = env; - this.apps = apps; - } - - public Env env { get; set; } public List apps { get; set; } } } diff --git a/SunshineGameFinder/SunshineGameFinder.csproj b/SunshineGameFinder/SunshineGameFinder.csproj index fd72b4b..0e6efdf 100644 --- a/SunshineGameFinder/SunshineGameFinder.csproj +++ b/SunshineGameFinder/SunshineGameFinder.csproj @@ -1,7 +1,7 @@  - true + True Exe net8.0 enable @@ -13,8 +13,9 @@ https://github.com/JMTK/SunshineGameFinder False False - 1.8.0 - 1.8.0 + 1.8.1 + 1.8.1 + true @@ -26,8 +27,8 @@ - +