From 45254b00556c37b1c47e25d7f41ed7c28d4ec7e0 Mon Sep 17 00:00:00 2001 From: Timothy Baldridge Date: Mon, 6 Apr 2020 14:48:54 -0600 Subject: [PATCH] No more MessagePack, Json is love, Json is life --- Compression.BSA.Test/BSATests.cs | 6 +- Wabbajack.App.Test/Wabbajack.App.Test.csproj | 2 +- .../BasicServerTests.cs | 2 +- .../UploadedFilesTest.cs | 2 +- .../Wabbajack.BuildServer.Test.csproj | 6 +- .../Controllers/ListValidation.cs | 2 +- .../Controllers/ModlistUpdater.cs | 4 +- .../Controllers/UploadedFiles.cs | 4 +- .../Models/Sql/SqlService.cs | 28 +-- .../Wabbajack.BuildServer.csproj | 10 +- .../Wabbajack.Common.CSP.csproj | 2 +- Wabbajack.Common.Test/SerializationTests.cs | 50 ++++- Wabbajack.Common/Http/Client.cs | 2 +- Wabbajack.Common/Json.cs | 164 ++++++++++----- Wabbajack.Common/MessagePack.cs | 186 ------------------ .../Serialization/Json/JsonNameAttribute.cs | 19 ++ Wabbajack.Common/Utils.cs | 8 +- Wabbajack.Common/Wabbajack.Common.csproj | 3 +- Wabbajack.Launcher/Wabbajack.Launcher.csproj | 2 +- Wabbajack.Lib/ACompiler.cs | 6 +- Wabbajack.Lib/AInstaller.cs | 4 +- Wabbajack.Lib/ClientAPI.cs | 2 +- .../CompilationSteps/Serialization.cs | 22 --- Wabbajack.Lib/Data.cs | 85 ++------ .../Downloaders/AbstractDownloadState.cs | 23 +-- .../Downloaders/AbstractIPS4Downloader.cs | 22 +-- .../Downloaders/BethesdaNetDownloader.cs | 14 +- .../Downloaders/GameFileSourceDownloader.cs | 21 +- .../Downloaders/GoogleDriveDownloader.cs | 11 +- Wabbajack.Lib/Downloaders/HTTPDownloader.cs | 12 +- .../Downloaders/LoversLabDownloader.cs | 7 +- Wabbajack.Lib/Downloaders/MEGADownloader.cs | 4 +- Wabbajack.Lib/Downloaders/ManualDownloader.cs | 15 +- Wabbajack.Lib/Downloaders/ModDBDownloader.cs | 12 +- Wabbajack.Lib/Downloaders/NexusDownloader.cs | 18 +- .../Downloaders/TESAllianceDownloader.cs | 5 +- .../Downloaders/VectorPlexusDownloader.cs | 5 +- .../Downloaders/YouTubeDownloader.cs | 16 +- Wabbajack.Lib/FileUploader/AuthorAPI.cs | 2 +- Wabbajack.Lib/GraphQL/DTOs/UploadedFile.cs | 16 -- Wabbajack.Lib/GraphQL/GraphQLService.cs | 44 ----- Wabbajack.Lib/LibCefHelpers/Init.cs | 2 + Wabbajack.Lib/Manifest.cs | 2 + .../ModListRegistry/ModListMetadata.cs | 6 +- Wabbajack.Lib/NexusApi/NexusApi.cs | 2 +- Wabbajack.Lib/Wabbajack.Lib.csproj | 17 +- Wabbajack.Lib/zEditIntegration.cs | 4 +- Wabbajack.Test/DownloaderTests.cs | 6 +- Wabbajack.Test/Wabbajack.Test.csproj | 10 +- Wabbajack.Test/ZEditIntegrationTests.cs | 4 +- Wabbajack.VirtualFileSystem/VirtualFile.cs | 5 +- Wabbajack/Settings.cs | 2 +- .../View Models/Settings/AuthorFilesVM.cs | 10 - Wabbajack/Wabbajack.csproj | 12 +- 54 files changed, 346 insertions(+), 604 deletions(-) delete mode 100644 Wabbajack.Common/MessagePack.cs create mode 100644 Wabbajack.Common/Serialization/Json/JsonNameAttribute.cs delete mode 100644 Wabbajack.Lib/CompilationSteps/Serialization.cs delete mode 100644 Wabbajack.Lib/GraphQL/DTOs/UploadedFile.cs delete mode 100644 Wabbajack.Lib/GraphQL/GraphQLService.cs diff --git a/Compression.BSA.Test/BSATests.cs b/Compression.BSA.Test/BSATests.cs index afc8cbb0..5456d970 100644 --- a/Compression.BSA.Test/BSATests.cs +++ b/Compression.BSA.Test/BSATests.cs @@ -127,7 +127,7 @@ namespace Compression.BSA.Test TestContext.WriteLine($"Verifying {bsa}"); using var b = BSADispatch.OpenRead(tempFile); TestContext.WriteLine($"Performing A/B tests on {bsa}"); - Assert.Equal(a.State.ToJSON(), b.State.ToJSON()); + Assert.Equal(a.State.ToJson(), b.State.ToJson()); // Check same number of files Assert.Equal(a.Files.Count(), b.Files.Count()); @@ -135,7 +135,7 @@ namespace Compression.BSA.Test await a.Files.Zip(b.Files, (ai, bi) => (ai, bi)) .PMap(Queue, pair => { - Assert.Equal(pair.ai.State.ToJSON(), pair.bi.State.ToJSON()); + Assert.Equal(pair.ai.State.ToJson(), pair.bi.State.ToJson()); //Console.WriteLine($" - {pair.ai.Path}"); Assert.Equal(pair.ai.Path, pair.bi.Path); //Equal(pair.ai.Compressed, pair.bi.Compressed); @@ -154,7 +154,7 @@ namespace Compression.BSA.Test private static T ViaJson(T i) { - return i.ToJSON().FromJSONString(); + return i.ToJson().FromJsonString(); } } diff --git a/Wabbajack.App.Test/Wabbajack.App.Test.csproj b/Wabbajack.App.Test/Wabbajack.App.Test.csproj index 54dde77a..2aa275f0 100644 --- a/Wabbajack.App.Test/Wabbajack.App.Test.csproj +++ b/Wabbajack.App.Test/Wabbajack.App.Test.csproj @@ -7,7 +7,7 @@ - + diff --git a/Wabbajack.BuildServer.Test/BasicServerTests.cs b/Wabbajack.BuildServer.Test/BasicServerTests.cs index d4cf104b..b1f49eea 100644 --- a/Wabbajack.BuildServer.Test/BasicServerTests.cs +++ b/Wabbajack.BuildServer.Test/BasicServerTests.cs @@ -15,7 +15,7 @@ namespace Wabbajack.BuildServer.Test [Fact] public async Task CanGetHeartbeat() { - var heartbeat = (await _client.GetStringAsync(MakeURL("heartbeat"))).FromJSONString(); + var heartbeat = (await _client.GetStringAsync(MakeURL("heartbeat"))).FromJsonString(); Assert.True(TimeSpan.Parse(heartbeat) > TimeSpan.Zero); } diff --git a/Wabbajack.BuildServer.Test/UploadedFilesTest.cs b/Wabbajack.BuildServer.Test/UploadedFilesTest.cs index 60c73f88..6ba59e62 100644 --- a/Wabbajack.BuildServer.Test/UploadedFilesTest.cs +++ b/Wabbajack.BuildServer.Test/UploadedFilesTest.cs @@ -32,7 +32,7 @@ namespace Wabbajack.BuildServer.Test [Fact, Priority(1)] public async Task CanListMyUploadedFiles() { - var result = (await _authedClient.GetStringAsync(MakeURL("uploaded_files/list"))).FromJSONString(); + var result = (await _authedClient.GetStringAsync(MakeURL("uploaded_files/list"))).FromJsonString(); Utils.Log("Loaded: " + result); diff --git a/Wabbajack.BuildServer.Test/Wabbajack.BuildServer.Test.csproj b/Wabbajack.BuildServer.Test/Wabbajack.BuildServer.Test.csproj index 71882a79..df80b607 100644 --- a/Wabbajack.BuildServer.Test/Wabbajack.BuildServer.Test.csproj +++ b/Wabbajack.BuildServer.Test/Wabbajack.BuildServer.Test.csproj @@ -7,13 +7,13 @@ - + - + - + diff --git a/Wabbajack.BuildServer/Controllers/ListValidation.cs b/Wabbajack.BuildServer/Controllers/ListValidation.cs index c57c7215..a3387e13 100644 --- a/Wabbajack.BuildServer/Controllers/ListValidation.cs +++ b/Wabbajack.BuildServer/Controllers/ListValidation.cs @@ -113,7 +113,7 @@ namespace Wabbajack.BuildServer.Controllers { ContentType = "application/json", StatusCode = (int) HttpStatusCode.OK, - Content = lst.ToJSON() + Content = lst.ToJson() }; } diff --git a/Wabbajack.BuildServer/Controllers/ModlistUpdater.cs b/Wabbajack.BuildServer/Controllers/ModlistUpdater.cs index 00566e60..56257a57 100644 --- a/Wabbajack.BuildServer/Controllers/ModlistUpdater.cs +++ b/Wabbajack.BuildServer/Controllers/ModlistUpdater.cs @@ -80,7 +80,7 @@ namespace Wabbajack.BuildServer.Controllers } } - return Ok(new {Save = toSave.ToArray(), Delete = toDelete.ToArray()}.ToJSON(prettyPrint:true)); + return Ok(new {Save = toSave.ToArray(), Delete = toDelete.ToArray()}.ToJson()); } [HttpGet] @@ -154,7 +154,7 @@ namespace Wabbajack.BuildServer.Controllers } }); } - return Ok(newArchive.ToJSON()); + return Ok(newArchive.ToJson()); } private async Task FindAlternatives(NexusDownloader.State state, Hash srcHash) diff --git a/Wabbajack.BuildServer/Controllers/UploadedFiles.cs b/Wabbajack.BuildServer/Controllers/UploadedFiles.cs index 78eb83ad..2429a979 100644 --- a/Wabbajack.BuildServer/Controllers/UploadedFiles.cs +++ b/Wabbajack.BuildServer/Controllers/UploadedFiles.cs @@ -112,7 +112,7 @@ namespace Wabbajack.BuildServer.Controllers } } - return Ok(new {Remain = seen.ToArray(), Deleted = duplicate.ToArray()}.ToJSON(prettyPrint:true)); + return Ok(new {Remain = seen.ToArray(), Deleted = duplicate.ToArray()}.ToJson()); } @@ -204,7 +204,7 @@ namespace Wabbajack.BuildServer.Controllers var user = User.FindFirstValue(ClaimTypes.Name); Utils.Log($"List Uploaded Files {user}"); var files = await SQL.AllUploadedFilesForUser(user); - return Ok(files.OrderBy(f => f.UploadDate).Select(f => f.MungedName ).ToArray().ToJSON(prettyPrint:true)); + return Ok(files.OrderBy(f => f.UploadDate).Select(f => f.MungedName ).ToArray().ToJson()); } [HttpDelete] diff --git a/Wabbajack.BuildServer/Models/Sql/SqlService.cs b/Wabbajack.BuildServer/Models/Sql/SqlService.cs index afb22f7e..41b39d44 100644 --- a/Wabbajack.BuildServer/Models/Sql/SqlService.cs +++ b/Wabbajack.BuildServer/Models/Sql/SqlService.cs @@ -184,8 +184,8 @@ namespace Wabbajack.BuildServer.Model.Models @"INSERT INTO dbo.Jobs (Created, Priority, Payload, OnSuccess) VALUES (GETDATE(), @Priority, @Payload, @OnSuccess)", new { job.Priority, - Payload = job.Payload.ToJSON(), - OnSuccess = job.OnSuccess?.ToJSON() ?? null}); + Payload = job.Payload.ToJson(), + OnSuccess = job.OnSuccess?.ToJson() ?? null}); } /// @@ -201,7 +201,7 @@ namespace Wabbajack.BuildServer.Model.Models new { job.Id, Success = job.Result.ResultType == JobResultType.Success, - ResultPayload = job.Result.ToJSON() + ResultPayload = job.Result.ToJson() }); @@ -258,12 +258,12 @@ namespace Wabbajack.BuildServer.Model.Models { public override void SetValue(IDbDataParameter parameter, AJobPayload value) { - parameter.Value = value.ToJSON(); + parameter.Value = value.ToJson(); } public override AJobPayload Parse(object value) { - return ((string)value).FromJSONString(); + return ((string)value).FromJsonString(); } } @@ -346,7 +346,7 @@ namespace Wabbajack.BuildServer.Model.Models Hash = hash, PrimaryKey = state.PrimaryKeyString, IniState = string.Join("\n", state.GetMetaIni()), - JsonState = state.ToJSON() + JsonState = state.ToJson() }); } @@ -451,7 +451,7 @@ namespace Wabbajack.BuildServer.Model.Models { await using var conn = await Open(); var results = await conn.QueryAsync("SELECT Summary from dbo.ModLists"); - return results.Select(s => s.FromJSONString()).ToList(); + return results.Select(s => s.FromJsonString()).ToList(); } public async Task GetDetailedModlistStatus(string machineUrl) @@ -462,13 +462,13 @@ namespace Wabbajack.BuildServer.Model.Models { machineUrl }); - return result.FromJSONString(); + return result.FromJsonString(); } public async Task> GetDetailedModlistStatuses() { await using var conn = await Open(); var results = await conn.QueryAsync("SELECT DetailedStatus from dbo.ModLists"); - return results.Select(s => s.FromJSONString()).ToList(); + return results.Select(s => s.FromJsonString()).ToList(); } @@ -523,7 +523,7 @@ namespace Wabbajack.BuildServer.Model.Models new {Hash = startingHash}); return result == null ? null : new Archive { - State = result.FromJSONString(), + State = result.FromJsonString(), Hash = startingHash }; } @@ -535,7 +535,7 @@ namespace Wabbajack.BuildServer.Model.Models new {PrimaryKey = primaryKey}); return result == default ? null : new Archive { - State = result.State.FromJSONString(), + State = result.State.FromJsonString(), Hash = Hash.FromLong(result.Hash) }; } @@ -604,9 +604,9 @@ namespace Wabbajack.BuildServer.Model.Models new { MachineUrl = dto.Metadata.Links.MachineURL, - Metadata = dto.Metadata.ToJSON(), - Summary = dto.Summary.ToJSON(), - DetailedStatus = dto.DetailedStatus.ToJSON() + Metadata = dto.Metadata.ToJson(), + Summary = dto.Summary.ToJson(), + DetailedStatus = dto.DetailedStatus.ToJson() }); } diff --git a/Wabbajack.BuildServer/Wabbajack.BuildServer.csproj b/Wabbajack.BuildServer/Wabbajack.BuildServer.csproj index ac530c15..3c0d447b 100644 --- a/Wabbajack.BuildServer/Wabbajack.BuildServer.csproj +++ b/Wabbajack.BuildServer/Wabbajack.BuildServer.csproj @@ -16,10 +16,10 @@ - - - - + + + + @@ -28,7 +28,7 @@ - + diff --git a/Wabbajack.Common.CSP/Wabbajack.Common.CSP.csproj b/Wabbajack.Common.CSP/Wabbajack.Common.CSP.csproj index d70d3890..622e38a9 100644 --- a/Wabbajack.Common.CSP/Wabbajack.Common.CSP.csproj +++ b/Wabbajack.Common.CSP/Wabbajack.Common.CSP.csproj @@ -6,7 +6,7 @@ win10-x64 - + diff --git a/Wabbajack.Common.Test/SerializationTests.cs b/Wabbajack.Common.Test/SerializationTests.cs index 3ff0d81e..0706cb77 100644 --- a/Wabbajack.Common.Test/SerializationTests.cs +++ b/Wabbajack.Common.Test/SerializationTests.cs @@ -1,5 +1,8 @@ using System.IO; +using System.Text.Json.Serialization; using System.Threading.Tasks; +using Newtonsoft.Json.Converters; +using Wabbajack.Common.Serialization.Json; using Xunit; namespace Wabbajack.Common.Test @@ -51,23 +54,52 @@ namespace Wabbajack.Common.Test await RoundTrips(new FullPath((AbsolutePath)@"c:\")); } + + class Base + { + public int BaseNumber { get; set; } + } + + [JsonName("ChildA")] + class ChildA : Base + { + public int ChildANumber { get; set; } + } + + [JsonName("ChildB")] + class ChildB : ChildA + { + public int ChildBNumber { get; set; } + } + + + [Fact] + public async Task JsonSerializationUser() + { + var start = new ChildB {BaseNumber = 1, ChildANumber = 2, ChildBNumber = 3}; + + var result = (ChildB)start.ToJson().FromJsonString(); + + Utils.Log(start.ToJson()); + + Assert.Equal(start.BaseNumber, result.BaseNumber); + Assert.Equal(start.ChildANumber, result.ChildANumber); + Assert.Equal(start.ChildBNumber, result.ChildBNumber); + + Assert.DoesNotContain("Wabbajack.Common.Test.Serialization", start.ToJson()); + + + } + private static async Task RoundTrips(T input) { Assert.Equal(input, RoundTripJson(input)); - Assert.Equal(input, await RoundTripMessagePack(input)); } private static T RoundTripJson(T input) { - return input.ToJSON().FromJSONString(); + return input.ToJson().FromJsonString(); } - private static async Task RoundTripMessagePack(T input) - { - await using var ms = new MemoryStream(); - await ms.WriteAsMessagePackAsync(input); - ms.Position = 0; - return await ms.ReadAsMessagePackAsync(); - } } } diff --git a/Wabbajack.Common/Http/Client.cs b/Wabbajack.Common/Http/Client.cs index fed539f2..03cd7b88 100644 --- a/Wabbajack.Common/Http/Client.cs +++ b/Wabbajack.Common/Http/Client.cs @@ -102,7 +102,7 @@ namespace Wabbajack.Common.Http public async Task GetJsonAsync(string s) { var result = await GetStringAsync(s); - return result.FromJSONString(); + return result.FromJsonString(); } } } diff --git a/Wabbajack.Common/Json.cs b/Wabbajack.Common/Json.cs index f8bb69c1..d4cc15c7 100644 --- a/Wabbajack.Common/Json.cs +++ b/Wabbajack.Common/Json.cs @@ -1,8 +1,14 @@ using System; using System.Collections.Generic; +using System.ComponentModel; using System.IO; +using System.Linq; +using System.Reflection; using System.Text; +using System.Threading.Tasks; using Newtonsoft.Json; +using Newtonsoft.Json.Serialization; +using Wabbajack.Common.Serialization.Json; using File = Alphaleonis.Win32.Filesystem.File; namespace Wabbajack.Common @@ -19,70 +25,56 @@ namespace Wabbajack.Common new GameConverter(), new PercentConverter(), }; + + public static JsonSerializerSettings JsonSettings => + new JsonSerializerSettings { + TypeNameHandling = TypeNameHandling.Objects, + SerializationBinder = new JsonNameSerializationBinder(), + Converters = Converters}; + - public static void ToJSON(this T obj, string filename) + public static void ToJson(this T obj, string filename) { if (File.Exists(filename)) File.Delete(filename); - File.WriteAllText(filename, - JsonConvert.SerializeObject(obj, Formatting.Indented, - new JsonSerializerSettings {TypeNameHandling = TypeNameHandling.Auto, Converters = Converters})); + File.WriteAllText(filename, JsonConvert.SerializeObject(obj, Formatting.Indented, JsonSettings)); } - - public static string ToJSON(this T obj, - TypeNameHandling handling = TypeNameHandling.All, - TypeNameAssemblyFormatHandling format = TypeNameAssemblyFormatHandling.Full, - bool prettyPrint = false) + + public static void ToJson(this T obj, Stream stream) { - return JsonConvert.SerializeObject(obj, Formatting.Indented, - new JsonSerializerSettings - { - TypeNameHandling = handling, - TypeNameAssemblyFormatHandling = format, - Formatting = prettyPrint ? Formatting.Indented : Formatting.None, - Converters = Converters - }); + using var tw = new StreamWriter(stream, Encoding.UTF8, leaveOpen: true); + using var writer = new JsonTextWriter(tw); + var ser = JsonSerializer.Create(JsonSettings); + ser.Serialize(writer, obj); } - public static T FromJSON(this AbsolutePath filename, + public static string ToJson(this T obj) + { + return JsonConvert.SerializeObject(obj, JsonSettings); + } + + public static T FromJson(this AbsolutePath filename, TypeNameHandling handling = TypeNameHandling.All, TypeNameAssemblyFormatHandling format = TypeNameAssemblyFormatHandling.Full) { - return JsonConvert.DeserializeObject(filename.ReadAllText(), - new JsonSerializerSettings - { - TypeNameHandling = handling, TypeNameAssemblyFormatHandling = format, Converters = Converters - })!; + return JsonConvert.DeserializeObject(filename.ReadAllText(), JsonSettings)!; } - public static T FromJSONString(this string data, - TypeNameHandling handling = TypeNameHandling.All, + public static T FromJsonString(this string data, + TypeNameHandling handling = TypeNameHandling.Objects, TypeNameAssemblyFormatHandling format = TypeNameAssemblyFormatHandling.Full) { - return JsonConvert.DeserializeObject(data, - new JsonSerializerSettings - { - TypeNameHandling = handling, TypeNameAssemblyFormatHandling = format, Converters = Converters - })!; + return JsonConvert.DeserializeObject(data, JsonSettings)!; } - public static T FromJSON(this Stream data) + public static T FromJson(this Stream stream) { - var s = Encoding.UTF8.GetString(data.ReadAll()); - try - { - return JsonConvert.DeserializeObject(s, - new JsonSerializerSettings {TypeNameHandling = TypeNameHandling.Auto, Converters = Converters})!; - } - catch (JsonSerializationException) - { - var error = JsonConvert.DeserializeObject(s, - new JsonSerializerSettings {TypeNameHandling = TypeNameHandling.Auto}); - if (error != null) - Log($"Exception while deserializing\nError code: {error.code}\nError message: {error.message}"); - throw; - } + using var tr = new StreamReader(stream, Encoding.UTF8, leaveOpen: true); + using var reader = new JsonTextReader(tr); + var ser = JsonSerializer.Create(JsonSettings); + return ser.Deserialize(reader); } + private class HashJsonConverter : JsonConverter @@ -237,5 +229,87 @@ namespace Wabbajack.Common return game.Game; } } + + + + public class JsonNameSerializationBinder : ISerializationBinder + { + private Dictionary _nameToType; + private Dictionary _typeToName; + + public JsonNameSerializationBinder() + { + var customDisplayNameTypes = + AppDomain.CurrentDomain + .GetAssemblies() + .Where(a => a.FullName != null && a.FullName.StartsWith("Wabbajack")) + .SelectMany(a => + { + try + { + return a.GetTypes(); + } + catch (ReflectionTypeLoadException) + { + return new Type[0]; + } + }) + //concat with references if desired + .Where(x => x + .GetCustomAttributes(false) + .Any(y => y is JsonNameAttribute)); + + _nameToType = customDisplayNameTypes.ToDictionary( + t => t.GetCustomAttributes(false).OfType().First().Name, + t => t); + + _typeToName = _nameToType.ToDictionary( + t => t.Value, + t => t.Key); + + } + + public Type BindToType(string? assemblyName, string typeName) + { + if (typeName.EndsWith("[]")) + { + var result = BindToType(assemblyName, typeName.Substring(0, typeName.Length - 2)); + return result.MakeArrayType(); + } + + if (_nameToType.ContainsKey(typeName)) + return _nameToType[typeName]; + + var val = Type.GetType(typeName); + if (val != null) + return val; + + if (assemblyName != null) + { + var assembly = AppDomain.CurrentDomain.Load(assemblyName); + if (assembly != null) + { + var result = assembly.GetType(typeName); + if (result != null) return result; + } + } + + + throw new InvalidDataException($"No Binding name for {typeName}"); + } + + public void BindToName(Type serializedType, out string? assemblyName, out string? typeName) + { + if (!_typeToName.ContainsKey(serializedType)) + { + throw new InvalidDataException($"No Binding name for {serializedType}"); + } + + var name = _typeToName[serializedType]; + + assemblyName = null; + typeName = name; + } + } } } diff --git a/Wabbajack.Common/MessagePack.cs b/Wabbajack.Common/MessagePack.cs deleted file mode 100644 index 08a7a5cc..00000000 --- a/Wabbajack.Common/MessagePack.cs +++ /dev/null @@ -1,186 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Text; -using System.Threading.Tasks; -using MessagePack; -using MessagePack.Formatters; -using MessagePack.Resolvers; - -namespace Wabbajack.Common -{ - public partial class Utils - { - private static MessagePackSerializerOptions? _messagePackOptions; - private static IFormatterResolver? _resolver; - - private static void MessagePackInit() - { - _resolver = CompositeResolver.Create( - new List - { - new HashFormatter(), - new RelativePathFormatter(), - new AbsolutePathFormatter(), - new HashRelativePathFormatter(), - new FullPathFormatter() - }, - new List {StandardResolver.Instance} - ); - _messagePackOptions = MessagePackSerializerOptions.Standard - .WithResolver(_resolver) - .WithCompression(MessagePackCompression.Lz4BlockArray); - - } - - /// - /// Writes a object to this stream using MessagePack - /// - /// - /// - /// - public static async Task WriteAsMessagePackAsync(this Stream stream, T obj) - { - await MessagePackSerializer.SerializeAsync(stream, obj, _messagePackOptions); - } - - /// - /// Writes a object to this stream using MessagePack - /// - /// - /// - /// - public static void WriteAsMessagePack(this Stream stream, T obj) - { - MessagePackSerializer.Serialize(stream, obj, _messagePackOptions); - } - - /// - /// Reads a object from this stream using MessagePack - /// - /// - /// - /// - public static async Task ReadAsMessagePackAsync(this Stream stream) - { - return await MessagePackSerializer.DeserializeAsync(stream, _messagePackOptions); - } - - - /// - /// Reads a object from this stream using MessagePack - /// - /// - /// - /// - public static T ReadAsMessagePack(this Stream stream) - { - return MessagePackSerializer.Deserialize(stream, _messagePackOptions); - } - - - } - - #region Formatters - - public class HashFormatter : IMessagePackFormatter - { - public void Serialize(ref MessagePackWriter writer, Hash value, MessagePackSerializerOptions options) - { - writer.WriteUInt64((ulong)value); - } - - public Hash Deserialize(ref MessagePackReader reader, MessagePackSerializerOptions options) - { - return new Hash(reader.ReadUInt64()); - } - } - - public class RelativePathFormatter : IMessagePackFormatter - { - public void Serialize(ref MessagePackWriter writer, RelativePath value, MessagePackSerializerOptions options) - { - if (value == default) - { - writer.WriteString(new byte[0]); - return; - } - - var encoded = Encoding.UTF8.GetBytes((string)value); - writer.WriteString(encoded); - } - - public RelativePath Deserialize(ref MessagePackReader reader, MessagePackSerializerOptions options) - { - return (RelativePath)reader.ReadString(); - } - } - - public class AbsolutePathFormatter : IMessagePackFormatter - { - public void Serialize(ref MessagePackWriter writer, AbsolutePath value, MessagePackSerializerOptions options) - { - var encoded = Encoding.UTF8.GetBytes((string)value); - writer.WriteString(encoded); - } - - public AbsolutePath Deserialize(ref MessagePackReader reader, MessagePackSerializerOptions options) - { - return (AbsolutePath)reader.ReadString(); - } - } - - public class HashRelativePathFormatter : IMessagePackFormatter - { - public void Serialize(ref MessagePackWriter writer, HashRelativePath value, MessagePackSerializerOptions options) - { - writer.WriteArrayHeader(value.Paths.Length + 1); - writer.WriteUInt64((ulong)value.BaseHash); - foreach (var path in value.Paths) - { - var encoded = Encoding.UTF8.GetBytes((string)path); - writer.WriteString(encoded); - } - } - - public HashRelativePath Deserialize(ref MessagePackReader reader, MessagePackSerializerOptions options) - { - var header = reader.ReadArrayHeader(); - var hash = Hash.FromULong(reader.ReadUInt64()); - var paths = new RelativePath[header - 1]; - for (int idx = 0; idx < header - 1; idx += 1) - { - paths[idx] = (RelativePath)reader.ReadString(); - } - return new HashRelativePath(hash, paths); - } - } - - public class FullPathFormatter : IMessagePackFormatter - { - public void Serialize(ref MessagePackWriter writer, FullPath value, MessagePackSerializerOptions options) - { - writer.WriteArrayHeader(value.Paths.Length + 1); - writer.WriteString(Encoding.UTF8.GetBytes((string)value.Base)); - foreach (var path in value.Paths) - { - var encoded = Encoding.UTF8.GetBytes((string)path); - writer.WriteString(encoded); - } - } - - public FullPath Deserialize(ref MessagePackReader reader, MessagePackSerializerOptions options) - { - var header = reader.ReadArrayHeader(); - var basePath = (AbsolutePath)reader.ReadString(); - var paths = new RelativePath[header - 1]; - for (int idx = 0; idx < header - 1; idx += 1) - { - paths[idx] = (RelativePath)reader.ReadString(); - } - return new FullPath(basePath, paths); - } - } - - #endregion -} diff --git a/Wabbajack.Common/Serialization/Json/JsonNameAttribute.cs b/Wabbajack.Common/Serialization/Json/JsonNameAttribute.cs new file mode 100644 index 00000000..8161d0bf --- /dev/null +++ b/Wabbajack.Common/Serialization/Json/JsonNameAttribute.cs @@ -0,0 +1,19 @@ +using System; + +namespace Wabbajack.Common.Serialization.Json +{ + /// + /// Defines the polymorphic name of this type when serialized via Json. This value will + /// be stored in the "_wjType" field. + /// + public class JsonNameAttribute : Attribute + { + public string Name { get; } + + public JsonNameAttribute(string name) + { + Name = name; + } + + } +} diff --git a/Wabbajack.Common/Utils.cs b/Wabbajack.Common/Utils.cs index 28d4778d..72332edc 100644 --- a/Wabbajack.Common/Utils.cs +++ b/Wabbajack.Common/Utils.cs @@ -59,7 +59,6 @@ namespace Wabbajack.Common Consts.LocalAppDataPath.CreateDirectory(); Consts.LogsFolder.CreateDirectory(); - MessagePackInit(); _startTime = DateTime.Now; if (LogFile.Exists) @@ -832,7 +831,8 @@ namespace Wabbajack.Common /// public static T ViaJSON(this T tv) { - return tv.ToJSON().FromJSONString(); + var json = tv.ToJson(); + return json.FromJsonString(); } /* @@ -999,14 +999,14 @@ namespace Wabbajack.Common /// public static void ToEcryptedJson(this T data, string key) { - var bytes = Encoding.UTF8.GetBytes(data.ToJSON()); + var bytes = Encoding.UTF8.GetBytes(data.ToJson()); bytes.ToEcryptedData(key); } public static T FromEncryptedJson(string key) { var decoded = FromEncryptedData(key); - return Encoding.UTF8.GetString(decoded).FromJSONString(); + return Encoding.UTF8.GetString(decoded).FromJsonString(); } diff --git a/Wabbajack.Common/Wabbajack.Common.csproj b/Wabbajack.Common/Wabbajack.Common.csproj index eb43a78f..7ff53fbc 100644 --- a/Wabbajack.Common/Wabbajack.Common.csproj +++ b/Wabbajack.Common/Wabbajack.Common.csproj @@ -28,11 +28,10 @@ - - + diff --git a/Wabbajack.Launcher/Wabbajack.Launcher.csproj b/Wabbajack.Launcher/Wabbajack.Launcher.csproj index be8b296c..768f476f 100644 --- a/Wabbajack.Launcher/Wabbajack.Launcher.csproj +++ b/Wabbajack.Launcher/Wabbajack.Launcher.csproj @@ -26,7 +26,7 @@ - + \ No newline at end of file diff --git a/Wabbajack.Lib/ACompiler.cs b/Wabbajack.Lib/ACompiler.cs index 11795f83..e368db17 100644 --- a/Wabbajack.Lib/ACompiler.cs +++ b/Wabbajack.Lib/ACompiler.cs @@ -139,7 +139,7 @@ namespace Wabbajack.Lib ModList.ReadmeIsWebsite = ReadmeIsWebsite; using (var of = ModListOutputFolder.Combine("modlist").Create()) - of.WriteAsMessagePack(ModList); + ModList.ToJson(of); ModListOutputFile.Delete(); @@ -191,7 +191,7 @@ namespace Wabbajack.Lib NumberOfInstalledFiles = ModList.Directives.Count, SizeOfInstalledFiles = ModList.Directives.Sum(a => a.Size) }; - metadata.ToJSON(ModListOutputFile + ".meta.json"); + metadata.ToJson(ModListOutputFile + ".meta.json"); Utils.Log("Removing ModList staging folder"); @@ -201,7 +201,7 @@ namespace Wabbajack.Lib public void GenerateManifest() { var manifest = new Manifest(ModList); - manifest.ToJSON(ModListOutputFile + ".manifest.json"); + manifest.ToJson(ModListOutputFile + ".manifest.json"); } public async Task GatherArchives() diff --git a/Wabbajack.Lib/AInstaller.cs b/Wabbajack.Lib/AInstaller.cs index 6f20a21e..497ffd33 100644 --- a/Wabbajack.Lib/AInstaller.cs +++ b/Wabbajack.Lib/AInstaller.cs @@ -79,10 +79,10 @@ namespace Wabbajack.Lib { entry = ar.GetEntry("modlist.json"); using (var e = entry.Open()) - return e.FromJSON(); + return e.FromJson(); } using (var e = entry.Open()) - return e.ReadAsMessagePack(); + return e.FromJson(); } /// diff --git a/Wabbajack.Lib/ClientAPI.cs b/Wabbajack.Lib/ClientAPI.cs index 67fd70fb..7c562d97 100644 --- a/Wabbajack.Lib/ClientAPI.cs +++ b/Wabbajack.Lib/ClientAPI.cs @@ -18,7 +18,7 @@ namespace Wabbajack.Lib { using var response = await GetClient() .GetAsync($"https://{Consts.WabbajackCacheHostname}/alternative/{hash.ToHex()}"); - return !response.IsSuccessStatusCode ? null : (await response.Content.ReadAsStringAsync()).FromJSONString(); + return !response.IsSuccessStatusCode ? null : (await response.Content.ReadAsStringAsync()).FromJsonString(); } /// diff --git a/Wabbajack.Lib/CompilationSteps/Serialization.cs b/Wabbajack.Lib/CompilationSteps/Serialization.cs deleted file mode 100644 index 2aff7668..00000000 --- a/Wabbajack.Lib/CompilationSteps/Serialization.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System.Collections.Generic; -using System.Linq; -using Newtonsoft.Json; -using Wabbajack.Common; - -namespace Wabbajack.Lib.CompilationSteps -{ - public static class Serialization - { - public static string Serialize(IEnumerable stack) - { - return stack.Select(s => s.GetState()).ToList() - .ToJSON(TypeNameHandling.Auto, TypeNameAssemblyFormatHandling.Simple); - } - - public static List Deserialize(string stack, ACompiler compiler) - { - return stack.FromJSONString>(TypeNameHandling.Auto, TypeNameAssemblyFormatHandling.Simple) - .Select(s => s.CreateStep(compiler)).ToList(); - } - } -} \ No newline at end of file diff --git a/Wabbajack.Lib/Data.cs b/Wabbajack.Lib/Data.cs index 629ee077..c48e75ac 100644 --- a/Wabbajack.Lib/Data.cs +++ b/Wabbajack.Lib/Data.cs @@ -3,8 +3,9 @@ using System.Collections.Generic; using System.IO; using System.Linq; using Compression.BSA; -using MessagePack; +using Newtonsoft.Json; using Wabbajack.Common; +using Wabbajack.Common.Serialization.Json; using Wabbajack.Lib.Downloaders; using Wabbajack.VirtualFileSystem; @@ -36,122 +37,98 @@ namespace Wabbajack.Lib } } - [MessagePackObject] + [JsonName("ModList")] public class ModList { /// /// Archives required by this modlist /// - [Key(0)] public List Archives; /// /// Author of the ModList /// - [Key(1)] public string Author; /// /// Description of the ModList /// - [Key(2)] public string Description; /// /// Install directives /// - [Key(3)] public List Directives; /// /// The game variant to which this game applies /// - [Key(4)] public Game GameType; /// /// Hash of the banner-image /// - [Key(5)] public RelativePath Image; /// /// The Mod Manager used to create the modlist /// - [Key(6)] public ModManager ModManager; /// /// Name of the ModList /// - [Key(7)] public string Name; /// /// readme path or website /// - [Key(8)] public string Readme; /// /// Whether readme is a website /// - [Key(9)] public bool ReadmeIsWebsite; /// /// The build version of Wabbajack used when compiling the Modlist /// - [Key(10)] public Version WabbajackVersion; /// /// Website of the ModList /// - [Key(11)] public Uri Website; /// /// The size of all the archives once they're downloaded /// - [IgnoreMember] + [JsonIgnore] public long DownloadSize => Archives.Sum(a => a.Size); /// /// The size of all the files once they are installed (excluding downloaded archives) /// - [IgnoreMember] + [JsonIgnore] public long InstallSize => Directives.Sum(s => s.Size); public ModList Clone() { using var ms = new MemoryStream(); - ms.WriteAsMessagePack(this); + this.ToJson(ms); ms.Position = 0; - return ms.ReadAsMessagePack(); + return ms.FromJson(); } } - [MessagePackObject] - [Union(0, typeof(ArchiveMeta))] - [Union(1, typeof(CreateBSA))] - [Union(2, typeof(FromArchive))] - [Union(3, typeof(MergedPatch))] - [Union(4, typeof(InlineFile))] - [Union(5, typeof(PatchedFromArchive))] - [Union(6, typeof(RemappedInlineFile))] - [Union(7, typeof(CleanedESM))] public abstract class Directive { - [Key(0)] public Hash Hash { get; set; } - [Key(1)] public long Size { get; set; } /// /// location the file will be copied to, relative to the install path. /// - [Key(2)] public RelativePath To { get; set; } } @@ -164,20 +141,18 @@ namespace Wabbajack.Lib { } - [MessagePackObject] + [JsonName("InlineFile")] public class InlineFile : Directive { /// /// Data that will be written as-is to the destination location; /// - [Key(3)] public RelativePath SourceDataID { get; set; } } - [MessagePackObject] + [JsonName("ArchiveMeta")] public class ArchiveMeta : Directive { - [Key(3)] public RelativePath SourceDataID { get; set; } } @@ -186,117 +161,99 @@ namespace Wabbajack.Lib /// /// File meant to be extracted before the installation /// - [MessagePackObject] + [JsonName("PropertyFile")] public class PropertyFile : InlineFile { - [Key(4)] public PropertyType Type; } - [MessagePackObject] + [JsonName("CleanedESM")] public class CleanedESM : InlineFile { - [Key(4)] public Hash SourceESMHash; } /// /// A file that has the game and MO2 folders remapped on installation /// - [MessagePackObject] + [JsonName("RemappedInlineFile")] public class RemappedInlineFile : InlineFile { } - [MessagePackObject] + [JsonName("SteamMeta")] public class SteamMeta : ArchiveMeta { - [Key(4)] public int ItemID { get; set; } } - [MessagePackObject] + [JsonName("FromArchive")] public class FromArchive : Directive { private string _fullPath; - [Key(3)] public HashRelativePath ArchiveHashPath { get; set; } - [IgnoreMember] + [JsonIgnore] public VirtualFile FromFile { get; set; } - [IgnoreMember] + [JsonIgnore] public string FullPath => _fullPath ??= string.Join("|", ArchiveHashPath); } - [MessagePackObject] + [JsonName("CreateBSA")] public class CreateBSA : Directive { - [Key(3)] public RelativePath TempID { get; set; } - [Key(4)] public ArchiveStateObject State { get; set; } - [Key(5)] public List FileStates { get; set; } } - [MessagePackObject] + [JsonName("PatchedFromArchive")] public class PatchedFromArchive : FromArchive { - [Key(4)] public Hash FromHash { get; set; } /// /// The file to apply to the source file to patch it /// - [Key(5)] public RelativePath PatchID { get; set; } } - [MessagePackObject] + [JsonName("SourcePatch")] public class SourcePatch { - [Key(0)] public Hash Hash { get; set; } - [Key(1)] public RelativePath RelativePath { get; set; } } - [MessagePackObject] + [JsonName("MergedPatch")] public class MergedPatch : Directive { - [Key(3)] public RelativePath PatchID { get; set; } - [Key(4)] public List Sources { get; set; } } - [MessagePackObject] + [JsonName("Archive")] public class Archive { /// /// xxHash64 of the archive /// - [Key(0)] public Hash Hash { get; set; } /// /// Meta INI for the downloaded archive /// - [Key(1)] public string Meta { get; set; } /// /// Human friendly name of this archive /// - [Key(2)] public string Name { get; set; } - [Key(3)] public long Size { get; set; } - [Key(4)] public AbstractDownloadState State { get; set; } } diff --git a/Wabbajack.Lib/Downloaders/AbstractDownloadState.cs b/Wabbajack.Lib/Downloaders/AbstractDownloadState.cs index 3942351c..a744ed97 100644 --- a/Wabbajack.Lib/Downloaders/AbstractDownloadState.cs +++ b/Wabbajack.Lib/Downloaders/AbstractDownloadState.cs @@ -2,8 +2,7 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; -using Alphaleonis.Win32.Filesystem; -using MessagePack; +using Newtonsoft.Json; using Wabbajack.Common; using Wabbajack.Lib.Validation; @@ -22,22 +21,6 @@ namespace Wabbajack.Lib.Downloaders Task LoadMetaData(); } - [MessagePackObject] - [Union(0, typeof(HTTPDownloader.State))] - [Union(1, typeof(GameFileSourceDownloader.State))] - [Union(2, typeof(GoogleDriveDownloader.State))] - [Union(3, typeof(LoversLabDownloader.State))] - [Union(4, typeof(ManualDownloader.State))] - [Union(5, typeof(MediaFireDownloader.State))] - [Union(6, typeof(MegaDownloader.State))] - [Union(7, typeof(ModDBDownloader.State))] - [Union(8, typeof(NexusDownloader.State))] - [Union(9, typeof(SteamWorkshopDownloader.State))] - [Union(10, typeof(VectorPlexusDownloader.State))] - [Union(11, typeof(AFKModsDownloader.State))] - [Union(12, typeof(TESAllianceDownloader.State))] - [Union(13, typeof(BethesdaNetDownloader.State))] - [Union(14, typeof(YouTubeDownloader.State))] public abstract class AbstractDownloadState { @@ -69,10 +52,10 @@ namespace Wabbajack.Lib.Downloaders TypeToName = NameToType.ToDictionary(k => k.Value, k => k.Key); } - [IgnoreMember] + [JsonIgnore] public abstract object[] PrimaryKey { get; } - [IgnoreMember] + [JsonIgnore] public string PrimaryKeyString { get diff --git a/Wabbajack.Lib/Downloaders/AbstractIPS4Downloader.cs b/Wabbajack.Lib/Downloaders/AbstractIPS4Downloader.cs index 601151e5..67f0f498 100644 --- a/Wabbajack.Lib/Downloaders/AbstractIPS4Downloader.cs +++ b/Wabbajack.Lib/Downloaders/AbstractIPS4Downloader.cs @@ -5,12 +5,9 @@ using System.Net; using System.Text.RegularExpressions; using System.Threading.Tasks; using System.Web; -using HtmlAgilityPack; -using MessagePack; using Newtonsoft.Json; using Wabbajack.Common; using Wabbajack.Lib.Validation; -using File = System.IO.File; namespace Wabbajack.Lib.Downloaders { @@ -74,47 +71,34 @@ namespace Wabbajack.Lib.Downloaders } - [MessagePackObject] public class State : AbstractDownloadState, IMetaState where TStateDownloader : IDownloader { - [Key(0)] public string FullURL { get; set; } - [Key(1)] public bool IsAttachment { get; set; } - [Key(2)] public string FileID { get; set; } - [Key(3)] public string FileName { get; set; } // from IMetaState - [Key(4)] - public Uri URL => new Uri($"{Site}/files/file/{FileName}"); - [Key(5)] public string Name { get; set; } - [Key(6)] public string Author { get; set; } - [Key(7)] public string Version { get; set; } - [Key(8)] public string ImageURL { get; set; } - [Key(9)] public virtual bool IsNSFW { get; set; } - [Key(10)] public string Description { get; set; } private static bool IsHTTPS => Downloader.SiteURL.AbsolutePath.StartsWith("https://"); private static string URLPrefix => IsHTTPS ? "https://" : "http://"; - [IgnoreMember] + [JsonIgnore] public static string Site => string.IsNullOrWhiteSpace(Downloader.SiteURL.Query) ? $"{URLPrefix}{Downloader.SiteURL.Host}" : Downloader.SiteURL.ToString(); public static AbstractNeedsLoginDownloader Downloader => (AbstractNeedsLoginDownloader)(object)DownloadDispatcher.GetInstance(); - [IgnoreMember] + [JsonIgnore] public override object[] PrimaryKey { get @@ -183,7 +167,7 @@ namespace Wabbajack.Lib.Downloaders return await streamResult.Content.ReadAsStreamAsync(); // Sometimes LL hands back a json object telling us to wait until a certain time - var times = (await streamResult.Content.ReadAsStringAsync()).FromJSONString(); + var times = (await streamResult.Content.ReadAsStringAsync()).FromJsonString(); var secs = times.Download - times.CurrentTime; for (int x = 0; x < secs; x++) { diff --git a/Wabbajack.Lib/Downloaders/BethesdaNetDownloader.cs b/Wabbajack.Lib/Downloaders/BethesdaNetDownloader.cs index 25d7a4eb..c05d4ed1 100644 --- a/Wabbajack.Lib/Downloaders/BethesdaNetDownloader.cs +++ b/Wabbajack.Lib/Downloaders/BethesdaNetDownloader.cs @@ -10,6 +10,7 @@ using System.Reactive; using System.Reactive.Linq; using System.Reflection; using System.Text; +using System.Text.Json.Serialization; using System.Threading.Tasks; using System.Windows.Input; using Newtonsoft.Json.Linq; @@ -18,6 +19,7 @@ using Org.BouncyCastle.Crypto.Parameters; using Org.BouncyCastle.Security; using ReactiveUI; using Wabbajack.Common; +using Wabbajack.Common.Serialization.Json; using Wabbajack.Lib.Validation; using File = Alphaleonis.Win32.Filesystem.File; using Game = Wabbajack.Common.Game; @@ -90,7 +92,7 @@ namespace Wabbajack.Lib.Downloaders try { - var result = last_line.FromJSONString(); + var result = last_line.FromJsonString(); result.ToEcryptedJson(DataName); return result; } @@ -113,10 +115,14 @@ namespace Wabbajack.Lib.Downloaders public Uri SiteURL => new Uri("https://bethesda.net"); public Uri IconUri { get; } + + [JsonName("BethesdaNetDownloader")] public class State : AbstractDownloadState { public string GameName { get; set; } public string ContentId { get; set; } + + [JsonIgnore] public override object[] PrimaryKey => new object[] {GameName, ContentId}; public override bool IsWhitelisted(ServerWhitelist whitelist) @@ -210,7 +216,7 @@ namespace Wabbajack.Lib.Downloaders var posted = await client.PostAsync("https://api.bethesda.net/beam/accounts/external_login", new StringContent(login_info.body, Encoding.UTF8, "application/json")); - info.AccessToken = (await posted.Content.ReadAsStringAsync()).FromJSONString().access_token; + info.AccessToken = (await posted.Content.ReadAsStringAsync()).FromJsonString().access_token; client.Headers.Add(("x-cdp-app", "UGC SDK")); client.Headers.Add(("x-cdp-app-ver", "0.9.11314/debug")); @@ -220,7 +226,7 @@ namespace Wabbajack.Lib.Downloaders posted = await client.PostAsync("https://api.bethesda.net/cdp-user/auth", new StringContent("{\"access_token\": \"" + info.AccessToken + "\"}", Encoding.UTF8, "application/json")); - info.CDPToken = (await posted.Content.ReadAsStringAsync()).FromJSONString().token; + info.CDPToken = (await posted.Content.ReadAsStringAsync()).FromJsonString().token; client.Headers.Add(("X-Access-Token", info.AccessToken)); var got = await client.GetAsync($"https://api.bethesda.net/mods/ugc-workshop/content/get?content_id={ContentId}"); @@ -238,7 +244,7 @@ namespace Wabbajack.Lib.Downloaders got = await client.GetAsync( $"https://api.bethesda.net/cdp-user/projects/{info.CDPProductId}/branches/{info.CDPBranchId}/tree/.json"); - var tree = (await got.Content.ReadAsStringAsync()).FromJSONString(); + var tree = (await got.Content.ReadAsStringAsync()).FromJsonString(); got.Dispose(); got = await client.PostAsync($"https://api.bethesda.net/mods/ugc-content/add-subscription", new StringContent($"{{\"content_id\": \"{ContentId}\"}}", Encoding.UTF8, "application/json")); diff --git a/Wabbajack.Lib/Downloaders/GameFileSourceDownloader.cs b/Wabbajack.Lib/Downloaders/GameFileSourceDownloader.cs index 844e0ce3..45f1e80e 100644 --- a/Wabbajack.Lib/Downloaders/GameFileSourceDownloader.cs +++ b/Wabbajack.Lib/Downloaders/GameFileSourceDownloader.cs @@ -1,13 +1,8 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using Alphaleonis.Win32.Filesystem; -using MessagePack; +using System.Threading.Tasks; +using Newtonsoft.Json; using Wabbajack.Common; +using Wabbajack.Common.Serialization.Json; using Wabbajack.Lib.Validation; -using File = Alphaleonis.Win32.Filesystem.File; using Game = Wabbajack.Common.Game; namespace Wabbajack.Lib.Downloaders @@ -48,22 +43,18 @@ namespace Wabbajack.Lib.Downloaders { } - [MessagePackObject] + [JsonName("GameFileSourceDownloader")] public class State : AbstractDownloadState { - [Key(0)] public Game Game { get; set; } - [Key(1)] public RelativePath GameFile { get; set; } - [Key(2)] public Hash Hash { get; set; } - [Key(3)] public string GameVersion { get; set; } - [IgnoreMember] + [JsonIgnore] internal AbsolutePath SourcePath => Game.MetaData().GameLocation().Value.Combine(GameFile); - [IgnoreMember] + [JsonIgnore] public override object[] PrimaryKey { get => new object[] {Game, GameVersion, GameFile}; } public override bool IsWhitelisted(ServerWhitelist whitelist) diff --git a/Wabbajack.Lib/Downloaders/GoogleDriveDownloader.cs b/Wabbajack.Lib/Downloaders/GoogleDriveDownloader.cs index 79df3478..9c96e219 100644 --- a/Wabbajack.Lib/Downloaders/GoogleDriveDownloader.cs +++ b/Wabbajack.Lib/Downloaders/GoogleDriveDownloader.cs @@ -1,8 +1,8 @@ -using System.Net.Http; -using System.Text.RegularExpressions; +using System.Text.RegularExpressions; using System.Threading.Tasks; -using MessagePack; +using Newtonsoft.Json; using Wabbajack.Common; +using Wabbajack.Common.Serialization.Json; using Wabbajack.Lib.Exceptions; using Wabbajack.Lib.Validation; @@ -35,13 +35,12 @@ namespace Wabbajack.Lib.Downloaders { } - [MessagePackObject] + [JsonName("GoogleDriveDownloader")] public class State : AbstractDownloadState { - [Key(0)] public string Id { get; set; } - [IgnoreMember] + [JsonIgnore] public override object[] PrimaryKey { get => new object[] {Id}; } public override bool IsWhitelisted(ServerWhitelist whitelist) diff --git a/Wabbajack.Lib/Downloaders/HTTPDownloader.cs b/Wabbajack.Lib/Downloaders/HTTPDownloader.cs index cf000dca..9b051f38 100644 --- a/Wabbajack.Lib/Downloaders/HTTPDownloader.cs +++ b/Wabbajack.Lib/Downloaders/HTTPDownloader.cs @@ -5,11 +5,11 @@ using System.Linq; using System.Net.Http; using System.Net.Http.Headers; using System.Threading.Tasks; -using MessagePack; +using Newtonsoft.Json; using Wabbajack.Common; +using Wabbajack.Common.Serialization.Json; using Wabbajack.Lib.Exceptions; using Wabbajack.Lib.Validation; -using File = Alphaleonis.Win32.Filesystem.File; namespace Wabbajack.Lib.Downloaders { @@ -50,19 +50,17 @@ namespace Wabbajack.Lib.Downloaders { } - [MessagePackObject] + [JsonName("HttpDownloader")] public class State : AbstractDownloadState { - [Key(0)] public string Url { get; set; } - [Key(1)] public List Headers { get; set; } - [IgnoreMember] + [JsonIgnore] public Common.Http.Client Client { get; set; } - [IgnoreMember] + [JsonIgnore] public override object[] PrimaryKey { get => new object[] {Url};} public override bool IsWhitelisted(ServerWhitelist whitelist) diff --git a/Wabbajack.Lib/Downloaders/LoversLabDownloader.cs b/Wabbajack.Lib/Downloaders/LoversLabDownloader.cs index 13991209..aaac605e 100644 --- a/Wabbajack.Lib/Downloaders/LoversLabDownloader.cs +++ b/Wabbajack.Lib/Downloaders/LoversLabDownloader.cs @@ -2,8 +2,9 @@ using System.Linq; using System.Threading.Tasks; using HtmlAgilityPack; -using MessagePack; +using Newtonsoft.Json; using Wabbajack.Common; +using Wabbajack.Common.Serialization.Json; using Wabbajack.Lib.WebAutomation; namespace Wabbajack.Lib.Downloaders @@ -32,9 +33,11 @@ namespace Wabbajack.Lib.Downloaders } } + + [JsonName("LoversLabDownloader")] public class State : State { - [IgnoreMember] + [JsonIgnore] public override bool IsNSFW => true; public override async Task LoadMetaData() diff --git a/Wabbajack.Lib/Downloaders/MEGADownloader.cs b/Wabbajack.Lib/Downloaders/MEGADownloader.cs index 16ceab1b..76b067d1 100644 --- a/Wabbajack.Lib/Downloaders/MEGADownloader.cs +++ b/Wabbajack.Lib/Downloaders/MEGADownloader.cs @@ -4,9 +4,10 @@ using System.Reactive.Linq; using System.Security; using System.Threading.Tasks; using CG.Web.MegaApiClient; -using MessagePack; +using Newtonsoft.Json; using ReactiveUI; using Wabbajack.Common; +using Wabbajack.Common.Serialization.Json; namespace Wabbajack.Lib.Downloaders { @@ -90,6 +91,7 @@ namespace Wabbajack.Lib.Downloaders { } + [JsonName("MegaDownloader")] public class State : HTTPDownloader.State { private static MegaApiClient MegaApiClient => DownloadDispatcher.GetInstance().MegaApiClient; diff --git a/Wabbajack.Lib/Downloaders/ManualDownloader.cs b/Wabbajack.Lib/Downloaders/ManualDownloader.cs index 3721f116..f08fe587 100644 --- a/Wabbajack.Lib/Downloaders/ManualDownloader.cs +++ b/Wabbajack.Lib/Downloaders/ManualDownloader.cs @@ -1,15 +1,11 @@ -using System; -using System.Diagnostics; -using System.IO; -using System.Linq; -using System.Reactive.Linq; +using System.IO; using System.Reactive.Subjects; using System.Threading.Tasks; -using MessagePack; +using Newtonsoft.Json; using Wabbajack.Common; using Wabbajack.Common.IO; +using Wabbajack.Common.Serialization.Json; using Wabbajack.Lib.Validation; -using File = System.IO.File; namespace Wabbajack.Lib.Downloaders { @@ -71,13 +67,12 @@ namespace Wabbajack.Lib.Downloaders { } - [MessagePackObject] + [JsonName("ManualDownloader")] public class State : AbstractDownloadState { - [Key(0)] public string Url { get; set; } - [IgnoreMember] + [JsonIgnore] public override object[] PrimaryKey { get => new object[] {Url}; } public override bool IsWhitelisted(ServerWhitelist whitelist) diff --git a/Wabbajack.Lib/Downloaders/ModDBDownloader.cs b/Wabbajack.Lib/Downloaders/ModDBDownloader.cs index fd3d218b..d48064ba 100644 --- a/Wabbajack.Lib/Downloaders/ModDBDownloader.cs +++ b/Wabbajack.Lib/Downloaders/ModDBDownloader.cs @@ -1,12 +1,10 @@ using System; using System.Linq; -using System.Net.Http; -using System.Text.RegularExpressions; using System.Threading.Tasks; -using System.Web; using HtmlAgilityPack; -using MessagePack; +using Newtonsoft.Json; using Wabbajack.Common; +using Wabbajack.Common.Serialization.Json; using Wabbajack.Lib.Validation; namespace Wabbajack.Lib.Downloaders @@ -36,14 +34,12 @@ namespace Wabbajack.Lib.Downloaders { } - [MessagePackObject] + [JsonName("ModDBDownloader")] public class State : AbstractDownloadState { - - [Key(0)] public string Url { get; set; } - [IgnoreMember] + [JsonIgnore] public override object[] PrimaryKey { get => new object[]{Url}; } public override bool IsWhitelisted(ServerWhitelist whitelist) diff --git a/Wabbajack.Lib/Downloaders/NexusDownloader.cs b/Wabbajack.Lib/Downloaders/NexusDownloader.cs index ef30fe37..77942288 100644 --- a/Wabbajack.Lib/Downloaders/NexusDownloader.cs +++ b/Wabbajack.Lib/Downloaders/NexusDownloader.cs @@ -1,12 +1,13 @@ using System; +using System.ComponentModel.DataAnnotations; using System.Linq; using System.Reactive; using System.Reactive.Linq; using System.Threading.Tasks; -using MessagePack; using Newtonsoft.Json; using ReactiveUI; using Wabbajack.Common; +using Wabbajack.Common.Serialization.Json; using Wabbajack.Common.StatusFeed.Errors; using Wabbajack.Lib.NexusApi; using Wabbajack.Lib.Validation; @@ -128,38 +129,29 @@ namespace Wabbajack.Lib.Downloaders } } - [MessagePackObject] + [JsonName("NexusDownloader")] public class State : AbstractDownloadState, IMetaState { - [IgnoreMember] + [JsonIgnore] public Uri URL => new Uri($"http://nexusmods.com/{Game.MetaData().NexusName}/mods/{ModID}"); - [Key(0)] public string Name { get; set; } - [Key(1)] public string Author { get; set; } - [Key(2)] public string Version { get; set; } - [Key(3)] public string ImageURL { get; set; } - [Key(4)] public bool IsNSFW { get; set; } - [Key(5)] public string Description { get; set; } - [Key(6)] [JsonProperty("GameName")] [JsonConverter(typeof(Utils.GameConverter))] public Game Game { get; set; } - [Key(7)] public long ModID { get; set; } - [Key(8)] public long FileID { get; set; } public async Task LoadMetaData() @@ -167,7 +159,7 @@ namespace Wabbajack.Lib.Downloaders return true; } - [IgnoreMember] + [JsonIgnore] public override object[] PrimaryKey { get => new object[]{Game, ModID, FileID};} public override bool IsWhitelisted(ServerWhitelist whitelist) diff --git a/Wabbajack.Lib/Downloaders/TESAllianceDownloader.cs b/Wabbajack.Lib/Downloaders/TESAllianceDownloader.cs index af45bd19..ae6a8fa1 100644 --- a/Wabbajack.Lib/Downloaders/TESAllianceDownloader.cs +++ b/Wabbajack.Lib/Downloaders/TESAllianceDownloader.cs @@ -1,5 +1,6 @@ using System; -using MessagePack; +using Wabbajack.Common; +using Wabbajack.Common.Serialization.Json; namespace Wabbajack.Lib.Downloaders { @@ -16,7 +17,7 @@ namespace Wabbajack.Lib.Downloaders { } - [MessagePackObject] + [JsonName("TESAllianceDownloader")] public class State : State{} } } diff --git a/Wabbajack.Lib/Downloaders/VectorPlexusDownloader.cs b/Wabbajack.Lib/Downloaders/VectorPlexusDownloader.cs index 1e471485..8f7d1c5c 100644 --- a/Wabbajack.Lib/Downloaders/VectorPlexusDownloader.cs +++ b/Wabbajack.Lib/Downloaders/VectorPlexusDownloader.cs @@ -1,6 +1,5 @@ using System; -using System.Threading.Tasks; -using MessagePack; +using Wabbajack.Common.Serialization.Json; namespace Wabbajack.Lib.Downloaders { @@ -17,7 +16,7 @@ namespace Wabbajack.Lib.Downloaders { } - [MessagePackObject] + [JsonName("VectorPlexisDownloader")] public class State : State { } diff --git a/Wabbajack.Lib/Downloaders/YouTubeDownloader.cs b/Wabbajack.Lib/Downloaders/YouTubeDownloader.cs index bd568752..c72184d0 100644 --- a/Wabbajack.Lib/Downloaders/YouTubeDownloader.cs +++ b/Wabbajack.Lib/Downloaders/YouTubeDownloader.cs @@ -1,14 +1,14 @@ using System; using System.Collections.Generic; using System.Diagnostics; -using System.IO; using System.IO.Compression; using System.Linq; using System.Threading; using System.Threading.Tasks; using System.Web; -using MessagePack; +using Newtonsoft.Json; using Wabbajack.Common; +using Wabbajack.Common.Serialization.Json; using Wabbajack.Lib.Validation; using YoutubeExplode; using YoutubeExplode.Exceptions; @@ -59,19 +59,17 @@ namespace Wabbajack.Lib.Downloaders { } - [MessagePackObject] + [JsonName("YouTubeDownloader")] public class State : AbstractDownloadState { - [Key(0)] public string Key { get; set; } - [Key(1)] public List Tracks { get; set; } = new List(); - [IgnoreMember] + [JsonIgnore] public override object[] PrimaryKey => new object[] {Key}; - [MessagePackObject] + [JsonName("YouTubeTrack")] public class Track { public enum FormatEnum @@ -79,16 +77,12 @@ namespace Wabbajack.Lib.Downloaders XWM, WAV } - [Key(0)] public FormatEnum Format { get; set; } - [Key(1)] public string Name { get; set; } - [Key(2)] public TimeSpan Start { get; set; } - [Key(3)] public TimeSpan End { get; set; } } diff --git a/Wabbajack.Lib/FileUploader/AuthorAPI.cs b/Wabbajack.Lib/FileUploader/AuthorAPI.cs index 425fce97..dced6a8e 100644 --- a/Wabbajack.Lib/FileUploader/AuthorAPI.cs +++ b/Wabbajack.Lib/FileUploader/AuthorAPI.cs @@ -186,7 +186,7 @@ namespace Wabbajack.Lib.FileUploader public static async Task> GetMyFiles() { - return (await (await GetAuthorizedClient()).GetStringAsync($"https://{Consts.WabbajackCacheHostname}/uploaded_files/list")).FromJSONString(); + return (await (await GetAuthorizedClient()).GetStringAsync($"https://{Consts.WabbajackCacheHostname}/uploaded_files/list")).FromJsonString(); } public static async Task DeleteFile(string name) diff --git a/Wabbajack.Lib/GraphQL/DTOs/UploadedFile.cs b/Wabbajack.Lib/GraphQL/DTOs/UploadedFile.cs deleted file mode 100644 index f1d54b23..00000000 --- a/Wabbajack.Lib/GraphQL/DTOs/UploadedFile.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System; - -namespace Wabbajack.Lib.GraphQL.DTOs -{ - public class UploadedFile - { - public string Id { get; set; } - public string Name { get; set; } - public string MungedName { get; set; } - public DateTime UploadDate { get; set; } - public string Uploader { get; set; } - public Uri Uri { get; set; } - public string Hash { get; set; } - public long Size { get; set; } - } -} diff --git a/Wabbajack.Lib/GraphQL/GraphQLService.cs b/Wabbajack.Lib/GraphQL/GraphQLService.cs deleted file mode 100644 index 148e3284..00000000 --- a/Wabbajack.Lib/GraphQL/GraphQLService.cs +++ /dev/null @@ -1,44 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Net.Http; -using System.Net.Http.Headers; -using System.Threading.Tasks; -using GraphQL.Client; -using GraphQL.Client.Http; -using GraphQL.Common.Request; -using Wabbajack.Common; -using Wabbajack.Lib.FileUploader; -using Wabbajack.Lib.GraphQL.DTOs; -using Path = Alphaleonis.Win32.Filesystem.Path; - -namespace Wabbajack.Lib.GraphQL -{ - public class GraphQLService - { - public static readonly Uri BaseURL = new Uri("https://build.wabbajack.org/graphql"); - - public static async Task> GetUploadedFiles() - { - var client = new GraphQLHttpClient(BaseURL); - var query = new GraphQLRequest - { - Query = @" - query uploadedFilesQuery { - uploadedFiles { - id - name - hash - uri - uploader - uploadDate - } - }" - }; - var result = await client.SendQueryAsync(query); - return result.GetDataFieldAs>("uploadedFiles"); - } - - } -} diff --git a/Wabbajack.Lib/LibCefHelpers/Init.cs b/Wabbajack.Lib/LibCefHelpers/Init.cs index 695e93eb..573fd9db 100644 --- a/Wabbajack.Lib/LibCefHelpers/Init.cs +++ b/Wabbajack.Lib/LibCefHelpers/Init.cs @@ -11,6 +11,7 @@ using Alphaleonis.Win32.Filesystem; using CefSharp; using CefSharp.OffScreen; using Wabbajack.Common; +using Wabbajack.Common.Serialization.Json; namespace Wabbajack.Lib.LibCefHelpers { @@ -74,6 +75,7 @@ namespace Wabbajack.Lib.LibCefHelpers } } + [JsonName("HttpCookie")] public class Cookie { public string Name { get; set; } diff --git a/Wabbajack.Lib/Manifest.cs b/Wabbajack.Lib/Manifest.cs index df85609b..4058e922 100644 --- a/Wabbajack.Lib/Manifest.cs +++ b/Wabbajack.Lib/Manifest.cs @@ -1,9 +1,11 @@ using System.Collections.Generic; using System.Linq; using Wabbajack.Common; +using Wabbajack.Common.Serialization.Json; namespace Wabbajack.Lib { + [JsonName("Manifest")] public class Manifest { public string Name; diff --git a/Wabbajack.Lib/ModListRegistry/ModListMetadata.cs b/Wabbajack.Lib/ModListRegistry/ModListMetadata.cs index 6a3c250b..a69a074e 100644 --- a/Wabbajack.Lib/ModListRegistry/ModListMetadata.cs +++ b/Wabbajack.Lib/ModListRegistry/ModListMetadata.cs @@ -4,6 +4,7 @@ using System.Linq; using System.Threading.Tasks; using Newtonsoft.Json; using Wabbajack.Common; +using Wabbajack.Common.Serialization.Json; using Game = Wabbajack.Common.Game; namespace Wabbajack.Lib.ModListRegistry @@ -62,10 +63,10 @@ namespace Wabbajack.Lib.ModListRegistry var metadataResult = client.GetStringAsync(Consts.ModlistMetadataURL); var summaryResult = client.GetStringAsync(Consts.ModlistSummaryURL); - var metadata = (await metadataResult).FromJSONString>(); + var metadata = (await metadataResult).FromJsonString>(); try { - var summaries = (await summaryResult).FromJSONString>().ToDictionary(d => d.Name); + var summaries = (await summaryResult).FromJsonString>().ToDictionary(d => d.Name); foreach (var data in metadata) if (summaries.TryGetValue(data.Title, out var summary)) @@ -90,6 +91,7 @@ namespace Wabbajack.Lib.ModListRegistry } } + [JsonName("DownloadMetadata")] public class DownloadMetadata { public Hash Hash { get; set; } diff --git a/Wabbajack.Lib/NexusApi/NexusApi.cs b/Wabbajack.Lib/NexusApi/NexusApi.cs index 50dba8ce..3ecf39a6 100644 --- a/Wabbajack.Lib/NexusApi/NexusApi.cs +++ b/Wabbajack.Lib/NexusApi/NexusApi.cs @@ -233,7 +233,7 @@ namespace Wabbajack.Lib.NexusApi await using var stream = await response.Content.ReadAsStreamAsync(); - return stream.FromJSON(); + return stream.FromJson(); } catch (TimeoutException) { diff --git a/Wabbajack.Lib/Wabbajack.Lib.csproj b/Wabbajack.Lib/Wabbajack.Lib.csproj index 73d330ba..9784833e 100644 --- a/Wabbajack.Lib/Wabbajack.Lib.csproj +++ b/Wabbajack.Lib/Wabbajack.Lib.csproj @@ -7,10 +7,10 @@ - 79.1.350 + 79.1.360 - 79.1.350 + 79.1.360 6.1.1 @@ -19,17 +19,14 @@ 2.2.2.1 - 2.0.0-alpha.3 + 3.0.1 - 1.11.22 + 1.11.23 1.7.1 - - 2.1.90 - 4.7.0 @@ -37,13 +34,13 @@ 2.1.0 - 11.2.3 + 11.3.1 - 11.2.3 + 11.3.1 - 0.24.0 + 0.25.0 1.7.0 diff --git a/Wabbajack.Lib/zEditIntegration.cs b/Wabbajack.Lib/zEditIntegration.cs index da6336bc..a4e67b0e 100644 --- a/Wabbajack.Lib/zEditIntegration.cs +++ b/Wabbajack.Lib/zEditIntegration.cs @@ -59,7 +59,7 @@ namespace Wabbajack.Lib .Where(f => f.FileName == Consts.SettingsJson) .Where(f => { - var settings = f.FromJSON(); + var settings = f.FromJson(); if (settings.modManager != "Mod Organizer 2") { @@ -109,7 +109,7 @@ namespace Wabbajack.Lib Utils.Log($"Using merge file {mergeFile}"); - var merges = mergeFile.FromJSON>().GroupBy(f => (f.name, f.filename)).ToArray(); + var merges = mergeFile.FromJson>().GroupBy(f => (f.name, f.filename)).ToArray(); merges.Where(m => m.Count() > 1) .Do(m => diff --git a/Wabbajack.Test/DownloaderTests.cs b/Wabbajack.Test/DownloaderTests.cs index 42dfef90..f3c6c4d1 100644 --- a/Wabbajack.Test/DownloaderTests.cs +++ b/Wabbajack.Test/DownloaderTests.cs @@ -529,11 +529,7 @@ namespace Wabbajack.Test private T RoundTripState(T state) { - using var ms = new MemoryStream(); - ms.WriteAsMessagePack(state); - ms.Position = 0; - - return ms.ReadAsMessagePack(); + return state.ToJson().FromJsonString(); } diff --git a/Wabbajack.Test/Wabbajack.Test.csproj b/Wabbajack.Test/Wabbajack.Test.csproj index 4e56b72c..3f93db7b 100644 --- a/Wabbajack.Test/Wabbajack.Test.csproj +++ b/Wabbajack.Test/Wabbajack.Test.csproj @@ -27,13 +27,13 @@ - - - + + + - - + + diff --git a/Wabbajack.Test/ZEditIntegrationTests.cs b/Wabbajack.Test/ZEditIntegrationTests.cs index d720ab38..15190c81 100644 --- a/Wabbajack.Test/ZEditIntegrationTests.cs +++ b/Wabbajack.Test/ZEditIntegrationTests.cs @@ -36,7 +36,7 @@ namespace Wabbajack.Test mergePath = Path.Combine(utils.MO2Folder, Consts.MO2ModFolderName) }; - settings.ToJSON(Path.Combine(utils.MO2Folder, "tools", "mator", "bleh", "profiles", "myprofile", + settings.ToJson(Path.Combine(utils.MO2Folder, "tools", "mator", "bleh", "profiles", "myprofile", "settings.json")); new List() @@ -64,7 +64,7 @@ namespace Wabbajack.Test } } } - }.ToJSON(Path.Combine(utils.MO2Folder, "tools", "mator", "bleh", "profiles", "myprofile", "merges.json")); + }.ToJson(Path.Combine(utils.MO2Folder, "tools", "mator", "bleh", "profiles", "myprofile", "merges.json")); utils.Configure(); diff --git a/Wabbajack.VirtualFileSystem/VirtualFile.cs b/Wabbajack.VirtualFileSystem/VirtualFile.cs index cdf192ac..2dac0afe 100644 --- a/Wabbajack.VirtualFileSystem/VirtualFile.cs +++ b/Wabbajack.VirtualFileSystem/VirtualFile.cs @@ -4,12 +4,9 @@ using System.Collections.Immutable; using System.IO; using System.Linq; using System.Net.Http; -using System.Runtime.CompilerServices; using System.Threading.Tasks; using K4os.Hash.Crc; -using MessagePack; using Wabbajack.Common; -using Path = Alphaleonis.Win32.Filesystem.Path; namespace Wabbajack.VirtualFileSystem { @@ -230,7 +227,7 @@ namespace Wabbajack.VirtualFileSystem using (var stream = await response.Content.ReadAsStreamAsync()) { - return stream.FromJSON(); + return stream.FromJson(); } } catch (Exception) diff --git a/Wabbajack/Settings.cs b/Wabbajack/Settings.cs index bae37dd7..e46c9fb7 100644 --- a/Wabbajack/Settings.cs +++ b/Wabbajack/Settings.cs @@ -37,7 +37,7 @@ namespace Wabbajack // Version check try { - settings = Consts.SettingsFile.FromJSON(); + settings = Consts.SettingsFile.FromJson(); if (settings.Version == Consts.SettingsVersion) return true; } diff --git a/Wabbajack/View Models/Settings/AuthorFilesVM.cs b/Wabbajack/View Models/Settings/AuthorFilesVM.cs index 71b0c91e..7a3f640c 100644 --- a/Wabbajack/View Models/Settings/AuthorFilesVM.cs +++ b/Wabbajack/View Models/Settings/AuthorFilesVM.cs @@ -1,22 +1,12 @@ using System; -using System.Collections.Generic; -using System.Reactive.Disposables; using System.Reactive.Linq; using System.Reactive.Subjects; -using System.Threading.Tasks; - using System.Windows; -using System.Windows.Documents; using System.Windows.Input; -using Alphaleonis.Win32.Filesystem; -using Microsoft.WindowsAPICodePack.Shell.PropertySystem; using ReactiveUI; using ReactiveUI.Fody.Helpers; using Wabbajack.Common; using Wabbajack.Lib.FileUploader; -using Wabbajack.Lib.GraphQL; -using Wabbajack.Lib.GraphQL.DTOs; -using File = System.IO.File; namespace Wabbajack { diff --git a/Wabbajack/Wabbajack.csproj b/Wabbajack/Wabbajack.csproj index 1141378a..9309ae85 100644 --- a/Wabbajack/Wabbajack.csproj +++ b/Wabbajack/Wabbajack.csproj @@ -57,8 +57,8 @@ - - + + all @@ -70,12 +70,12 @@ runtime; build; native; contentfiles; analyzers; buildtransitive - + - - - + + +