using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Tranga.MangaConnectors; namespace Tranga.Jobs; public class JobJsonConverter : JsonConverter { private GlobalBase _clone; private MangaConnectorJsonConverter _mangaConnectorJsonConverter; internal JobJsonConverter(GlobalBase clone, MangaConnectorJsonConverter mangaConnectorJsonConverter) { this._clone = clone; this._mangaConnectorJsonConverter = mangaConnectorJsonConverter; } public override bool CanConvert(Type objectType) { return (objectType == typeof(Job)); } public override object ReadJson(JsonReader reader, Type objectType, object? existingValue, JsonSerializer serializer) { JObject jo = JObject.Load(reader); if (jo.ContainsKey("jobType") && jo["jobType"]!.Value() == (byte)Job.JobType.UpdateMetaDataJob) { return new UpdateMetadata(this._clone, jo.GetValue("mangaConnector")!.ToObject(JsonSerializer.Create(new JsonSerializerSettings() { Converters = { this._mangaConnectorJsonConverter } }))!, jo.GetValue("manga")!.ToObject(), jo.GetValue("parentJobId")!.Value()); }else if ((jo.ContainsKey("jobType") && jo["jobType"]!.Value() == (byte)Job.JobType.DownloadNewChaptersJob) || jo.ContainsKey("translatedLanguage"))//TODO change to jobType { DateTime lastExecution = jo.GetValue("lastExecution") is {} le ? le.ToObject() : DateTime.UnixEpoch; //TODO do null checks on all variables return new DownloadNewChapters(this._clone, jo.GetValue("mangaConnector")!.ToObject(JsonSerializer.Create(new JsonSerializerSettings() { Converters = { this._mangaConnectorJsonConverter } }))!, jo.GetValue("manga")!.ToObject(), lastExecution, jo.GetValue("recurring")!.Value(), jo.GetValue("recurrenceTime")!.ToObject(), jo.GetValue("parentJobId")!.Value()); }else if ((jo.ContainsKey("jobType") && jo["jobType"]!.Value() == (byte)Job.JobType.DownloadChapterJob) || jo.ContainsKey("chapter"))//TODO change to jobType { return new DownloadChapter(this._clone, jo.GetValue("mangaConnector")!.ToObject(JsonSerializer.Create(new JsonSerializerSettings() { Converters = { this._mangaConnectorJsonConverter } }))!, jo.GetValue("chapter")!.ToObject(), DateTime.UnixEpoch, jo.GetValue("parentJobId")!.Value()); } throw new Exception(); } public override bool CanWrite => false; /// /// Don't call this /// public override void WriteJson(JsonWriter writer, object? value, JsonSerializer serializer) { throw new Exception("Dont call this"); } }