using Logging; using Newtonsoft.Json; using Tranga.LibraryManagers; using Tranga.NotificationManagers; namespace Tranga; public class CommonObjects { public HashSet libraryManagers { get; init; } public HashSet notificationManagers { get; init; } [JsonIgnore]public Logger? logger { get; set; } [JsonIgnore]private string settingsFilePath { get; init; } public CommonObjects(HashSet? libraryManagers, HashSet? notificationManagers, Logger? logger, string settingsFilePath) { this.libraryManagers = libraryManagers??new(); this.notificationManagers = notificationManagers??new(); this.logger = logger; this.settingsFilePath = settingsFilePath; } public static CommonObjects LoadSettings(string settingsFilePath, Logger? logger) { if (!File.Exists(settingsFilePath)) return new CommonObjects(null, null, logger, settingsFilePath); string toRead = File.ReadAllText(settingsFilePath); TrangaSettings.SettingsJsonObject settings = JsonConvert.DeserializeObject( toRead, new JsonSerializerSettings { Converters = { new NotificationManager.NotificationManagerJsonConverter(), new LibraryManager.LibraryManagerJsonConverter() } })!; if(settings.co is null) return new CommonObjects(null, null, logger, settingsFilePath); if (logger is not null) { foreach (LibraryManager lm in settings.co.libraryManagers) lm.AddLogger(logger); foreach(NotificationManager nm in settings.co.notificationManagers) nm.AddLogger(logger); } return settings.co; } public void ExportSettings() { TrangaSettings.SettingsJsonObject? settings = null; if (File.Exists(settingsFilePath)) { bool inUse = true; while (inUse) { try { using FileStream stream = new (settingsFilePath, FileMode.Open, FileAccess.Read, FileShare.None); stream.Close(); inUse = false; } catch (IOException) { inUse = true; Thread.Sleep(50); } } string toRead = File.ReadAllText(settingsFilePath); settings = JsonConvert.DeserializeObject(toRead, new JsonSerializerSettings { Converters = { new NotificationManager.NotificationManagerJsonConverter(), new LibraryManager.LibraryManagerJsonConverter() } }); } settings = new TrangaSettings.SettingsJsonObject(settings?.ts, this); File.WriteAllText(settingsFilePath, JsonConvert.SerializeObject(settings)); } public void UpdateSettings(TrangaSettings.UpdateField field, params string[] values) { switch (field) { case TrangaSettings.UpdateField.Komga: if (values.Length != 2) return; libraryManagers.RemoveWhere(lm => lm.GetType() == typeof(Komga)); libraryManagers.Add(new Komga(values[0], values[1], this.logger)); break; case TrangaSettings.UpdateField.Kavita: if (values.Length != 3) return; libraryManagers.RemoveWhere(lm => lm.GetType() == typeof(Kavita)); libraryManagers.Add(new Kavita(values[0], values[1], values[2], this.logger)); break; case TrangaSettings.UpdateField.Gotify: if (values.Length != 2) return; notificationManagers.RemoveWhere(nm => nm.GetType() == typeof(Gotify)); Gotify newGotify = new(values[0], values[1], this.logger); notificationManagers.Add(newGotify); newGotify.SendNotification("Success!", "Gotify was added to Tranga!"); break; case TrangaSettings.UpdateField.LunaSea: if(values.Length != 1) return; notificationManagers.RemoveWhere(nm => nm.GetType() == typeof(LunaSea)); LunaSea newLunaSea = new(values[0], this.logger); notificationManagers.Add(newLunaSea); newLunaSea.SendNotification("Success!", "LunaSea was added to Tranga!"); break; } ExportSettings(); } }