namespace DorkNet.Server; /// /// Canonical "far future / never expires" sentinel dates for anything we /// serialise back to the watch. /// /// DO NOT use DateTime.MaxValue or year 9999 in client-facing wire /// data. The 2020 watch parses ISO-8601 timestamps and adjusts them to the /// player's LOCAL timezone (DateTimeParse.ParseISO8601 → AdjustTimeZoneToLocal /// → TimeZoneInfo DST resolution). For a player whose timezone has DST /// adjustment rules, resolving the DST transition for a year-9999 instant /// pushes the computed transition point past DateTime.MaxValue (year /// 10000) and throws ArgumentOutOfRangeException: Year, Month, and Day /// parameters describe an un-representable DateTime. That blows up the /// WHOLE response deserialization → "Received malformed RecNet response" → the /// store / gift drops / promo board silently break, but ONLY for players in /// the affected timezones (everyone else parses the same payload fine, which /// makes it look like a per-player gremlin). /// /// 2099 is effectively "forever" for a 2020-era client and is nowhere near the /// overflow boundary in any timezone. /// public static class WireDates { /// Far-future sentinel as a (UTC). public static readonly DateTime FarFuture = new(2099, 12, 31, 0, 0, 0, DateTimeKind.Utc); /// Far-future sentinel pre-rendered as the ISO-8601 Z string the /// watch expects (used where the DTO field is a raw string). public const string FarFutureIso = "2099-12-31T00:00:00Z"; }