Compare commits

..

No commits in common. "2f411094771d59192185a3b2551415947ba35115" and "aebe0c70403a20e7a5b5a2c32669a621b4a30fd3" have entirely different histories.

2 changed files with 39 additions and 48 deletions

View file

@ -1,37 +1,37 @@
// I hereby waive this project under the public domain - see UNLICENSE for details. // I hereby waive this project under the public domain - see UNLICENSE for details.
const string banner = "=== Publish Times ===";
/// <summary> var numberOfArticles = 5; // Define how many articles to schedule
/// Generates a schedule of article publishing times, ensuring a randomized var startTime = new TimeSpan(9, 0, 0); // Starting time at 9:00 AM
/// delay between each while avoiding time conflicts within a 30-minute window. var rng = new Random();
/// </summary> var scheduledTimes = new List<TimeSpan>();
/// <returns>A list of TimeSpan objects representing scheduled article times.</returns> var storeSchedule = new List<String>();
List<TimeSpan> GenerateSchedule() // 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 baseDelayHours = rng.Next(2, 4); // Randomly choose between 2-3 hours delay
var startTime = new TimeSpan(9, 0, 0); // Starting time at 9:00 AM var minutesToAdd = rng.Next(0, 60); // Randomly choose minutes (0-59)
var rng = new Random();
var scheduledTimes = new List<TimeSpan>();
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 // If the new time is within 30 minutes of an existing time, adjust it
var minutesToAdd = rng.Next(0, 60); // Randomly choose minutes (0-59) nextTime = nextTime.Add(new TimeSpan(0, 30, 0));
// 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
} }
return scheduledTimes; scheduledTimes.Add(nextTime);
startTime = nextTime; // Update start time for the next article
} }
/// <summary> /// <summary>
@ -39,7 +39,7 @@ List<TimeSpan> GenerateSchedule()
/// </summary> /// </summary>
/// <param name="time">The TimeSpan representing the time of day.</param> /// <param name="time">The TimeSpan representing the time of day.</param>
/// <returns>A formatted string representing the time in AM/PM format.</returns> /// <returns>A formatted string representing the time in AM/PM format.</returns>
string ConvertTo12Hour(TimeSpan time) string TimeSpanToAMPM(TimeSpan time)
{ {
var minutes = time.TotalMinutes; var minutes = time.TotalMinutes;
var hours12 = time.Hours % 12; var hours12 = time.Hours % 12;
@ -56,22 +56,13 @@ string ConvertTo12Hour(TimeSpan time)
/// the directory, filename, and list of topics based on /// the directory, filename, and list of topics based on
/// a configuration file if available. /// a configuration file if available.
/// </summary> /// </summary>
void ExportSchedule(List<String> 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 cfgPath = Path.Combine(appDir, cfgFile);
var filePath = Path.Combine(fileDir, scheduleFile); var filePath = Path.Combine(fileDir, scheduleFile);
var appendSchedule = false; var appendSchedule = false;
var topic = ""; var topic = "";
var rng = new Random();
var chooseTopic = rng.Next(0, communities.Length); var chooseTopic = rng.Next(0, communities.Length);
topic = communities[chooseTopic]; topic = communities[chooseTopic];
@ -127,18 +118,15 @@ void ExportSchedule(List<String> storeSchedule)
/// Displays the scheduled article times in a formatted manner and provides /// Displays the scheduled article times in a formatted manner and provides
/// options to export the schedule or restart the scheduling process. /// options to export the schedule or restart the scheduling process.
/// </summary> /// </summary>
void PrintSchedule(bool isRestart = false) void PrintSchedule()
{ {
var storeSchedule = new List<String>();
var scheduledTimes = GenerateSchedule();
if (isRestart) if (isRestart)
Console.Clear(); Console.Clear();
Console.WriteLine("=== Publish Times ==="); Console.WriteLine(banner);
foreach (var time in scheduledTimes) 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 // Correct format string to display time in 12-hour format with AM/PM
Console.WriteLine(articleTime); Console.WriteLine(articleTime);
// Store the schedule to memory for option export // 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 // Give the user an option to export the schedule
Console.WriteLine($"{Environment.NewLine}Export? Y/N"); Console.WriteLine($"{Environment.NewLine}Export? Y/N");
if (Console.ReadKey().Key == ConsoleKey.Y) if (Console.ReadKey().Key == ConsoleKey.Y)
ExportSchedule(storeSchedule); ExportSchedule();
Console.WriteLine($"{Environment.NewLine}Start Over? Y/N"); Console.WriteLine($"{Environment.NewLine}Start Over? Y/N");
if (Console.ReadKey().Key == ConsoleKey.Y) if (Console.ReadKey().Key == ConsoleKey.Y)
PrintSchedule(true); {
isRestart = true;
PrintSchedule();
}
else else
{ {
Console.Clear(); Console.Clear();

View file

@ -1,10 +1,10 @@
# Publish Times # 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 ## 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 ## License