diff --git a/.config/dotnet-tools.json b/.config/dotnet-tools.json
deleted file mode 100644
index 393d187..0000000
--- a/.config/dotnet-tools.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "version": 1,
- "isRoot": true,
- "tools": {
- "csharpier": {
- "version": "0.30.6",
- "commands": [
- "dotnet-csharpier"
- ],
- "rollForward": false
- }
- }
-}
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
index d830f82..cbc3037 100644
--- a/.gitignore
+++ b/.gitignore
@@ -546,4 +546,4 @@ FodyWeavers.xsd
.idea/**
*.txt
*.toml
-example.json
\ No newline at end of file
+*.json
\ No newline at end of file
diff --git a/Config.cs b/Config.cs
index bff3157..9641754 100644
--- a/Config.cs
+++ b/Config.cs
@@ -7,18 +7,19 @@ namespace StaggerPost;
///
public class Config
{
- ///
- /// Gets or sets the name of the schedule file.
- ///
- public string? File { get; set; }
+ ///
+ /// Gets or sets the name of the schedule file.
+ ///
+ public string? File { get; set; }
- ///
- /// Gets or sets the directory path where the schedule file is stored.
- ///
- public string? Path { get; set; }
+ ///
+ /// Gets or sets the directory path where the schedule file is stored.
+ ///
+ public string? Path { get; set; }
+
+ ///
+ /// Gets or sets the list of available topics from the configuration file.
+ ///
+ public List Topics { get; set; } = new List();
- ///
- /// Gets or sets the list of available topics from the configuration file.
- ///
- public List Communities { get; set; } = new List();
}
diff --git a/Export.cs b/Export.cs
deleted file mode 100644
index 7d4e895..0000000
--- a/Export.cs
+++ /dev/null
@@ -1,128 +0,0 @@
-// I hereby waive this project under the public domain - see UNLICENSE for details.
-namespace StaggerPost;
-
-internal static class Export
-{
- ///
- /// Retrieves configuration settings from a TOML file if it exists; otherwise, returns a default configuration.
- ///
- /// The name of the configuration file (defaults to "config.toml").
- /// A Config object populated with values from the file, or a default Config instance if the file is not found.
- static Config GetConfig(string file)
- {
- var cfgPath = Path.Combine(Tracer.AppDirectory, file);
-
- if (!File.Exists(cfgPath))
- {
- Tracer.LogLine("Config file not found. Switching to defaults.");
- var defaultList = new[]
- {
- "games@lemmy.world",
- "politics@lemmy.world",
- "science@lemmy.world",
- "technology@lemmy.world",
- };
-
- var config = new Config()
- {
- File = "schedule.json",
- Path = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments),
- Communities = defaultList.ToList(),
- };
-
- return config;
- }
-
- Tracer.LogLine($"Discovered config file: {cfgPath}");
- var toml = File.ReadAllText(cfgPath);
- var model = Toml.ToModel(toml);
-
- return model;
- }
-
- ///
- /// Exports the scheduled articles to a file, allowing the user to modify
- /// the directory, filename, and list of topics based on
- /// a configuration file if available.
- ///
- public static void ToJSON(List storeTimes, string cfgPath)
- {
- // File directory is used for file location set in config
- var topics = new List();
- var config = GetConfig(cfgPath);
- var outputDir = Tracer.OutputDirectory(config.Path!);
- var outputFile = config.File;
- var filePath = Path.Combine(outputDir, outputFile!);
- var chosenTopic = "";
- var times = new List();
-
- // If the config file exists, read from that but don't assume anything is filled
- if (File.Exists(cfgPath))
- {
- var toml = File.ReadAllText(cfgPath);
- var usrDir = config.Path;
- var usrFileName = config.File;
- // Convert list into array
- var list = config.Communities;
- var tomlList = string.Join(", ", list);
- var usrTopics = tomlList.Split(',');
-
- if (string.IsNullOrEmpty(usrDir))
- return;
-
- outputDir = usrDir;
-
- if (string.IsNullOrEmpty(usrFileName))
- return;
-
- outputFile = usrFileName;
-
- // If array is empty, return; otherwise, apply config
- if (usrTopics.Length < 0)
- return;
-
- foreach (var usrTopic in usrTopics)
- topics.Add(usrTopic);
-
- // Set new file Path
- filePath = Path.Combine(outputDir, outputFile!);
- }
-
- if (!File.Exists(filePath))
- File.WriteAllText(filePath, "[]");
-
- foreach (var time in storeTimes)
- times.Add(time.Trim());
-
- // Set new topic
- topics = config.Communities.ToList();
- Console.Clear();
- chosenTopic = Interactive.SelectTopics(topics);
-
- var date = Interactive.SelectDate();
-
- // Write to file.
- var jsonFile = File.ReadAllText(filePath);
- var jsonList = string.IsNullOrWhiteSpace(jsonFile)
- ? new List()
- : JsonSerializer.Deserialize>(jsonFile) ?? new List();
-
- jsonList.Add(
- new Schedule()
- {
- Community = chosenTopic.Trim(),
- Date = date.Trim(),
- Times = times,
- }
- );
-
- var jsonOptions = new JsonSerializerOptions() { WriteIndented = true };
-
- var json = JsonSerializer.Serialize(jsonList, jsonOptions);
- File.WriteAllText(filePath, json);
- Tracer.LogLine($"{json}{Environment.NewLine}Written to: {filePath}");
-
- // Clear list from memory
- storeTimes.Clear();
- }
-}
diff --git a/Generator.cs b/Generator.cs
deleted file mode 100644
index d0cd437..0000000
--- a/Generator.cs
+++ /dev/null
@@ -1,60 +0,0 @@
-// I hereby waive this project under the public domain - see UNLICENSE for details.
-namespace StaggerPost;
-
-internal static class Generator
-{
- ///
- /// 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.
- public static List GenerateTimes()
- {
- 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();
-
- for (int i = 0; i < numberOfArticles; i++)
- {
- 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
- }
-
- return scheduledTimes;
- }
-
- ///
- /// Converts a TimeSpan into a 12-hour AM/PM formatted time string.
- ///
- /// The TimeSpan representing the time of day.
- /// A formatted string representing the time in AM/PM format.
- public static string ConvertTo12Hour(TimeSpan time)
- {
- var minutes = time.TotalMinutes;
- var hours12 = time.Hours % 12;
-
- if (hours12 == 0)
- hours12 = 1;
-
- var period = time.Hours >= 12 ? "PM" : "AM";
- return $"{hours12}:{time.Minutes:D2} {period}";
- }
-}
diff --git a/GlobalUsings.cs b/GlobalUsings.cs
index 40e65af..6a39b5d 100644
--- a/GlobalUsings.cs
+++ b/GlobalUsings.cs
@@ -1,7 +1,6 @@
global using System.Diagnostics;
-global using System.Text;
-global using System.Text.Json;
-global using System.Text.Json.Serialization;
-global using StaggerPost;
global using Tomlyn;
global using Tomlyn.Model;
+global using StaggerPost;
+global using System.Text.Json;
+global using System.Text.Json.Serialization;
\ No newline at end of file
diff --git a/Interactive.cs b/Interactive.cs
deleted file mode 100644
index 5978eba..0000000
--- a/Interactive.cs
+++ /dev/null
@@ -1,93 +0,0 @@
-// I hereby waive this project under the public domain - see UNLICENSE for details.
-namespace StaggerPost;
-
-internal static class Interactive
-{
- ///
- /// Prompts the user with a yes/no question and returns their choice as a boolean value.
- ///
- /// The message to display to the user.
- /// True if the user selects 'Y' or presses Enter, otherwise false.
- public static bool UserChoice(string choice)
- {
- Console.WriteLine($"{Environment.NewLine}{choice} Y/N");
- var input = Console.ReadKey().Key;
- if (input == ConsoleKey.Y || input == ConsoleKey.Enter)
- return true;
-
- return false;
- }
-
- ///
- /// Prompts the user to select a topic from a given list
- /// and returns the chosen topic.
- ///
- /// An array of available topics.
- /// The selected topic as a string.
- public static string SelectTopics(List communities)
- {
- var topicChoice = "";
- var topicNum = 0;
- var userChoices = new List();
- var numOfTopics = 0;
- var topicDict = new Dictionary();
-
- foreach (var community in communities)
- {
- numOfTopics++;
- var title = community.Trim();
- topicDict.Add(numOfTopics, title);
- userChoices.Add($"{Environment.NewLine}{numOfTopics} {title}");
- }
-
- var topicSelect = string.Join(", ", userChoices.ToArray());
- Console.WriteLine($"Choose a Topic{Environment.NewLine}{topicSelect}");
- var input = Console.ReadLine();
-
- // Attempt to parse a number.
- if (int.TryParse(input, out topicNum) == true)
- topicChoice = topicDict[topicNum];
- else
- SelectTopics(communities);
-
- return topicChoice;
- }
-
- ///
- /// Prompts the user to select a date (either today or tomorrow) and returns the selected date as a formatted string.
- ///
- /// A string representing the selected date in a short date format.
- public static string SelectDate()
- {
- var dtChoices = new[] { "Today", "Tomorrow" };
- var dtDict = new Dictionary();
- var dtSelection = new List();
- var dtChoice = 0;
- var dtNum = 0;
-
- foreach (var days in dtChoices)
- {
- dtNum++;
- var day = days.Trim();
- dtDict.Add(dtNum, day);
- dtSelection.Add($"{dtNum} {day}");
- }
-
- var topicSelect = string.Join(", ", dtSelection.ToArray());
- Console.WriteLine($"{Environment.NewLine}Choose a Date{Environment.NewLine}{topicSelect}");
- var input = Console.ReadLine();
-
- // Attempt to parse a number.
- if (int.TryParse(input, out dtNum) == true)
- dtChoice = dtNum;
-
- // Any choice above 2 tomorrow
- if (dtChoice >= 2)
- {
- var dt = DateTime.Now.AddDays(1);
- return dt.ToString("d");
- }
-
- return DateTime.Today.ToString("d");
- }
-}
diff --git a/Program.cs b/Program.cs
index 754ae66..2b8e318 100644
--- a/Program.cs
+++ b/Program.cs
@@ -1,41 +1,322 @@
// I hereby waive this project under the public domain - see UNLICENSE for details.
+///
+/// Retrieves configuration settings from a TOML file if it exists; otherwise, returns a default configuration.
+///
+/// The name of the configuration file (defaults to "config.toml").
+/// A Config object populated with values from the file, or a default Config instance if the file is not found.
+Config GetConfig(string file = "config.toml")
+{
+ // App directory is used for config file
+ var appDir = AppDomain.CurrentDomain.BaseDirectory;
+ var cfgPath = Path.Combine(appDir, file);
+
+ if (File.Exists(cfgPath))
+ {
+ var toml = File.ReadAllText(cfgPath);
+ var model = Toml.ToModel(toml);
+
+ return model;
+ }
+ var defaultList = new[] { "Games", "Politics", "Research", "Technology" };
+ return new Config()
+ {
+ File = "schedule.json",
+ Path = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments),
+ Topics = defaultList.ToList()
+ };
+}
+
+///
+/// Prompts the user with a yes/no question and returns their choice as a boolean value.
+///
+/// The message to display to the user.
+/// True if the user selects 'Y' or presses Enter, otherwise false.
+bool UserChoice(string choice)
+{
+ Console.WriteLine($"{Environment.NewLine}{choice} Y/N");
+ var input = Console.ReadKey().Key;
+ if (input == ConsoleKey.Y || input == ConsoleKey.Enter)
+ return true;
+
+ return false;
+}
+
+///
+/// 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 GenerateTimes()
+{
+ 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();
+
+ for (int i = 0; i < numberOfArticles; i++)
+ {
+ 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
+ }
+
+ return scheduledTimes;
+}
+
+///
+/// Converts a TimeSpan into a 12-hour AM/PM formatted time string.
+///
+/// The TimeSpan representing the time of day.
+/// A formatted string representing the time in AM/PM format.
+string ConvertTo12Hour(TimeSpan time)
+{
+ var minutes = time.TotalMinutes;
+ var hours12 = time.Hours % 12;
+
+ if (hours12 == 0)
+ hours12 = 1;
+
+ var period = time.Hours >= 12 ? "PM" : "AM";
+ return $"{hours12}:{time.Minutes:D2} {period}";
+}
+
+///
+/// Prompts the user to select a topic from a given list
+/// and returns the chosen topic.
+///
+/// An array of available topics.
+/// The selected topic as a string.
+string SelectTopics(List topics)
+{
+ var topicChoice = "";
+ var topicNum = 0;
+ var userChoices = new List();
+ var numOfTopics = 0;
+ var topicDict = new Dictionary();
+
+ foreach (var topic in topics)
+ {
+ numOfTopics++;
+ var title = topic.Trim();
+ topicDict.Add(numOfTopics, title);
+ userChoices.Add($"{numOfTopics} {title}");
+ }
+
+ var topicSelect = string.Join(", ", userChoices.ToArray());
+ Console.WriteLine($"{Environment.NewLine}Choose a Topic{Environment.NewLine}{topicSelect}");
+ var input = Console.ReadLine();
+
+ // Attempt to parse a number.
+ if (int.TryParse(input, out topicNum) == true)
+ topicChoice = topicDict[topicNum];
+ else
+ NewTopic(topics);
+
+ return topicChoice;
+}
+
+///
+/// Prompts the user to select a date (either today or tomorrow) and returns the selected date as a formatted string.
+///
+/// A string representing the selected date in a short date format.
+string SelectDate()
+{
+ var dtChoices = new[] { "Today", "Tomorrow" };
+ var dtDict = new Dictionary();
+ var dtSelection = new List();
+ var dtChoice = 0;
+ var dtNum = 0;
+
+ foreach (var days in dtChoices)
+ {
+ dtNum++;
+ var day = days.Trim();
+ dtDict.Add(dtNum, day);
+ dtSelection.Add($"{dtNum} {day}");
+ }
+
+ var topicSelect = string.Join(", ", dtSelection.ToArray());
+ Console.WriteLine($"{Environment.NewLine}Choose a Date{Environment.NewLine}{topicSelect}");
+ var input = Console.ReadLine();
+
+ // Attempt to parse a number.
+ if (int.TryParse(input, out dtNum) == true)
+ dtChoice = dtNum;
+
+ // Any choice above 2 tomorrow
+ if (dtChoice >= 2)
+ {
+ var dt = DateTime.Now.AddDays(1);
+ return dt.ToString("d");
+ }
+
+ return DateTime.Today.ToString("d");
+}
+
+///
+/// Allows the user to choose a new topic from a given list or default to placeholder if no selection is made.
+///
+/// A list of available topics.
+/// The selected topic or a default placeholder if none is chosen.
+string NewTopic(List topics)
+{
+ var newTopic = "";
+
+ if (UserChoice("Choose a Topic?"))
+ newTopic = SelectTopics(topics);
+ else
+ newTopic = "Any";
+
+ return newTopic;
+}
+
+///
+/// Exports the scheduled articles to a file, allowing the user to modify
+/// the directory, filename, and list of topics based on
+/// a configuration file if available.
+///
+void ExportSchedule(List storeTimes)
+{
+ // App directory is used for config file
+ var appDir = Tracer.AppDirectory;
+ // File directory is used for file location set in config
+ var outputDir = Directory.GetCurrentDirectory();
+ var cfgFile = "config.toml";
+
+ var topics = new List();
+ var cfgPath = Path.Combine(appDir, cfgFile);
+ var config = GetConfig(cfgPath);
+ var outputFile = config.File;
+ var filePath = Path.Combine(outputDir, outputFile!);
+ var chosenTopic = "";
+ var times = new List();
+
+
+ // If the config file exists, read from that but don't assume anything is filled
+ if (File.Exists(cfgPath))
+ {
+ Tracer.WriteLine(cfgPath);
+ var toml = File.ReadAllText(cfgPath);
+ var usrDir = config.Path;
+ var usrFileName = config.File;
+ // Convert list into array
+ var list = config.Topics;
+ var tomlList = string.Join(", ", list);
+ var usrTopics = tomlList.Split(',');
+
+ if (string.IsNullOrEmpty(usrDir))
+ return;
+
+ outputDir = usrDir;
+
+ if (string.IsNullOrEmpty(usrFileName))
+ return;
+
+ outputFile = usrFileName;
+
+ // If array is empty, return; otherwise, apply config
+ if (usrTopics.Length < 0)
+ return;
+
+ foreach (var usrTopic in usrTopics)
+ topics.Add(usrTopic);
+
+
+ // Set new file Path
+ filePath = Path.Combine(outputDir, outputFile!);
+ }
+
+ if (!File.Exists(filePath))
+ File.WriteAllText(filePath, "[]");
+
+ foreach (var time in storeTimes)
+ times.Add(time.Trim());
+
+ // Set new topic
+ topics = config.Topics.ToList();
+ chosenTopic = NewTopic(topics);
+
+ var date = SelectDate();
+
+ // Write to file.
+ var jsonContent = File.ReadAllText(filePath);
+ var jsonList = string.IsNullOrWhiteSpace(jsonContent) ? new List()
+ : JsonSerializer.Deserialize>(jsonContent) ?? new List();
+
+
+ jsonList.Add(new Schedule()
+ {
+ Topic = chosenTopic.Trim(),
+ Date = date.Trim(),
+ Times = times,
+ });
+
+ var jsonOptions = new JsonSerializerOptions()
+ {
+ WriteIndented = true,
+ };
+
+ var jsonString = JsonSerializer.Serialize(jsonList, jsonOptions);
+ File.WriteAllText(filePath, jsonString);
+ Tracer.WriteLine($"{jsonString}{Environment.NewLine}Written to: {filePath}");
+
+ // Clear list from memory
+ storeTimes.Clear();
+}
+
///
/// Displays the scheduled article times in a formatted manner and provides
/// options to export the schedule or restart the scheduling process.
///
-void PrintTimes()
+void PrintTimes(bool isRestart = false)
{
- var storeSchedule = new List();
- var scheduledTimes = Generator.GenerateTimes();
+ var storeSchedule = new List();
+ var scheduledTimes = GenerateTimes();
- // Clear the screen on restart
- Console.Clear();
+ // Clear the screen on restart
+ if (isRestart)
+ Console.Clear();
- Console.WriteLine("=== Publish Times ===");
- foreach (var time in scheduledTimes)
- {
- var articleTime = $"{Generator.ConvertTo12Hour(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
- storeSchedule.Add(articleTime);
- }
+ Console.WriteLine("=== Publish Times ===");
+ foreach (var time in scheduledTimes)
+ {
+ var articleTime = $"{ConvertTo12Hour(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
+ storeSchedule.Add(articleTime);
+ }
- // Give the user an option to export the schedule
- if (Interactive.UserChoice("Retry?"))
- PrintTimes();
+ // Give the user an option to export the schedule
+ if (UserChoice("Retry?"))
+ PrintTimes(true);
- // Give the user an option to export the schedule
- Export.ToJSON(storeSchedule, "config.toml");
+ // Give the user an option to export the schedule
+ if (UserChoice("Export?"))
+ ExportSchedule(storeSchedule);
- if (Interactive.UserChoice("Generate A New Batch?"))
- PrintTimes();
- else
- {
- Console.Clear();
- Environment.Exit(Environment.ExitCode);
- }
+ if (UserChoice("Generate A New Batch?"))
+ PrintTimes(true);
+ else
+ {
+ Console.Clear();
+ Environment.Exit(Environment.ExitCode);
+ }
}
// Start the loop
diff --git a/README.md b/README.md
index 0c30b34..6d51334 100644
--- a/README.md
+++ b/README.md
@@ -1,8 +1,8 @@
-# Stagger Post
+# StaggerPost
-This is a very simple console application that suggests a list of times to post news articles within a randomized 2-3 hour and 30-minute delay to avoid conflicts. This keeps thing flowing at an organic and slow pace.
+This is a very simple console application that generates a list of times to publish news articles within a randomized 2-3 hour delay within a 30-minute window to avoid conflicts. This keeps thing flowing at an organic and slow pace.
-It is not recommended for use with breaking news, of course. Instead, you should focus on overlooked local news or op-eds. Of course, this is just covering general news. It is really good niche communities.
+It is not recommended for use with hot topics. Instead, you should focus on overlooked foreign affairs, local news or op-eds. Of course, this is just covering general news.
## Exporting
@@ -17,14 +17,14 @@ An optional ``config.toml`` file allows for further customization of file name,
```json
[
{
- "community": "games@lemmy.world",
- "date": "3/22/2025",
+ "topic": "Games",
+ "date": "3/16/2025",
"times": [
- "1:34 PM",
- "3:03 PM",
- "5:27 PM",
- "9:13 PM",
- "11:37 PM"
+ "11:41 AM",
+ "2:05 PM",
+ "5:05 PM",
+ "8:18 PM",
+ "11:02 PM"
]
}
]
diff --git a/Schedule.cs b/Schedule.cs
index 0591288..c430bc9 100644
--- a/Schedule.cs
+++ b/Schedule.cs
@@ -1,11 +1,12 @@
+
public class Schedule
{
- [JsonPropertyName("community")]
- public string Community { get; set; } = "";
+ [JsonPropertyName("topic")]
+ public string Topic { get; set; } = "";
- [JsonPropertyName("date")]
- public string Date { get; set; } = "";
+ [JsonPropertyName("date")]
+ public string Date { get; set; } = "";
- [JsonPropertyName("times")]
- public IList Times { get; set; } = new List();
+ [JsonPropertyName("times")]
+ public IList Times { get; set; } = new List();
}
diff --git a/Tracer.cs b/Tracer.cs
index 8ab4550..ca6190e 100644
--- a/Tracer.cs
+++ b/Tracer.cs
@@ -7,81 +7,60 @@ namespace StaggerPost;
///
internal static class Tracer
{
- const string LOG = "[LOG]:";
+ ///
+ /// Writes a line of text to the console, but only when in DEBUG mode.
+ ///
+ /// The text to write to the console.
+ [Conditional("DEBUG")]
+ internal static void WriteLine(string content) =>
+ Console.WriteLine(content);
- ///
- /// Writes a line of text to the console, but only when in DEBUG mode.
- ///
- /// The text to write to the console.
- [Conditional("DEBUG")]
- internal static void LogLine(string content) => Console.WriteLine($"{LOG} {content}");
+ ///
+ /// Writes text to the console without a newline, but only when in DEBUG mode.
+ ///
+ /// The text to write to the console.
+ [Conditional("DEBUG")]
+ internal static void Write(string content) =>
+ Console.Write(content);
- ///
- /// Writes text to the console without a newline, but only when in DEBUG mode.
- ///
- /// The text to write to the console.
- [Conditional("DEBUG")]
- internal static void Log(string content) => Console.Write($"{LOG} {content}");
+ ///
+ /// Writes multiple lines of text to the console, but only when in DEBUG mode.
+ ///
+ /// A collection of text lines to write to the console.
+ [Conditional("DEBUG")]
+ internal static void WriteLine(IEnumerable contents)
+ {
+ foreach (var content in contents)
+ {
+ Console.WriteLine(content);
+ }
+ }
- ///
- /// Writes multiple lines of text to the console, but only when in DEBUG mode.
- ///
- /// A collection of text lines to write to the console.
- [Conditional("DEBUG")]
- internal static void LogLine(IEnumerable contents)
- {
- foreach (var content in contents)
- {
- Console.WriteLine($"{LOG} {content}");
- }
- }
+ ///
+ /// Writes multiple text entries to the console without newlines, but only when in DEBUG mode.
+ ///
+ /// A collection of text entries to write to the console.
+ [Conditional("DEBUG")]
+ internal static void Write(IEnumerable contents)
+ {
+ foreach (var content in contents)
+ {
+ Console.Write(content);
+ }
+ }
- ///
- /// Writes multiple text entries to the console without newlines, but only when in DEBUG mode.
- ///
- /// A collection of text entries to write to the console.
- [Conditional("DEBUG")]
- internal static void Log(IEnumerable contents)
- {
- foreach (var content in contents)
- {
- Console.Write($"{LOG} {content}");
- }
- }
-
- ///
- /// Gets the current working directory in DEBUG mode or the application's base directory in release mode.
- ///
- internal static string AppDirectory
- {
- get
- {
+ ///
+ /// Gets the current working directory in DEBUG mode or the application's base directory in release mode.
+ ///
+ internal static string AppDirectory
+ {
+ get
+ {
#if DEBUG
- return Directory.GetCurrentDirectory();
+ return Directory.GetCurrentDirectory();
#else
- return AppDomain.CurrentDomain.BaseDirectory;
+ return AppDomain.CurrentDomain.BaseDirectory;
#endif
- }
- }
-
- ///
- /// Determines the appropriate output directory based on the given directory path.
- /// In DEBUG mode, it always returns the current working directory.
- /// In release mode, it returns the provided directory unless it contains a '/', in which case it defaults to the current directory.
- ///
- /// The directory path to evaluate.
- /// The resolved output directory as a string.
- internal static string OutputDirectory(string dir)
- {
- var curDir = Directory.GetCurrentDirectory();
-
-#if DEBUG
- return curDir;
-#else
- if (dir.Contains("/"))
- return curDir;
-
- return dir;
-#endif
- }
+ }
+ }
}
diff --git a/config.toml.sample b/config.toml.sample
index 2fe4c1e..c17da12 100644
--- a/config.toml.sample
+++ b/config.toml.sample
@@ -1,6 +1,6 @@
-path = "/"
-file = "example.json"
-communities = [
+path = "/home/tonytins/Documents/"
+file = "newscycle.json"
+topics = [
"Games",
"News",
"Science",