diff --git a/API/Schema/Chapter.cs b/API/Schema/Chapter.cs index 65e5811..56233be 100644 --- a/API/Schema/Chapter.cs +++ b/API/Schema/Chapter.cs @@ -21,8 +21,8 @@ public class Chapter : IComparable public string ParentMangaId { get; internal set; } public Manga? ParentManga { get; init; } - public Chapter(Manga parentManga, string url, string chapterNumberStruct, int? volumeNumber = null, string? title = null) - : this(parentManga.MangaId, url, chapterNumberStruct, volumeNumber, title) + public Chapter(Manga parentManga, string url, string chapterNumber, int? volumeNumber = null, string? title = null) + : this(parentManga.MangaId, url, chapterNumber, volumeNumber, title) { this.ParentManga = parentManga; this.ArchiveFileName = BuildArchiveFileName(); diff --git a/API/Tranga.cs b/API/Tranga.cs index e6d89a3..775e311 100644 --- a/API/Tranga.cs +++ b/API/Tranga.cs @@ -1,6 +1,5 @@ using API.Schema; using API.Schema.Jobs; -using API.Schema.NotificationConnectors; using log4net; using log4net.Config; @@ -8,10 +7,10 @@ namespace API; public static class Tranga { - public static Thread NotificationSenderThread { get; } = new (NotificationSender); - public static Thread JobStarterThread { get; } = new (JobStarter); private static readonly Dictionary RunningJobs = new(); private static readonly ILog Log = LogManager.GetLogger(typeof(Tranga)); + public static Thread NotificationSenderThread { get; } = new(NotificationSender); + public static Thread JobStarterThread { get; } = new(JobStarter); internal static void StartLogger() { @@ -20,10 +19,11 @@ public static class Tranga private static void NotificationSender(object? pgsqlContext) { - if(pgsqlContext is null) return; - PgsqlContext context = (PgsqlContext)pgsqlContext; + if (pgsqlContext is null) return; + var context = (PgsqlContext)pgsqlContext; - IQueryable staleNotifications = context.Notifications.Where(n => n.Urgency < NotificationUrgency.Normal); + var staleNotifications = + context.Notifications.Where(n => n.Urgency < NotificationUrgency.Normal); context.Notifications.RemoveRange(staleNotifications); context.SaveChanges(); while (true) @@ -31,7 +31,7 @@ public static class Tranga SendNotifications(context, NotificationUrgency.High); SendNotifications(context, NotificationUrgency.Normal); SendNotifications(context, NotificationUrgency.Low); - + context.SaveChanges(); Thread.Sleep(2000); } @@ -39,47 +39,53 @@ public static class Tranga private static void SendNotifications(PgsqlContext context, NotificationUrgency urgency) { - List notifications = context.Notifications.Where(n => n.Urgency == urgency).ToList(); + var notifications = context.Notifications.Where(n => n.Urgency == urgency).ToList(); if (notifications.Any()) { - DateTime max = notifications.MaxBy(n => n.Date)!.Date; + var max = notifications.MaxBy(n => n.Date)!.Date; if (DateTime.Now.Subtract(max) > TrangaSettings.NotificationUrgencyDelay(urgency)) { - foreach (NotificationConnector notificationConnector in context.NotificationConnectors) - { - foreach (Notification notification in notifications) - notificationConnector.SendNotification(notification.Title, notification.Message); - } + foreach (var notificationConnector in context.NotificationConnectors) + foreach (var notification in notifications) + notificationConnector.SendNotification(notification.Title, notification.Message); context.Notifications.RemoveRange(notifications); } } + context.SaveChanges(); } private static void JobStarter(object? pgsqlContext) { - if(pgsqlContext is null) return; - PgsqlContext context = (PgsqlContext)pgsqlContext; - - string TRANGA = "\n\n _______ \n|_ _|.----..---.-..-----..-----..---.-.\n | | | _|| _ || || _ || _ |\n |___| |__| |___._||__|__||___ ||___._|\n |_____| \n\n"; + if (pgsqlContext is null) return; + var context = (PgsqlContext)pgsqlContext; + + var TRANGA = + "\n\n _______ \n|_ _|.----..---.-..-----..-----..---.-.\n | | | _|| _ || || _ || _ |\n |___| |__| |___._||__|__||___ ||___._|\n |_____| \n\n"; Log.Info(TRANGA); while (true) { - List completedJobs = context.Jobs.Where(j => j.state == JobState.Completed).ToList(); - foreach (Job job in completedJobs) - if(job.RecurrenceMs <= 0) + var completedJobs = context.Jobs.Where(j => j.state == JobState.Completed).ToList(); + foreach (var job in completedJobs) + if (job.RecurrenceMs <= 0) + { context.Jobs.Remove(job); + } else { job.LastExecution = DateTime.UtcNow; job.state = JobState.Waiting; context.Jobs.Update(job); } - - List runJobs = context.Jobs.Where(j => j.state <= JobState.Running).ToList().Where(j => j.NextExecution < DateTime.UtcNow).ToList(); - foreach (Job job in runJobs) + + List runJobs = context.Jobs.Where(j => j.state <= JobState.Running).AsEnumerable() + .Where(j => j.NextExecution < DateTime.UtcNow).ToList(); + foreach (var job in runJobs) { - Thread t = new (() => + // If the job is already running, skip it + if (RunningJobs.Values.Any(j => j.JobId == job.JobId)) continue; + + Thread t = new(() => { IEnumerable newJobs = job.Run(context); context.Jobs.AddRange(newJobs); @@ -96,7 +102,7 @@ public static class Tranga RunningJobs.Remove(thread.thread); context.Jobs.Update(thread.job); } - + context.SaveChanges(); Thread.Sleep(2000); }