11package controller
22
33import (
4+ "fmt"
45 "github.com/pkg/errors"
56 "log"
67 "strconv"
@@ -122,6 +123,38 @@ func (e *Engine) LogCommand() {
122123 e .RefereeEvents = append (e .RefereeEvents , refereeEvent )
123124}
124125
126+ func (e * Engine ) LogCard (card * EventCard ) {
127+ refereeEvent := RefereeEvent {
128+ Timestamp : e .TimeProvider (),
129+ StageTime : e .State .StageTimeElapsed ,
130+ Type : RefereeEventCard ,
131+ Name : fmt .Sprintf ("%v %v card" , card .Operation , card .Type ),
132+ Team : card .ForTeam ,
133+ }
134+ e .RefereeEvents = append (e .RefereeEvents , refereeEvent )
135+ }
136+
137+ func (e * Engine ) LogTime (description string , forTeam Team ) {
138+ refereeEvent := RefereeEvent {
139+ Timestamp : e .TimeProvider (),
140+ StageTime : e .State .StageTimeElapsed ,
141+ Type : RefereeEventTime ,
142+ Name : description ,
143+ Team : forTeam ,
144+ }
145+ e .RefereeEvents = append (e .RefereeEvents , refereeEvent )
146+ }
147+
148+ func (e * Engine ) LogStage (stage Stage ) {
149+ refereeEvent := RefereeEvent {
150+ Timestamp : e .TimeProvider (),
151+ StageTime : e .State .StageTimeElapsed ,
152+ Type : RefereeEventStage ,
153+ Name : string (stage ),
154+ }
155+ e .RefereeEvents = append (e .RefereeEvents , refereeEvent )
156+ }
157+
125158func (e * Engine ) loadStages () {
126159 e .StageTimes = map [Stage ]time.Duration {}
127160 for _ , stage := range Stages {
@@ -142,14 +175,23 @@ func (e *Engine) updateTimes(delta time.Duration) {
142175 e .State .StageTimeElapsed += delta
143176 e .State .StageTimeLeft -= delta
144177
145- for _ , teamState := range e .State .TeamState {
178+ if e .State .StageTimeLeft + delta > 0 && e .State .StageTimeLeft <= 0 {
179+ e .LogTime ("Stage time elapsed" , "" )
180+ }
181+
182+ for team , teamState := range e .State .TeamState {
146183 reduceYellowCardTimes (teamState , delta )
147- removeElapsedYellowCards (teamState )
184+ e . removeElapsedYellowCards (team , teamState )
148185 }
149186 }
150187
151188 if e .State .GameState () == GameStateTimeout && e .State .CommandFor .Known () {
152189 e .State .TeamState [e .State .CommandFor ].TimeoutTimeLeft -= delta
190+
191+ timeLeft := e .State .TeamState [e .State .CommandFor ].TimeoutTimeLeft
192+ if timeLeft + delta > 0 && timeLeft <= 0 {
193+ e .LogTime ("Timeout time elapsed" , e .State .CommandFor )
194+ }
153195 }
154196}
155197
@@ -259,6 +301,7 @@ func (e *Engine) processStage(s *EventStage) error {
259301}
260302
261303func (e * Engine ) updateStage (stage Stage ) {
304+ e .LogStage (stage )
262305
263306 e .State .StageTimeLeft = e .StageTimes [stage ]
264307 e .State .StageTimeElapsed = 0
@@ -296,7 +339,7 @@ func (e *Engine) updatePreStages() {
296339 }
297340}
298341
299- func (e * Engine ) processCard (card * EventCard ) error {
342+ func (e * Engine ) processCard (card * EventCard ) ( err error ) {
300343 if card .ForTeam != TeamYellow && card .ForTeam != TeamBlue {
301344 return errors .Errorf ("Unknown team: %v" , card .ForTeam )
302345 }
@@ -305,13 +348,19 @@ func (e *Engine) processCard(card *EventCard) error {
305348 }
306349 teamState := e .State .TeamState [card .ForTeam ]
307350 if card .Operation == CardOperationAdd {
308- return addCard (card , teamState , e .config .YellowCardDuration )
351+ err = addCard (card , teamState , e .config .YellowCardDuration )
309352 } else if card .Operation == CardOperationRevoke {
310- return revokeCard (card , teamState )
353+ err = revokeCard (card , teamState )
311354 } else if card .Operation == CardOperationModify {
312355 return modifyCard (card , teamState )
356+ } else {
357+ return errors .Errorf ("Unknown operation: %v" , card .Operation )
313358 }
314- return errors .Errorf ("Unknown operation: %v" , card .Operation )
359+
360+ if err == nil {
361+ e .LogCard (card )
362+ }
363+ return
315364}
316365
317366func modifyCard (card * EventCard , teamState * TeamInfo ) error {
@@ -436,11 +485,13 @@ func reduceYellowCardTimes(teamState *TeamInfo, delta time.Duration) {
436485 }
437486}
438487
439- func removeElapsedYellowCards (teamState * TeamInfo ) {
488+ func ( e * Engine ) removeElapsedYellowCards (team Team , teamState * TeamInfo ) {
440489 b := teamState .YellowCardTimes [:0 ]
441490 for _ , x := range teamState .YellowCardTimes {
442491 if x > 0 {
443492 b = append (b , x )
493+ } else {
494+ e .LogTime ("Yellow card time elapsed" , team )
444495 }
445496 }
446497 teamState .YellowCardTimes = b
0 commit comments