diff --git a/Content.Client/Changelog/ChangelogManager.cs b/Content.Client/Changelog/ChangelogManager.cs index 249332c337f..0d9ab6f0201 100644 --- a/Content.Client/Changelog/ChangelogManager.cs +++ b/Content.Client/Changelog/ChangelogManager.cs @@ -3,6 +3,7 @@ using System.Globalization; using System.IO; using System.Linq; +using System.Text.RegularExpressions; using System.Threading.Tasks; using Content.Shared.CCVar; using Robust.Shared.Configuration; @@ -25,8 +26,8 @@ public sealed partial class ChangelogManager [Dependency] private readonly IConfigurationManager _configManager = default!; public bool NewChangelogEntries { get; private set; } - public int LastReadId { get; private set; } - public int MaxId { get; private set; } + public DateTime LastReadTime { get; private set; } // Modified, see EOF + public DateTime MaxTime { get; private set; } // Modified, see EOF public event Action? NewChangelogEntriesChanged; @@ -35,7 +36,7 @@ public sealed partial class ChangelogManager /// stores the new ID to disk and clears . /// /// - /// is NOT cleared + /// is NOT cleared /// since that's used in the changelog menu to show the "since you last read" bar. /// public void SaveNewReadId() @@ -43,9 +44,9 @@ public void SaveNewReadId() NewChangelogEntries = false; NewChangelogEntriesChanged?.Invoke(); - using var sw = _resource.UserData.OpenWriteText(new ($"/changelog_last_seen_{_configManager.GetCVar(CCVars.ServerId)}")); + using var sw = _resource.UserData.OpenWriteText(new ($"/changelog_last_seen_{_configManager.GetCVar(CCVars.ServerId)}_datetime")); // Modified, see EOF - sw.Write(MaxId.ToString()); + sw.Write(MaxTime.ToString("O")); // Modified, see EOF } public async void Initialize() @@ -58,24 +59,46 @@ public async void Initialize() return; } - MaxId = changelog.Max(c => c.Id); + MaxTime = changelog.Max(c => c.Time); // Modified, see EOF - var path = new ResPath($"/changelog_last_seen_{_configManager.GetCVar(CCVars.ServerId)}"); - if(_resource.UserData.TryReadAllText(path, out var lastReadIdText)) + // Begin modified codeblock, see EOF + var path = new ResPath($"/changelog_last_seen_{_configManager.GetCVar(CCVars.ServerId)}_datetime"); + if(_resource.UserData.TryReadAllText(path, out var lastReadTimeText)) { - LastReadId = int.Parse(lastReadIdText); + if (Regex.IsMatch(lastReadTimeText, + @"^([\+-]?\d{4}(?!\d{2}\b))((-?)((0[1-9]|1[0-2])(\3([12]\d|0[1-9]|3[01]))?|W([0-4]\d|5[0-2])(-?[1-7])?|(00[1-9]|0[1-9]\d|[12]\d{2}|3([0-5]\d|6[1-6])))([T\s]((([01]\d|2[0-3])((:?)[0-5]\d)?|24\:?00)([\.,]\d+(?!:))?)?(\17[0-5]\d([\.,]\d+)?)?([zZ]|([\+-])([01]\d|2[0-3]):?([0-5]\d)?)?)?)?$")) + { + LastReadTime = DateTime.ParseExact(lastReadTimeText, "O", CultureInfo.InvariantCulture); + } } - NewChangelogEntries = LastReadId < MaxId; + NewChangelogEntries = LastReadTime < MaxTime; + // End modified codeblock NewChangelogEntriesChanged?.Invoke(); } - public Task> LoadChangelog() + // Begin modified codeblock, see EOF + public async Task> LoadChangelog() + { + var paths = _resource.ContentFindFiles("/Changelog/") + .Where(filePath => filePath.Extension == "yml") + .ToArray(); + + var result = new List(); + foreach (var path in paths) + { + var changelog = await LoadChangelogFile(path); + result = result.Union(changelog).ToList(); + } + return result.OrderBy(x => x.Time).ToList(); + } + + private Task> LoadChangelogFile(ResPath path) // end modified codeblock { return Task.Run(() => { - var yamlData = _resource.ContentFileReadYaml(new ("/Changelog/Changelog.yml")); + var yamlData = _resource.ContentFileReadYaml(path); // Modified, see EOF if (yamlData.Documents.Count == 0) return new List(); @@ -126,3 +149,7 @@ public enum ChangelogLineType } } } + + +// This file was extensively modified to allow for datetime based changelogs instead of relying on IDs. +// This is because our IDs are much lower then Wizdens, and if we use their entries, the server will not properly show new changes diff --git a/Content.Client/Changelog/ChangelogWindow.xaml.cs b/Content.Client/Changelog/ChangelogWindow.xaml.cs index cea5bd9e7c2..9c3da72ffbf 100644 --- a/Content.Client/Changelog/ChangelogWindow.xaml.cs +++ b/Content.Client/Changelog/ChangelogWindow.xaml.cs @@ -48,13 +48,13 @@ private async void PopulateChangelog() .GroupBy(e => e.Time.ToLocalTime().Date) .OrderByDescending(c => c.Key); - var hasRead = _changelog.MaxId <= _changelog.LastReadId; + var hasRead = _changelog.MaxTime <= _changelog.LastReadTime; // Modified, see EOF foreach (var dayEntries in byDay) { var day = dayEntries.Key; var groupedEntries = dayEntries - .GroupBy(c => (c.Author, Read: c.Id <= _changelog.LastReadId)) + .GroupBy(c => (c.Author, Read: c.Time <= _changelog.LastReadTime)) // Modified, see EOF .OrderBy(c => c.Key.Read) .ThenBy(c => c.Key.Author); @@ -203,3 +203,6 @@ public void Execute(IConsoleShell shell, string argStr, string[] args) } } } + +// This file was extensively modified to allow for datetime based changelogs instead of relying on IDs. +// This is because our IDs are much lower then Wizdens, and if we use their entries, the server will not properly show new changes diff --git a/Tools/actions_changelogs_since_last_run.py b/Tools/actions_changelogs_since_last_run.py index 0c46cd22ec8..a2501753a67 100755 --- a/Tools/actions_changelogs_since_last_run.py +++ b/Tools/actions_changelogs_since_last_run.py @@ -19,7 +19,7 @@ DISCORD_WEBHOOK_URL = os.environ.get("DISCORD_WEBHOOK_URL") -CHANGELOG_FILE = "Resources/Changelog/Changelog.yml" +CHANGELOG_FILE = "Resources/Changelog/DeltaVChangelog.yml" TYPES_TO_EMOJI = { "Fix": "🐛", @@ -130,4 +130,4 @@ def send_to_discord(entries: Iterable[ChangelogEntry]) -> None: requests.post(DISCORD_WEBHOOK_URL, json=body) -main() \ No newline at end of file +main()