diff --git a/ProjBobcat/ProjBobcat/Class/Helper/EncodingHelper.cs b/ProjBobcat/ProjBobcat/Class/Helper/EncodingHelper.cs index 2c76c2b..f68498d 100644 --- a/ProjBobcat/ProjBobcat/Class/Helper/EncodingHelper.cs +++ b/ProjBobcat/ProjBobcat/Class/Helper/EncodingHelper.cs @@ -1,10 +1,16 @@ using System.Text; using System; +using System.IO; namespace ProjBobcat.Class.Helper; public static class EncodingHelper { + static EncodingHelper() + { + Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); + } + public static Encoding GuessEncoding(string input) { if (IsUtf8(input)) return Encoding.UTF8; diff --git a/ProjBobcat/ProjBobcat/Class/Helper/GameResourcesResolveHelper.cs b/ProjBobcat/ProjBobcat/Class/Helper/GameResourcesResolveHelper.cs index 6059c44..be1204c 100644 --- a/ProjBobcat/ProjBobcat/Class/Helper/GameResourcesResolveHelper.cs +++ b/ProjBobcat/ProjBobcat/Class/Helper/GameResourcesResolveHelper.cs @@ -56,52 +56,59 @@ public static class GameResourcesResolveHelper bool isEnabled, CancellationToken ct) { - List? model = null; + try + { + List? model = null; - await using var stream = entry.OpenEntryStream(); - var doc = await JsonDocument.ParseAsync(stream, cancellationToken: ct); + await using var stream = entry.OpenEntryStream(); + var doc = await JsonDocument.ParseAsync(stream, cancellationToken: ct); - switch (doc.RootElement.ValueKind) - { - case JsonValueKind.Object: - var val = doc.RootElement.Deserialize(GameModInfoModelContext.Default.GameModInfoModel); + switch (doc.RootElement.ValueKind) + { + case JsonValueKind.Object: + var val = doc.RootElement.Deserialize(GameModInfoModelContext.Default.GameModInfoModel); - if (val != null) model = [val]; + if (val != null) model = [val]; - break; - case JsonValueKind.Array: - model = doc.RootElement.Deserialize(GameModInfoModelContext.Default.ListGameModInfoModel) ?? []; - break; - } + break; + case JsonValueKind.Array: + model = doc.RootElement.Deserialize(GameModInfoModelContext.Default.ListGameModInfoModel) ?? []; + break; + } - if (model == null || model.Count == 0) - return null; + if (model == null || model.Count == 0) + return null; - var authors = new HashSet(); - foreach (var author in model.Where(m => m.AuthorList != null).SelectMany(m => m.AuthorList!)) - authors.Add(author); + var authors = new HashSet(); + foreach (var author in model.Where(m => m.AuthorList != null).SelectMany(m => m.AuthorList!)) + authors.Add(author); - var baseMod = model.FirstOrDefault(m => string.IsNullOrEmpty(m.Parent)); + var baseMod = model.FirstOrDefault(m => string.IsNullOrEmpty(m.Parent)); - if (baseMod == null) - { - baseMod = model.First(); - model.RemoveAt(0); - } - else - { - model.Remove(baseMod); - } + if (baseMod == null) + { + baseMod = model.First(); + model.RemoveAt(0); + } + else + { + model.Remove(baseMod); + } - var authorStr = string.Join(',', authors); - var authorResult = string.IsNullOrEmpty(authorStr) ? null : authorStr; - var modList = model.Where(m => !string.IsNullOrEmpty(m.Name)).Select(m => m.Name!).ToImmutableList(); - var titleResult = string.IsNullOrEmpty(baseMod.Name) ? Path.GetFileName(file) : baseMod.Name; + var authorStr = string.Join(',', authors); + var authorResult = string.IsNullOrEmpty(authorStr) ? null : authorStr; + var modList = model.Where(m => !string.IsNullOrEmpty(m.Name)).Select(m => m.Name!).ToImmutableList(); + var titleResult = string.IsNullOrEmpty(baseMod.Name) ? Path.GetFileName(file) : baseMod.Name; - var displayModel = new GameModResolvedInfo(authorResult, file, modList, titleResult, baseMod.Version, - "Forge *", isEnabled); + var displayModel = new GameModResolvedInfo(authorResult, file, modList, titleResult, baseMod.Version, + "Forge *", isEnabled); - return displayModel; + return displayModel; + } + catch (Exception) + { + return null; + } } static async Task GetFabricModInfo( diff --git a/ProjBobcat/ProjBobcat/Class/Helper/GameVersionHelper.cs b/ProjBobcat/ProjBobcat/Class/Helper/GameVersionHelper.cs index 0af02a3..d93cd9f 100644 --- a/ProjBobcat/ProjBobcat/Class/Helper/GameVersionHelper.cs +++ b/ProjBobcat/ProjBobcat/Class/Helper/GameVersionHelper.cs @@ -20,6 +20,7 @@ public static partial class GameVersionHelper TryGetMcVersionByFabric(version) ?? TryGetMcVersionByOptifine(version) ?? TryGetMcVersionByInheritFrom(version) ?? + TryGetMcVersionByClientVersion(version) ?? TryGetMcVersionById(version); if (string.IsNullOrEmpty(mcVersion)) continue; @@ -31,17 +32,22 @@ public static partial class GameVersionHelper return null; } - private static string TryGetMcVersionById(RawVersionModel version) + static string TryGetMcVersionById(RawVersionModel version) { return version.Id; } - private static string? TryGetMcVersionByInheritFrom(RawVersionModel version) + static string? TryGetMcVersionByClientVersion(RawVersionModel version) + { + return version.ClientVersion; + } + + static string? TryGetMcVersionByInheritFrom(RawVersionModel version) { return version.InheritsFrom; } - private static string? TryGetMcVersionByForgeGameArgs(RawVersionModel version) + static string? TryGetMcVersionByForgeGameArgs(RawVersionModel version) { var gameArgs = version.Arguments?.Game? .Where(arg => arg.ValueKind == JsonValueKind.String) @@ -61,7 +67,7 @@ private static string TryGetMcVersionById(RawVersionModel version) return mcVersion; } - private static string? TryGetMcVersionByFabric(RawVersionModel version) + static string? TryGetMcVersionByFabric(RawVersionModel version) { const string fabricLibPrefix = "net.fabricmc:intermediary:"; @@ -73,7 +79,7 @@ private static string TryGetMcVersionById(RawVersionModel version) return mcVersion; } - private static string? TryGetMcVersionByOptifine(RawVersionModel version) + static string? TryGetMcVersionByOptifine(RawVersionModel version) { const string optifineLibPrefix = "optifine:OptiFine:"; diff --git a/ProjBobcat/ProjBobcat/Class/Model/RawVersionModel.cs b/ProjBobcat/ProjBobcat/Class/Model/RawVersionModel.cs index 7fef66a..2b5d205 100644 --- a/ProjBobcat/ProjBobcat/Class/Model/RawVersionModel.cs +++ b/ProjBobcat/ProjBobcat/Class/Model/RawVersionModel.cs @@ -164,6 +164,12 @@ public class RawVersionModel [JsonPropertyName("id")] public required string Id { get; set; } + /// + /// ClientVersion(Reserved field for other third-party launchers) + /// + [JsonPropertyName("clientVersion")] + public string? ClientVersion { get; set; } + [JsonPropertyName("javaVersion")] public JavaVersionModel? JavaVersion { get; set; } /// diff --git a/ProjBobcat/ProjBobcat/DefaultComponent/LogAnalysis/DefaultLogAnalyzer.cs b/ProjBobcat/ProjBobcat/DefaultComponent/LogAnalysis/DefaultLogAnalyzer.cs index efe4c9d..4ec8ffd 100644 --- a/ProjBobcat/ProjBobcat/DefaultComponent/LogAnalysis/DefaultLogAnalyzer.cs +++ b/ProjBobcat/ProjBobcat/DefaultComponent/LogAnalysis/DefaultLogAnalyzer.cs @@ -133,11 +133,10 @@ static bool IsValidLogFile(FileInfo fi, double minutesAgo = 3) var logType = GetLogFileType(log); if (logType == LogFileType.Unknown) continue; - - var lines = File.ReadAllText(log.FullName); - var encoding = EncodingHelper.GuessEncoding(lines); - - lines = encoding.GetString(encoding.GetBytes(lines)); + + var rawLines = File.ReadAllText(log.FullName); + var encoding = EncodingHelper.GuessEncoding(rawLines); + var lines = File.ReadAllText(log.FullName, encoding); if (lines.Length == 0) continue;