From 5c6ea280669d598321807e07cebe46c9c34cdb07 Mon Sep 17 00:00:00 2001 From: Archangel Date: Sat, 6 Dec 2025 02:01:56 +0100 Subject: [PATCH] Improve backup service compatibility with different calendars --- .../Services/BackupService.cs | 42 +++++++++++++++---- 1 file changed, 35 insertions(+), 7 deletions(-) diff --git a/Libraries/SPTarkov.Server.Core/Services/BackupService.cs b/Libraries/SPTarkov.Server.Core/Services/BackupService.cs index 4b450f68..d2300a50 100644 --- a/Libraries/SPTarkov.Server.Core/Services/BackupService.cs +++ b/Libraries/SPTarkov.Server.Core/Services/BackupService.cs @@ -30,6 +30,16 @@ public class BackupService protected readonly TimeUtil TimeUtil; protected readonly IReadOnlyList LoadedMods; + private static readonly CultureInfo[] Cultures = + [ + CultureInfo.InvariantCulture, + new CultureInfo("fa-IR") { DateTimeFormat = { Calendar = new PersianCalendar() } }, + new CultureInfo("ar-SA") { DateTimeFormat = { Calendar = new HijriCalendar() } }, + new CultureInfo("he-IL") { DateTimeFormat = { Calendar = new HebrewCalendar() } }, + new CultureInfo("th-TH") { DateTimeFormat = { Calendar = new ThaiBuddhistCalendar() } }, + new CultureInfo("ja-JP") { DateTimeFormat = { Calendar = new JapaneseCalendar() } }, + ]; + public BackupService( ISptLogger logger, IReadOnlyList loadedMods, @@ -233,9 +243,9 @@ public class BackupService } } - protected SortedDictionary GetBackupPathsWithCreationTimestamp(IEnumerable backupPaths) + protected SortedDictionary GetBackupPathsWithCreationTimestamp(IEnumerable backupPaths) { - var result = new SortedDictionary(); + var result = new SortedDictionary(); foreach (var backupPath in backupPaths) { var date = ExtractDateFromFolderName(backupPath); @@ -244,7 +254,7 @@ public class BackupService continue; } - result.Add(date.Value.ToFileTimeUtc(), backupPath); + result.Add(date.Value, backupPath); } return result; @@ -297,7 +307,7 @@ public class BackupService return 0; // Skip comparison if either date is invalid. } - return (int)(dateA.Value.ToFileTimeUtc() - dateB.Value.ToFileTimeUtc()); + return dateA.Value.CompareTo(dateB.Value); } /// @@ -308,11 +318,29 @@ public class BackupService protected DateTime? ExtractDateFromFolderName(string folderPath) { var folderName = Path.GetFileName(folderPath); - const string format = "yyyy-MM-dd_HH-mm-ss"; - if (DateTime.TryParseExact(folderName, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out var dateTime)) + + var now = DateTime.UtcNow; + var minDate = new DateTime(1900, 1, 1, 0, 0, 0, DateTimeKind.Utc); + var maxDate = now.AddYears(5); + + foreach (var culture in Cultures) { - return dateTime; + if ( + DateTime.TryParseExact( + folderName, + format, + culture, + DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal, + out var dt + ) + ) + { + if (dt >= minDate && dt <= maxDate) + { + return DateTime.SpecifyKind(dt, DateTimeKind.Utc); + } + } } Logger.Warning($"Invalid backup folder name format: {folderPath}, [{folderName}]");