namespace Tranga; /// /// Executes TrangaTasks /// Based on the TrangaTask.Task a method is called. /// The chapterCollection is updated with new Publications/Chapters. /// public static class TaskExecutor { /// /// Executes TrangaTask. /// /// List of all available Connectors /// Task to execute /// Current chapterCollection to update /// Is thrown when there is no Connector available with the name of the TrangaTask.connectorName public static void Execute(Connector[] connectors, TrangaTask trangaTask, Dictionary> chapterCollection) { Connector? connector = connectors.FirstOrDefault(c => c.name == trangaTask.connectorName); if (connector is null) throw new ArgumentException($"Connector {trangaTask.connectorName} is not a known connector."); if (trangaTask.isBeingExecuted) return; trangaTask.isBeingExecuted = true; trangaTask.lastExecuted = DateTime.Now; switch (trangaTask.task) { case TrangaTask.Task.DownloadNewChapters: DownloadNewChapters(connector, (Publication)trangaTask.publication!, trangaTask.language, chapterCollection); break; case TrangaTask.Task.UpdateChapters: UpdateChapters(connector, (Publication)trangaTask.publication!, trangaTask.language, chapterCollection); break; case TrangaTask.Task.UpdatePublications: UpdatePublications(connector, chapterCollection); break; } trangaTask.isBeingExecuted = false; } private static void UpdatePublications(Connector connector, Dictionary> chapterCollection) { Publication[] publications = connector.GetPublications(); foreach (Publication publication in publications) chapterCollection.TryAdd(publication, new List()); } private static void DownloadNewChapters(Connector connector, Publication publication, string language, Dictionary> chapterCollection) { List newChapters = UpdateChapters(connector, publication, language, chapterCollection); foreach(Chapter newChapter in newChapters) connector.DownloadChapter(publication, newChapter); connector.DownloadCover(publication); connector.SaveSeriesInfo(publication); } private static List UpdateChapters(Connector connector, Publication publication, string language, Dictionary> chapterCollection) { List newChaptersList = new(); if (!chapterCollection.ContainsKey(publication)) return newChaptersList; List currentChapters = chapterCollection[publication]; Chapter[] newChapters = connector.GetChapters(publication, language); newChaptersList = newChapters.ToList() .ExceptBy(currentChapters.Select(cChapter => cChapter.url), nChapter => nChapter.url).ToList(); return newChaptersList; } }