fix(admin): parse mission_change_time as wire datetime string

Real /load/index captures ship mission_meta.mission_change_time as a
"yyyy-MM-dd HH:mm:ss" string (see FriendService.DefaultMissionChangeTime for the
canonical game format) but ImportViewerRequest typed it as long? Unix seconds. The
FromUnixTimeSeconds branch had never been reachable with a real capture, and any
loader dump carrying mission_meta 400d the whole request. Change the DTO field to
string? and parse in the controller with DateTime.TryParseExact + invariant culture
(AssumeUniversal | AdjustToUniversal); unparseable values skip cleanly instead of
poisoning the whole viewer import.

Also fix is_received_two_pick_mission: DTO's JsonPropertyName was
has_received_pick_two_mission (never matched the wire key), and the wire ships "1"
/"0" strings not booleans. Rename to the actual wire key, retype to int?, controller
normalizes `hrptm != 0` before assigning to the bool DB property.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
gamer147
2026-07-04 18:25:28 -04:00
parent c8e4bda6af
commit d815bfa994
2 changed files with 18 additions and 6 deletions

View File

@@ -267,11 +267,17 @@ public class AdminController : SVSimController
{
viewer.MissionData ??= new ViewerMissionData();
if (meta.HasReceivedPickTwoMission is { } hrptm)
viewer.MissionData.HasReceivedPickTwoMission = hrptm;
viewer.MissionData.HasReceivedPickTwoMission = hrptm != 0;
if (meta.MissionReceiveType is { } mrt)
viewer.MissionData.MissionReceiveType = mrt;
if (meta.MissionChangeTime is { } mct)
viewer.MissionData.MissionChangeTime = DateTimeOffset.FromUnixTimeSeconds(mct).UtcDateTime;
if (meta.MissionChangeTime is { } mct
&& DateTime.TryParseExact(mct, "yyyy-MM-dd HH:mm:ss",
System.Globalization.CultureInfo.InvariantCulture,
System.Globalization.DateTimeStyles.AssumeUniversal | System.Globalization.DateTimeStyles.AdjustToUniversal,
out var mctParsed))
{
viewer.MissionData.MissionChangeTime = mctParsed;
}
}
// Pass B: Missions + ViewerEventCounter