diff --git a/Program.cs b/Program.cs index 279ba50..1001e23 100644 --- a/Program.cs +++ b/Program.cs @@ -1,37 +1,37 @@ // I hereby waive this project under the public domain - see UNLICENSE for details. +const string banner = "=== Publish Times ==="; -/// -/// Generates a schedule of article publishing times, ensuring a randomized -/// delay between each while avoiding time conflicts within a 30-minute window. -/// -/// A list of TimeSpan objects representing scheduled article times. -List GenerateSchedule() +var numberOfArticles = 5; // Define how many articles to schedule +var startTime = new TimeSpan(9, 0, 0); // Starting time at 9:00 AM +var rng = new Random(); +var scheduledTimes = new List(); +var storeSchedule = new List(); +// App directory is used for config file +var appDir = Directory.GetCurrentDirectory(); +// File directory is used for file location set in config +var fileDir = Directory.GetCurrentDirectory(); +var isRestart = false; +var communities = new[] { "Games", "Politics", "Research", "Technology" }; +var scheduleFile = "schedule.txt"; +var cfgFile = "config.toml"; + +for (int i = 0; i < numberOfArticles; i++) { - var numberOfArticles = 5; // Define how many articles to schedule - var startTime = new TimeSpan(9, 0, 0); // Starting time at 9:00 AM - var rng = new Random(); - var scheduledTimes = new List(); + var baseDelayHours = rng.Next(2, 4); // Randomly choose between 2-3 hours delay + var minutesToAdd = rng.Next(0, 60); // Randomly choose minutes (0-59) - for (int i = 0; i < numberOfArticles; i++) + // Calculate new time by adding base delay and random minutes + var nextTime = startTime.Add(new TimeSpan(baseDelayHours, minutesToAdd, 0)); + + // Check if the new time is within 30 minutes of any existing time + while (scheduledTimes.Exists(previousTime => Math.Abs((nextTime - previousTime).TotalMinutes) < 30)) { - var baseDelayHours = rng.Next(2, 4); // Randomly choose between 2-3 hours delay - var minutesToAdd = rng.Next(0, 60); // Randomly choose minutes (0-59) - - // Calculate new time by adding base delay and random minutes - var nextTime = startTime.Add(new TimeSpan(baseDelayHours, minutesToAdd, 0)); - - // Check if the new time is within 30 minutes of any existing time - while (scheduledTimes.Exists(previousTime => Math.Abs((nextTime - previousTime).TotalMinutes) < 30)) - { - // If the new time is within 30 minutes of an existing time, adjust it - nextTime = nextTime.Add(new TimeSpan(0, 30, 0)); - } - - scheduledTimes.Add(nextTime); - startTime = nextTime; // Update start time for the next article + // If the new time is within 30 minutes of an existing time, adjust it + nextTime = nextTime.Add(new TimeSpan(0, 30, 0)); } - return scheduledTimes; + scheduledTimes.Add(nextTime); + startTime = nextTime; // Update start time for the next article } /// @@ -39,7 +39,7 @@ List GenerateSchedule() /// /// The TimeSpan representing the time of day. /// A formatted string representing the time in AM/PM format. -string ConvertTo12Hour(TimeSpan time) +string TimeSpanToAMPM(TimeSpan time) { var minutes = time.TotalMinutes; var hours12 = time.Hours % 12; @@ -56,22 +56,13 @@ string ConvertTo12Hour(TimeSpan time) /// the directory, filename, and list of topics based on /// a configuration file if available. /// -void ExportSchedule(List storeSchedule) +void ExportSchedule() { - // App directory is used for config file - var appDir = Directory.GetCurrentDirectory(); - // File directory is used for file location set in config - var fileDir = Directory.GetCurrentDirectory(); - var communities = new[] { "Games", "Politics", "Research", "Technology" }; - var scheduleFile = "schedule.txt"; - var cfgFile = "config.toml"; - var cfgPath = Path.Combine(appDir, cfgFile); var filePath = Path.Combine(fileDir, scheduleFile); var appendSchedule = false; var topic = ""; - var rng = new Random(); var chooseTopic = rng.Next(0, communities.Length); topic = communities[chooseTopic]; @@ -127,18 +118,15 @@ void ExportSchedule(List storeSchedule) /// Displays the scheduled article times in a formatted manner and provides /// options to export the schedule or restart the scheduling process. /// -void PrintSchedule(bool isRestart = false) +void PrintSchedule() { - var storeSchedule = new List(); - var scheduledTimes = GenerateSchedule(); - if (isRestart) Console.Clear(); - Console.WriteLine("=== Publish Times ==="); + Console.WriteLine(banner); foreach (var time in scheduledTimes) { - var articleTime = $"Article {scheduledTimes.IndexOf(time) + 1} Scheduled at: {ConvertTo12Hour(time)}"; + var articleTime = $"Article {scheduledTimes.IndexOf(time) + 1} Scheduled at: {TimeSpanToAMPM(time)}"; // Correct format string to display time in 12-hour format with AM/PM Console.WriteLine(articleTime); // Store the schedule to memory for option export @@ -148,11 +136,14 @@ void PrintSchedule(bool isRestart = false) // Give the user an option to export the schedule Console.WriteLine($"{Environment.NewLine}Export? Y/N"); if (Console.ReadKey().Key == ConsoleKey.Y) - ExportSchedule(storeSchedule); + ExportSchedule(); Console.WriteLine($"{Environment.NewLine}Start Over? Y/N"); if (Console.ReadKey().Key == ConsoleKey.Y) - PrintSchedule(true); + { + isRestart = true; + PrintSchedule(); + } else { Console.Clear(); diff --git a/README.md b/README.md index 658035a..98d5dd7 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,10 @@ # Publish Times -This is a very simple console application that generates a list of times to publish news articles within a randomized 2-3 hour delay while avoiding time conflicts within a 30-minute window. +This is a very simple console application that generates a list of times to schedule news with a 2-3 hour delay and a 30 minute time gap per-article. ## Background -A while back, I [found a tool](https://schedule.lemmings.world) to schedule articles on Lemmy. I've been posting within a few hours apart at random minutes and I wanted to something decide that for me. I had AI write the base algorithm, everything else is my own touches. +A while back, I [found a tool](https://schedule.lemmings.world) to schedule articles on Lemmy. I've been posting within a few hour apart at random minutes and I wanted to something decide that for me. I had AI write the base algorithm everything else is my own touches. ## License