mirror of
https://github.com/AmanTahiliani/box-box.git
synced 2026-08-08 04:06:18 -04:00
fix: separate live archive snapshots
Parse and expose SessionStatus from the official live feed, treating Started/Resumed as active and terminal or missing statuses as inactive archive candidates. Keep /api/v1/live/state and SSE snapshot data reserved for active sessions while exposing memory-only last_snapshot, last_positions, and last_snapshot_at for the explicit Live tab archive view.
This commit is contained in:
@@ -273,6 +273,40 @@ func TestProcessTopicTrackStatus(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestProcessTopicSessionStatus(t *testing.T) {
|
||||
state := live.NewState()
|
||||
if !state.ProcessTopic("SessionStatus", json.RawMessage(`{"Status": "Finished"}`)) {
|
||||
t.Fatal("SessionStatus should update state")
|
||||
}
|
||||
snap := state.Snapshot()
|
||||
if snap.SessionStatus != "Finished" {
|
||||
t.Fatalf("session status = %q, want Finished", snap.SessionStatus)
|
||||
}
|
||||
if !snap.SnapshotUpdated {
|
||||
t.Fatal("SessionStatus should mark snapshot updated")
|
||||
}
|
||||
}
|
||||
|
||||
func TestSessionStatusIsActive(t *testing.T) {
|
||||
tests := []struct {
|
||||
status string
|
||||
want bool
|
||||
}{
|
||||
{"Started", true},
|
||||
{"Resumed", true},
|
||||
{"Finished", false},
|
||||
{"Finalised", false},
|
||||
{"Ends", false},
|
||||
{"Aborted", false},
|
||||
{"", false},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
if got := live.SessionStatusIsActive(tt.status); got != tt.want {
|
||||
t.Errorf("SessionStatusIsActive(%q) = %v, want %v", tt.status, got, tt.want)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestProcessTopicRaceControlMessages(t *testing.T) {
|
||||
state := live.NewState()
|
||||
data := json.RawMessage(`{
|
||||
|
||||
@@ -197,7 +197,7 @@ func connectToF1LegacySignalR(dataChan chan LiveStreamData) error {
|
||||
return err
|
||||
}
|
||||
|
||||
subscribeMsg := []byte(`{"H":"Streaming","M":"Subscribe","A":[["Heartbeat","TimingData","Position.z","CarData.z","DriverList","LapCount","ExtrapolatedClock","TrackStatus","RaceControlMessages","WeatherData","SessionInfo","TeamRadio","CurrentTyres","TimingAppData","TimingStats"]],"I":1}`)
|
||||
subscribeMsg := []byte(`{"H":"Streaming","M":"Subscribe","A":[["Heartbeat","TimingData","Position.z","CarData.z","DriverList","LapCount","ExtrapolatedClock","TrackStatus","RaceControlMessages","WeatherData","SessionInfo","TeamRadio","CurrentTyres","TimingAppData","TimingStats","SessionStatus"]],"I":1}`)
|
||||
err = c.WriteMessage(websocket.TextMessage, subscribeMsg)
|
||||
if err != nil {
|
||||
return err
|
||||
|
||||
@@ -26,6 +26,7 @@ type State struct {
|
||||
Weather LiveWeatherData
|
||||
Session LiveSessionMeta
|
||||
TeamRadio []LiveRadioCapture
|
||||
SessionStatus string
|
||||
TrackStatus string
|
||||
CurrentLap int
|
||||
TotalLaps int
|
||||
@@ -93,6 +94,7 @@ func (s *State) Snapshot() LiveStreamData {
|
||||
Weather: s.Weather,
|
||||
Session: s.Session,
|
||||
TeamRadio: cpyRadio,
|
||||
SessionStatus: s.SessionStatus,
|
||||
TrackStatus: s.TrackStatus,
|
||||
CurrentLap: s.CurrentLap,
|
||||
TotalLaps: s.TotalLaps,
|
||||
@@ -273,6 +275,14 @@ func (s *State) ProcessTopic(topic string, data json.RawMessage) bool {
|
||||
s.TrackStatus = ts.Status
|
||||
updated = true
|
||||
}
|
||||
case "SessionStatus":
|
||||
var ss struct {
|
||||
Status string `json:"Status"`
|
||||
}
|
||||
if json.Unmarshal(data, &ss) == nil && ss.Status != "" {
|
||||
s.SessionStatus = ss.Status
|
||||
updated = true
|
||||
}
|
||||
case "RaceControlMessages":
|
||||
var rcm struct {
|
||||
Messages json.RawMessage `json:"Messages"`
|
||||
|
||||
@@ -162,6 +162,7 @@ type LiveStreamData struct {
|
||||
Weather LiveWeatherData
|
||||
Session LiveSessionMeta
|
||||
TeamRadio []LiveRadioCapture
|
||||
SessionStatus string
|
||||
TrackStatus string // "1"=green "2"=yellow "4"=SC "5"=red "6"=VSC
|
||||
CurrentLap int
|
||||
TotalLaps int
|
||||
@@ -173,3 +174,27 @@ type LiveStreamData struct {
|
||||
PositionUpdated bool `json:"-"`
|
||||
SnapshotUpdated bool `json:"-"`
|
||||
}
|
||||
|
||||
// SessionStatusIsActive reports whether a raw F1 live timing SessionStatus
|
||||
// value represents an actively running session.
|
||||
func SessionStatusIsActive(status string) bool {
|
||||
switch normalizeSessionStatus(status) {
|
||||
case "started", "resumed":
|
||||
return true
|
||||
default:
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
func normalizeSessionStatus(status string) string {
|
||||
out := make([]rune, 0, len(status))
|
||||
for _, r := range status {
|
||||
switch {
|
||||
case r >= 'A' && r <= 'Z':
|
||||
out = append(out, r+'a'-'A')
|
||||
case r >= 'a' && r <= 'z', r >= '0' && r <= '9':
|
||||
out = append(out, r)
|
||||
}
|
||||
}
|
||||
return string(out)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user