From 994590213ec9c61007388c7c13a37200979e1c14 Mon Sep 17 00:00:00 2001 From: Nicolai Ommer Date: Sun, 24 Mar 2024 14:07:58 +0100 Subject: [PATCH] Calculate botSubstitutionTimeLeft centrally and distribute it via refMsg and remote-control --- frontend/src/proto/ssl_gc_referee_message.ts | 5 + frontend/src/proto/ssl_gc_state.ts | 7 + internal/app/engine/engine.go | 3 + .../app/engine/process_bot_substitution.go | 20 +- internal/app/engine/process_tick.go | 10 +- internal/app/publish/messagegenerator.go | 5 +- internal/app/rcon/server_remotecontrol.go | 28 ++- .../app/rcon/ssl_gc_rcon_remotecontrol.pb.go | 59 +++-- .../app/state/ssl_gc_referee_message.pb.go | 153 ++++++------ internal/app/state/ssl_gc_state.pb.go | 235 ++++++++++-------- internal/app/state/teaminfo.go | 1 + internal/app/statemachine/change_gameevent.go | 5 +- proto/ssl_gc_rcon_remotecontrol.proto | 6 + proto/ssl_gc_referee_message.proto | 2 + proto/ssl_gc_state.proto | 1 + 15 files changed, 314 insertions(+), 226 deletions(-) diff --git a/frontend/src/proto/ssl_gc_referee_message.ts b/frontend/src/proto/ssl_gc_referee_message.ts index 5c804a11..e1daac04 100644 --- a/frontend/src/proto/ssl_gc_referee_message.ts +++ b/frontend/src/proto/ssl_gc_referee_message.ts @@ -467,6 +467,8 @@ export interface Referee_TeamInfo { botSubstitutionAllowed?: boolean; /** The number of bot substitutions left by the team in this halftime */ botSubstitutionsLeft?: number; + /** The number of microseconds left for current bot substitution */ + botSubstitutionTimeLeft?: number; } /** @@ -576,6 +578,7 @@ export const Referee_TeamInfo = { : false, botSubstitutionAllowed: isSet(object.botSubstitutionAllowed) ? Boolean(object.botSubstitutionAllowed) : false, botSubstitutionsLeft: isSet(object.botSubstitutionsLeft) ? Number(object.botSubstitutionsLeft) : 0, + botSubstitutionTimeLeft: isSet(object.botSubstitutionTimeLeft) ? Number(object.botSubstitutionTimeLeft) : 0, }; }, @@ -603,6 +606,8 @@ export const Referee_TeamInfo = { (obj.ballPlacementFailuresReached = message.ballPlacementFailuresReached); message.botSubstitutionAllowed !== undefined && (obj.botSubstitutionAllowed = message.botSubstitutionAllowed); message.botSubstitutionsLeft !== undefined && (obj.botSubstitutionsLeft = Math.round(message.botSubstitutionsLeft)); + message.botSubstitutionTimeLeft !== undefined && + (obj.botSubstitutionTimeLeft = Math.round(message.botSubstitutionTimeLeft)); return obj; }, }; diff --git a/frontend/src/proto/ssl_gc_state.ts b/frontend/src/proto/ssl_gc_state.ts index b9c1f013..1eb3629b 100644 --- a/frontend/src/proto/ssl_gc_state.ts +++ b/frontend/src/proto/ssl_gc_state.ts @@ -232,6 +232,7 @@ export interface TeamInfo { challengeFlags?: number; botSubstitutionAllowed?: boolean; botSubstitutionsLeft?: number; + botSubstitutionTimeLeft?: Duration; } export interface State { @@ -429,6 +430,9 @@ export const TeamInfo = { challengeFlags: isSet(object.challengeFlags) ? Number(object.challengeFlags) : 0, botSubstitutionAllowed: isSet(object.botSubstitutionAllowed) ? Boolean(object.botSubstitutionAllowed) : false, botSubstitutionsLeft: isSet(object.botSubstitutionsLeft) ? Number(object.botSubstitutionsLeft) : 0, + botSubstitutionTimeLeft: isSet(object.botSubstitutionTimeLeft) + ? Duration.fromJSON(object.botSubstitutionTimeLeft) + : undefined, }; }, @@ -471,6 +475,9 @@ export const TeamInfo = { message.challengeFlags !== undefined && (obj.challengeFlags = Math.round(message.challengeFlags)); message.botSubstitutionAllowed !== undefined && (obj.botSubstitutionAllowed = message.botSubstitutionAllowed); message.botSubstitutionsLeft !== undefined && (obj.botSubstitutionsLeft = Math.round(message.botSubstitutionsLeft)); + message.botSubstitutionTimeLeft !== undefined && (obj.botSubstitutionTimeLeft = message.botSubstitutionTimeLeft + ? Duration.toJSON(message.botSubstitutionTimeLeft) + : undefined); return obj; }, }; diff --git a/internal/app/engine/engine.go b/internal/app/engine/engine.go index 9725b250..8898fee3 100644 --- a/internal/app/engine/engine.go +++ b/internal/app/engine/engine.go @@ -252,6 +252,9 @@ func initializeAddedTeamInfoFields(teamInfo *state.TeamInfo) { if teamInfo.BotSubstitutionsLeft == nil { teamInfo.BotSubstitutionsLeft = new(int32) } + if teamInfo.BotSubstitutionTimeLeft == nil { + teamInfo.BotSubstitutionTimeLeft = durationpb.New(0) + } } // Stop stops the go routine that processes the change queue diff --git a/internal/app/engine/process_bot_substitution.go b/internal/app/engine/process_bot_substitution.go index 9c3f3a87..668a8978 100644 --- a/internal/app/engine/process_bot_substitution.go +++ b/internal/app/engine/process_bot_substitution.go @@ -2,23 +2,19 @@ package engine import ( "github.com/RoboCup-SSL/ssl-game-controller/internal/app/state" - "time" + "google.golang.org/protobuf/types/known/durationpb" ) func (e *Engine) processBotSubstitution() { if e.currentState.GameState.IsHalted() { for _, team := range state.BothTeams() { - if !*e.currentState.TeamInfo(team).BotSubstitutionAllowed { - continue - } - events := e.currentState.FindGameEventsByTeam(state.GameEvent_BOT_SUBSTITUTION, team) - if len(events) == 0 { - continue - } - botSubstitutionEvent := events[len(events)-1] - eventCreated := time.UnixMicro(int64(*botSubstitutionEvent.CreatedTimestamp)) - if e.timeProvider().Sub(eventCreated) > e.gameConfig.BotSubstitutionTime { - e.Enqueue(createBotSubstitutionEventChange(team)) + if *e.currentState.TeamInfo(team).BotSubstitutionAllowed { + if e.currentState.TeamInfo(team).BotSubstitutionTimeLeft.AsDuration() <= 0 { + e.Enqueue(createBotSubstitutionEventChange(team)) + e.currentState.TeamInfo(team).BotSubstitutionTimeLeft = durationpb.New(e.gameConfig.BotSubstitutionTime) + } + } else { + e.currentState.TeamInfo(team).BotSubstitutionTimeLeft = durationpb.New(0) } } } diff --git a/internal/app/engine/process_tick.go b/internal/app/engine/process_tick.go index 7ff7fee3..621fa4a6 100644 --- a/internal/app/engine/process_tick.go +++ b/internal/app/engine/process_tick.go @@ -31,10 +31,16 @@ func (e *Engine) processTick() { } } - if e.countCardTime() { - for _, teamState := range e.currentState.TeamState { + for _, teamState := range e.currentState.TeamState { + if e.countCardTime() { e.updateYellowCardTimes(teamState, delta) } + if *teamState.BotSubstitutionAllowed { + addDur(teamState.BotSubstitutionTimeLeft, -delta) + if teamState.BotSubstitutionTimeLeft.AsDuration() < 0 { + *teamState.BotSubstitutionTimeLeft = *durationpb.New(0) + } + } } if *e.currentState.Command.Type == state.Command_TIMEOUT { diff --git a/internal/app/publish/messagegenerator.go b/internal/app/publish/messagegenerator.go index 1370f053..3a4a852e 100644 --- a/internal/app/publish/messagegenerator.go +++ b/internal/app/publish/messagegenerator.go @@ -129,6 +129,7 @@ func updateTeam(teamInfo *state.Referee_TeamInfo, teamState *state.TeamInfo) { teamInfo.YellowCardTimes = mapYellowCardTimes(teamState.YellowCards) *teamInfo.YellowCards = unsigned(len(teamState.YellowCards)) *teamInfo.Timeouts = unsigned32(*teamState.TimeoutsLeft) + *teamInfo.TimeoutTime = mapTime(teamState.TimeoutTimeLeft.AsDuration()) *teamInfo.Goalkeeper = unsigned32(*teamState.Goalkeeper) *teamInfo.FoulCounter = unsigned(len(teamState.Fouls)) *teamInfo.BallPlacementFailures = unsigned32(*teamState.BallPlacementFailures) @@ -138,8 +139,7 @@ func updateTeam(teamInfo *state.Referee_TeamInfo, teamState *state.TeamInfo) { *teamInfo.BotSubstitutionIntent = teamState.RequestsBotSubstitutionSince != nil *teamInfo.BotSubstitutionAllowed = *teamState.BotSubstitutionAllowed *teamInfo.BotSubstitutionsLeft = unsigned32(*teamState.BotSubstitutionsLeft) - timeoutTime := teamState.TimeoutTimeLeft.AsDuration() - *teamInfo.TimeoutTime = mapTime(timeoutTime) + *teamInfo.BotSubstitutionTimeLeft = mapTime(teamState.BotSubstitutionTimeLeft.AsDuration()) } func newRefereeMessage() (m *state.Referee) { @@ -176,6 +176,7 @@ func newTeamInfo() (t *state.Referee_TeamInfo) { t.BotSubstitutionIntent = new(bool) t.BotSubstitutionAllowed = new(bool) t.BotSubstitutionsLeft = new(uint32) + t.BotSubstitutionTimeLeft = new(uint32) return } diff --git a/internal/app/rcon/server_remotecontrol.go b/internal/app/rcon/server_remotecontrol.go index 0aaffdaa..1cf00571 100644 --- a/internal/app/rcon/server_remotecontrol.go +++ b/internal/app/rcon/server_remotecontrol.go @@ -154,21 +154,25 @@ func (c *RemoteControlClient) replyWithState(reply *ControllerReply) { robotsOnField := c.gcEngine.TrackerState().NumTeamRobots(*c.team) timeoutTimeLeft := float32(teamState.TimeoutTimeLeft.AsDuration().Seconds()) canSubstituteRobot := c.canSubstituteRobot() + botSubstitutionsLeft := uint32(*teamState.BotSubstitutionsLeft) + botSubstitutionTimeLeft := float32(teamState.BotSubstitutionTimeLeft.AsDuration().Seconds()) response := &ControllerToRemoteControl{ State: &RemoteControlTeamState{ - Team: c.team, - KeeperId: teamState.Goalkeeper, - AvailableRequests: availableRequests, - ActiveRequests: activeRequests, - EmergencyStopIn: &emergencyStopIn, - TimeoutsLeft: teamState.TimeoutsLeft, - TimeoutTimeLeft: &timeoutTimeLeft, - ChallengeFlagsLeft: teamState.ChallengeFlags, - MaxRobots: teamState.MaxAllowedBots, - RobotsOnField: &robotsOnField, - YellowCardsDue: yellowCardsDue, - CanSubstituteRobot: &canSubstituteRobot, + Team: c.team, + KeeperId: teamState.Goalkeeper, + AvailableRequests: availableRequests, + ActiveRequests: activeRequests, + EmergencyStopIn: &emergencyStopIn, + TimeoutsLeft: teamState.TimeoutsLeft, + TimeoutTimeLeft: &timeoutTimeLeft, + ChallengeFlagsLeft: teamState.ChallengeFlags, + MaxRobots: teamState.MaxAllowedBots, + RobotsOnField: &robotsOnField, + YellowCardsDue: yellowCardsDue, + CanSubstituteRobot: &canSubstituteRobot, + BotSubstitutionsLeft: &botSubstitutionsLeft, + BotSubstitutionTimeLeft: &botSubstitutionTimeLeft, }, ControllerReply: reply, } diff --git a/internal/app/rcon/ssl_gc_rcon_remotecontrol.pb.go b/internal/app/rcon/ssl_gc_rcon_remotecontrol.pb.go index 9d02e088..e5092176 100644 --- a/internal/app/rcon/ssl_gc_rcon_remotecontrol.pb.go +++ b/internal/app/rcon/ssl_gc_rcon_remotecontrol.pb.go @@ -447,6 +447,10 @@ type RemoteControlTeamState struct { YellowCardsDue []float32 `protobuf:"fixed32,8,rep,name=yellow_cards_due,json=yellowCardsDue" json:"yellow_cards_due,omitempty"` // if true, team is allowed to substitute robots CanSubstituteRobot *bool `protobuf:"varint,11,opt,name=can_substitute_robot,json=canSubstituteRobot" json:"can_substitute_robot,omitempty"` + // number of bot substitutions left by the team in this halftime + BotSubstitutionsLeft *uint32 `protobuf:"varint,13,opt,name=bot_substitutions_left,json=botSubstitutionsLeft" json:"bot_substitutions_left,omitempty"` + // number of seconds left for current bot substitution + BotSubstitutionTimeLeft *float32 `protobuf:"fixed32,14,opt,name=bot_substitution_time_left,json=botSubstitutionTimeLeft" json:"bot_substitution_time_left,omitempty"` } func (x *RemoteControlTeamState) Reset() { @@ -565,6 +569,20 @@ func (x *RemoteControlTeamState) GetCanSubstituteRobot() bool { return false } +func (x *RemoteControlTeamState) GetBotSubstitutionsLeft() uint32 { + if x != nil && x.BotSubstitutionsLeft != nil { + return *x.BotSubstitutionsLeft + } + return 0 +} + +func (x *RemoteControlTeamState) GetBotSubstitutionTimeLeft() float32 { + if x != nil && x.BotSubstitutionTimeLeft != nil { + return *x.BotSubstitutionTimeLeft + } + return 0 +} + var File_ssl_gc_rcon_remotecontrol_proto protoreflect.FileDescriptor var file_ssl_gc_rcon_remotecontrol_proto_rawDesc = []byte{ @@ -613,7 +631,7 @@ var file_ssl_gc_rcon_remotecontrol_proto_rawDesc = []byte{ 0x6c, 0x6c, 0x65, 0x72, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2d, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x54, 0x65, 0x61, 0x6d, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0xb0, 0x04, 0x0a, 0x16, 0x52, 0x65, 0x6d, + 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0xa3, 0x05, 0x0a, 0x16, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x54, 0x65, 0x61, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x19, 0x0a, 0x04, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x05, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x04, 0x74, 0x65, 0x61, 0x6d, 0x12, 0x48, @@ -648,22 +666,29 @@ var file_ssl_gc_rcon_remotecontrol_proto_rawDesc = []byte{ 0x77, 0x43, 0x61, 0x72, 0x64, 0x73, 0x44, 0x75, 0x65, 0x12, 0x30, 0x0a, 0x14, 0x63, 0x61, 0x6e, 0x5f, 0x73, 0x75, 0x62, 0x73, 0x74, 0x69, 0x74, 0x75, 0x74, 0x65, 0x5f, 0x72, 0x6f, 0x62, 0x6f, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x63, 0x61, 0x6e, 0x53, 0x75, 0x62, 0x73, - 0x74, 0x69, 0x74, 0x75, 0x74, 0x65, 0x52, 0x6f, 0x62, 0x6f, 0x74, 0x2a, 0xa9, 0x01, 0x0a, 0x18, - 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x18, 0x0a, 0x14, 0x55, 0x4e, 0x4b, 0x4e, - 0x4f, 0x57, 0x4e, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x45, 0x53, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, - 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x45, 0x4d, 0x45, 0x52, 0x47, 0x45, 0x4e, 0x43, 0x59, 0x5f, - 0x53, 0x54, 0x4f, 0x50, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x52, 0x4f, 0x42, 0x4f, 0x54, 0x5f, - 0x53, 0x55, 0x42, 0x53, 0x54, 0x49, 0x54, 0x55, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x02, 0x12, 0x0b, - 0x0a, 0x07, 0x54, 0x49, 0x4d, 0x45, 0x4f, 0x55, 0x54, 0x10, 0x03, 0x12, 0x12, 0x0a, 0x0e, 0x43, - 0x48, 0x41, 0x4c, 0x4c, 0x45, 0x4e, 0x47, 0x45, 0x5f, 0x46, 0x4c, 0x41, 0x47, 0x10, 0x04, 0x12, - 0x14, 0x0a, 0x10, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x5f, 0x4b, 0x45, 0x45, 0x50, 0x45, 0x52, - 0x5f, 0x49, 0x44, 0x10, 0x05, 0x12, 0x10, 0x0a, 0x0c, 0x53, 0x54, 0x4f, 0x50, 0x5f, 0x54, 0x49, - 0x4d, 0x45, 0x4f, 0x55, 0x54, 0x10, 0x06, 0x42, 0x3e, 0x5a, 0x3c, 0x67, 0x69, 0x74, 0x68, 0x75, - 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x52, 0x6f, 0x62, 0x6f, 0x43, 0x75, 0x70, 0x2d, 0x53, 0x53, - 0x4c, 0x2f, 0x73, 0x73, 0x6c, 0x2d, 0x67, 0x61, 0x6d, 0x65, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x61, - 0x70, 0x70, 0x2f, 0x72, 0x63, 0x6f, 0x6e, + 0x74, 0x69, 0x74, 0x75, 0x74, 0x65, 0x52, 0x6f, 0x62, 0x6f, 0x74, 0x12, 0x34, 0x0a, 0x16, 0x62, + 0x6f, 0x74, 0x5f, 0x73, 0x75, 0x62, 0x73, 0x74, 0x69, 0x74, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x5f, 0x6c, 0x65, 0x66, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x14, 0x62, 0x6f, 0x74, + 0x53, 0x75, 0x62, 0x73, 0x74, 0x69, 0x74, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x4c, 0x65, 0x66, + 0x74, 0x12, 0x3b, 0x0a, 0x1a, 0x62, 0x6f, 0x74, 0x5f, 0x73, 0x75, 0x62, 0x73, 0x74, 0x69, 0x74, + 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x6c, 0x65, 0x66, 0x74, 0x18, + 0x0e, 0x20, 0x01, 0x28, 0x02, 0x52, 0x17, 0x62, 0x6f, 0x74, 0x53, 0x75, 0x62, 0x73, 0x74, 0x69, + 0x74, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x4c, 0x65, 0x66, 0x74, 0x2a, 0xa9, + 0x01, 0x0a, 0x18, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x18, 0x0a, 0x14, 0x55, + 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x45, 0x53, 0x54, 0x5f, 0x54, + 0x59, 0x50, 0x45, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x45, 0x4d, 0x45, 0x52, 0x47, 0x45, 0x4e, + 0x43, 0x59, 0x5f, 0x53, 0x54, 0x4f, 0x50, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x52, 0x4f, 0x42, + 0x4f, 0x54, 0x5f, 0x53, 0x55, 0x42, 0x53, 0x54, 0x49, 0x54, 0x55, 0x54, 0x49, 0x4f, 0x4e, 0x10, + 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x54, 0x49, 0x4d, 0x45, 0x4f, 0x55, 0x54, 0x10, 0x03, 0x12, 0x12, + 0x0a, 0x0e, 0x43, 0x48, 0x41, 0x4c, 0x4c, 0x45, 0x4e, 0x47, 0x45, 0x5f, 0x46, 0x4c, 0x41, 0x47, + 0x10, 0x04, 0x12, 0x14, 0x0a, 0x10, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x5f, 0x4b, 0x45, 0x45, + 0x50, 0x45, 0x52, 0x5f, 0x49, 0x44, 0x10, 0x05, 0x12, 0x10, 0x0a, 0x0c, 0x53, 0x54, 0x4f, 0x50, + 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x4f, 0x55, 0x54, 0x10, 0x06, 0x42, 0x3e, 0x5a, 0x3c, 0x67, 0x69, + 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x52, 0x6f, 0x62, 0x6f, 0x43, 0x75, 0x70, + 0x2d, 0x53, 0x53, 0x4c, 0x2f, 0x73, 0x73, 0x6c, 0x2d, 0x67, 0x61, 0x6d, 0x65, 0x2d, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x2f, 0x61, 0x70, 0x70, 0x2f, 0x72, 0x63, 0x6f, 0x6e, } var ( diff --git a/internal/app/state/ssl_gc_referee_message.pb.go b/internal/app/state/ssl_gc_referee_message.pb.go index 1ccce6c9..5449d60d 100644 --- a/internal/app/state/ssl_gc_referee_message.pb.go +++ b/internal/app/state/ssl_gc_referee_message.pb.go @@ -660,6 +660,8 @@ type Referee_TeamInfo struct { BotSubstitutionAllowed *bool `protobuf:"varint,16,opt,name=bot_substitution_allowed,json=botSubstitutionAllowed" json:"bot_substitution_allowed,omitempty"` // The number of bot substitutions left by the team in this halftime BotSubstitutionsLeft *uint32 `protobuf:"varint,17,opt,name=bot_substitutions_left,json=botSubstitutionsLeft" json:"bot_substitutions_left,omitempty"` + // The number of microseconds left for current bot substitution + BotSubstitutionTimeLeft *uint32 `protobuf:"varint,18,opt,name=bot_substitution_time_left,json=botSubstitutionTimeLeft" json:"bot_substitution_time_left,omitempty"` } func (x *Referee_TeamInfo) Reset() { @@ -806,6 +808,13 @@ func (x *Referee_TeamInfo) GetBotSubstitutionsLeft() uint32 { return 0 } +func (x *Referee_TeamInfo) GetBotSubstitutionTimeLeft() uint32 { + if x != nil && x.BotSubstitutionTimeLeft != nil { + return *x.BotSubstitutionTimeLeft + } + return 0 +} + // The coordinates of the Designated Position. These are measured in // millimetres and correspond to SSL-Vision coordinates. These fields are // always either both present (in the case of a ball placement command) or @@ -871,7 +880,7 @@ var file_ssl_gc_referee_message_proto_rawDesc = []byte{ 0x0a, 0x1c, 0x73, 0x73, 0x6c, 0x5f, 0x67, 0x63, 0x5f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x73, 0x73, 0x6c, 0x5f, 0x67, 0x63, 0x5f, 0x67, 0x61, 0x6d, 0x65, 0x5f, 0x65, 0x76, 0x65, 0x6e, - 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x95, 0x12, 0x0a, 0x07, 0x52, 0x65, 0x66, 0x65, + 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xd2, 0x12, 0x0a, 0x07, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x18, 0x12, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, @@ -924,7 +933,7 @@ var file_ssl_gc_referee_message_proto_rawDesc = []byte{ 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x65, 0x6d, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x14, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x9d, 0x05, 0x0a, 0x08, + 0x61, 0x74, 0x75, 0x73, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0xda, 0x05, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x02, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x02, 0x20, 0x02, 0x28, 0x0d, 0x52, 0x05, 0x73, 0x63, 0x6f, @@ -966,74 +975,78 @@ var file_ssl_gc_referee_message_proto_rawDesc = []byte{ 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x12, 0x34, 0x0a, 0x16, 0x62, 0x6f, 0x74, 0x5f, 0x73, 0x75, 0x62, 0x73, 0x74, 0x69, 0x74, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x6c, 0x65, 0x66, 0x74, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x14, 0x62, 0x6f, 0x74, 0x53, 0x75, 0x62, 0x73, 0x74, 0x69, - 0x74, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x4c, 0x65, 0x66, 0x74, 0x1a, 0x23, 0x0a, 0x05, 0x50, - 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x0c, 0x0a, 0x01, 0x78, 0x18, 0x01, 0x20, 0x02, 0x28, 0x02, 0x52, - 0x01, 0x78, 0x12, 0x0c, 0x0a, 0x01, 0x79, 0x18, 0x02, 0x20, 0x02, 0x28, 0x02, 0x52, 0x01, 0x79, - 0x22, 0xd1, 0x02, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x67, 0x65, 0x12, 0x19, 0x0a, 0x15, 0x4e, 0x4f, - 0x52, 0x4d, 0x41, 0x4c, 0x5f, 0x46, 0x49, 0x52, 0x53, 0x54, 0x5f, 0x48, 0x41, 0x4c, 0x46, 0x5f, - 0x50, 0x52, 0x45, 0x10, 0x00, 0x12, 0x15, 0x0a, 0x11, 0x4e, 0x4f, 0x52, 0x4d, 0x41, 0x4c, 0x5f, - 0x46, 0x49, 0x52, 0x53, 0x54, 0x5f, 0x48, 0x41, 0x4c, 0x46, 0x10, 0x01, 0x12, 0x14, 0x0a, 0x10, - 0x4e, 0x4f, 0x52, 0x4d, 0x41, 0x4c, 0x5f, 0x48, 0x41, 0x4c, 0x46, 0x5f, 0x54, 0x49, 0x4d, 0x45, - 0x10, 0x02, 0x12, 0x1a, 0x0a, 0x16, 0x4e, 0x4f, 0x52, 0x4d, 0x41, 0x4c, 0x5f, 0x53, 0x45, 0x43, - 0x4f, 0x4e, 0x44, 0x5f, 0x48, 0x41, 0x4c, 0x46, 0x5f, 0x50, 0x52, 0x45, 0x10, 0x03, 0x12, 0x16, - 0x0a, 0x12, 0x4e, 0x4f, 0x52, 0x4d, 0x41, 0x4c, 0x5f, 0x53, 0x45, 0x43, 0x4f, 0x4e, 0x44, 0x5f, - 0x48, 0x41, 0x4c, 0x46, 0x10, 0x04, 0x12, 0x14, 0x0a, 0x10, 0x45, 0x58, 0x54, 0x52, 0x41, 0x5f, - 0x54, 0x49, 0x4d, 0x45, 0x5f, 0x42, 0x52, 0x45, 0x41, 0x4b, 0x10, 0x05, 0x12, 0x18, 0x0a, 0x14, - 0x45, 0x58, 0x54, 0x52, 0x41, 0x5f, 0x46, 0x49, 0x52, 0x53, 0x54, 0x5f, 0x48, 0x41, 0x4c, 0x46, - 0x5f, 0x50, 0x52, 0x45, 0x10, 0x06, 0x12, 0x14, 0x0a, 0x10, 0x45, 0x58, 0x54, 0x52, 0x41, 0x5f, - 0x46, 0x49, 0x52, 0x53, 0x54, 0x5f, 0x48, 0x41, 0x4c, 0x46, 0x10, 0x07, 0x12, 0x13, 0x0a, 0x0f, - 0x45, 0x58, 0x54, 0x52, 0x41, 0x5f, 0x48, 0x41, 0x4c, 0x46, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x10, - 0x08, 0x12, 0x19, 0x0a, 0x15, 0x45, 0x58, 0x54, 0x52, 0x41, 0x5f, 0x53, 0x45, 0x43, 0x4f, 0x4e, - 0x44, 0x5f, 0x48, 0x41, 0x4c, 0x46, 0x5f, 0x50, 0x52, 0x45, 0x10, 0x09, 0x12, 0x15, 0x0a, 0x11, - 0x45, 0x58, 0x54, 0x52, 0x41, 0x5f, 0x53, 0x45, 0x43, 0x4f, 0x4e, 0x44, 0x5f, 0x48, 0x41, 0x4c, - 0x46, 0x10, 0x0a, 0x12, 0x1a, 0x0a, 0x16, 0x50, 0x45, 0x4e, 0x41, 0x4c, 0x54, 0x59, 0x5f, 0x53, - 0x48, 0x4f, 0x4f, 0x54, 0x4f, 0x55, 0x54, 0x5f, 0x42, 0x52, 0x45, 0x41, 0x4b, 0x10, 0x0b, 0x12, - 0x14, 0x0a, 0x10, 0x50, 0x45, 0x4e, 0x41, 0x4c, 0x54, 0x59, 0x5f, 0x53, 0x48, 0x4f, 0x4f, 0x54, - 0x4f, 0x55, 0x54, 0x10, 0x0c, 0x12, 0x0d, 0x0a, 0x09, 0x50, 0x4f, 0x53, 0x54, 0x5f, 0x47, 0x41, - 0x4d, 0x45, 0x10, 0x0d, 0x22, 0x96, 0x03, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, - 0x12, 0x08, 0x0a, 0x04, 0x48, 0x41, 0x4c, 0x54, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x53, 0x54, - 0x4f, 0x50, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x4e, 0x4f, 0x52, 0x4d, 0x41, 0x4c, 0x5f, 0x53, - 0x54, 0x41, 0x52, 0x54, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x46, 0x4f, 0x52, 0x43, 0x45, 0x5f, - 0x53, 0x54, 0x41, 0x52, 0x54, 0x10, 0x03, 0x12, 0x1a, 0x0a, 0x16, 0x50, 0x52, 0x45, 0x50, 0x41, - 0x52, 0x45, 0x5f, 0x4b, 0x49, 0x43, 0x4b, 0x4f, 0x46, 0x46, 0x5f, 0x59, 0x45, 0x4c, 0x4c, 0x4f, - 0x57, 0x10, 0x04, 0x12, 0x18, 0x0a, 0x14, 0x50, 0x52, 0x45, 0x50, 0x41, 0x52, 0x45, 0x5f, 0x4b, - 0x49, 0x43, 0x4b, 0x4f, 0x46, 0x46, 0x5f, 0x42, 0x4c, 0x55, 0x45, 0x10, 0x05, 0x12, 0x1a, 0x0a, - 0x16, 0x50, 0x52, 0x45, 0x50, 0x41, 0x52, 0x45, 0x5f, 0x50, 0x45, 0x4e, 0x41, 0x4c, 0x54, 0x59, - 0x5f, 0x59, 0x45, 0x4c, 0x4c, 0x4f, 0x57, 0x10, 0x06, 0x12, 0x18, 0x0a, 0x14, 0x50, 0x52, 0x45, - 0x50, 0x41, 0x52, 0x45, 0x5f, 0x50, 0x45, 0x4e, 0x41, 0x4c, 0x54, 0x59, 0x5f, 0x42, 0x4c, 0x55, - 0x45, 0x10, 0x07, 0x12, 0x16, 0x0a, 0x12, 0x44, 0x49, 0x52, 0x45, 0x43, 0x54, 0x5f, 0x46, 0x52, - 0x45, 0x45, 0x5f, 0x59, 0x45, 0x4c, 0x4c, 0x4f, 0x57, 0x10, 0x08, 0x12, 0x14, 0x0a, 0x10, 0x44, - 0x49, 0x52, 0x45, 0x43, 0x54, 0x5f, 0x46, 0x52, 0x45, 0x45, 0x5f, 0x42, 0x4c, 0x55, 0x45, 0x10, - 0x09, 0x12, 0x1c, 0x0a, 0x14, 0x49, 0x4e, 0x44, 0x49, 0x52, 0x45, 0x43, 0x54, 0x5f, 0x46, 0x52, - 0x45, 0x45, 0x5f, 0x59, 0x45, 0x4c, 0x4c, 0x4f, 0x57, 0x10, 0x0a, 0x1a, 0x02, 0x08, 0x01, 0x12, - 0x1a, 0x0a, 0x12, 0x49, 0x4e, 0x44, 0x49, 0x52, 0x45, 0x43, 0x54, 0x5f, 0x46, 0x52, 0x45, 0x45, - 0x5f, 0x42, 0x4c, 0x55, 0x45, 0x10, 0x0b, 0x1a, 0x02, 0x08, 0x01, 0x12, 0x12, 0x0a, 0x0e, 0x54, - 0x49, 0x4d, 0x45, 0x4f, 0x55, 0x54, 0x5f, 0x59, 0x45, 0x4c, 0x4c, 0x4f, 0x57, 0x10, 0x0c, 0x12, - 0x10, 0x0a, 0x0c, 0x54, 0x49, 0x4d, 0x45, 0x4f, 0x55, 0x54, 0x5f, 0x42, 0x4c, 0x55, 0x45, 0x10, - 0x0d, 0x12, 0x13, 0x0a, 0x0b, 0x47, 0x4f, 0x41, 0x4c, 0x5f, 0x59, 0x45, 0x4c, 0x4c, 0x4f, 0x57, - 0x10, 0x0e, 0x1a, 0x02, 0x08, 0x01, 0x12, 0x11, 0x0a, 0x09, 0x47, 0x4f, 0x41, 0x4c, 0x5f, 0x42, - 0x4c, 0x55, 0x45, 0x10, 0x0f, 0x1a, 0x02, 0x08, 0x01, 0x12, 0x19, 0x0a, 0x15, 0x42, 0x41, 0x4c, - 0x4c, 0x5f, 0x50, 0x4c, 0x41, 0x43, 0x45, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x59, 0x45, 0x4c, 0x4c, - 0x4f, 0x57, 0x10, 0x10, 0x12, 0x17, 0x0a, 0x13, 0x42, 0x41, 0x4c, 0x4c, 0x5f, 0x50, 0x4c, 0x41, - 0x43, 0x45, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x42, 0x4c, 0x55, 0x45, 0x10, 0x11, 0x4a, 0x04, 0x08, - 0x0b, 0x10, 0x0c, 0x4a, 0x04, 0x08, 0x0d, 0x10, 0x0e, 0x4a, 0x04, 0x08, 0x0e, 0x10, 0x0f, 0x22, - 0x71, 0x0a, 0x16, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, - 0x6f, 0x73, 0x61, 0x6c, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2b, 0x0a, 0x0b, 0x67, 0x61, 0x6d, - 0x65, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0a, - 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x67, 0x61, 0x6d, 0x65, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, - 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, - 0x65, 0x64, 0x2a, 0x54, 0x0a, 0x09, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, - 0x11, 0x0a, 0x0d, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x5f, 0x4d, 0x41, 0x54, 0x43, 0x48, - 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x50, 0x48, 0x41, 0x53, - 0x45, 0x10, 0x01, 0x12, 0x15, 0x0a, 0x11, 0x45, 0x4c, 0x49, 0x4d, 0x49, 0x4e, 0x41, 0x54, 0x49, - 0x4f, 0x4e, 0x5f, 0x50, 0x48, 0x41, 0x53, 0x45, 0x10, 0x02, 0x12, 0x0c, 0x0a, 0x08, 0x46, 0x52, - 0x49, 0x45, 0x4e, 0x44, 0x4c, 0x59, 0x10, 0x03, 0x42, 0x3f, 0x5a, 0x3d, 0x67, 0x69, 0x74, 0x68, - 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x52, 0x6f, 0x62, 0x6f, 0x43, 0x75, 0x70, 0x2d, 0x53, - 0x53, 0x4c, 0x2f, 0x73, 0x73, 0x6c, 0x2d, 0x67, 0x61, 0x6d, 0x65, 0x2d, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, - 0x61, 0x70, 0x70, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x74, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x4c, 0x65, 0x66, 0x74, 0x12, 0x3b, 0x0a, 0x1a, 0x62, + 0x6f, 0x74, 0x5f, 0x73, 0x75, 0x62, 0x73, 0x74, 0x69, 0x74, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x6c, 0x65, 0x66, 0x74, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x17, 0x62, 0x6f, 0x74, 0x53, 0x75, 0x62, 0x73, 0x74, 0x69, 0x74, 0x75, 0x74, 0x69, 0x6f, 0x6e, + 0x54, 0x69, 0x6d, 0x65, 0x4c, 0x65, 0x66, 0x74, 0x1a, 0x23, 0x0a, 0x05, 0x50, 0x6f, 0x69, 0x6e, + 0x74, 0x12, 0x0c, 0x0a, 0x01, 0x78, 0x18, 0x01, 0x20, 0x02, 0x28, 0x02, 0x52, 0x01, 0x78, 0x12, + 0x0c, 0x0a, 0x01, 0x79, 0x18, 0x02, 0x20, 0x02, 0x28, 0x02, 0x52, 0x01, 0x79, 0x22, 0xd1, 0x02, + 0x0a, 0x05, 0x53, 0x74, 0x61, 0x67, 0x65, 0x12, 0x19, 0x0a, 0x15, 0x4e, 0x4f, 0x52, 0x4d, 0x41, + 0x4c, 0x5f, 0x46, 0x49, 0x52, 0x53, 0x54, 0x5f, 0x48, 0x41, 0x4c, 0x46, 0x5f, 0x50, 0x52, 0x45, + 0x10, 0x00, 0x12, 0x15, 0x0a, 0x11, 0x4e, 0x4f, 0x52, 0x4d, 0x41, 0x4c, 0x5f, 0x46, 0x49, 0x52, + 0x53, 0x54, 0x5f, 0x48, 0x41, 0x4c, 0x46, 0x10, 0x01, 0x12, 0x14, 0x0a, 0x10, 0x4e, 0x4f, 0x52, + 0x4d, 0x41, 0x4c, 0x5f, 0x48, 0x41, 0x4c, 0x46, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x10, 0x02, 0x12, + 0x1a, 0x0a, 0x16, 0x4e, 0x4f, 0x52, 0x4d, 0x41, 0x4c, 0x5f, 0x53, 0x45, 0x43, 0x4f, 0x4e, 0x44, + 0x5f, 0x48, 0x41, 0x4c, 0x46, 0x5f, 0x50, 0x52, 0x45, 0x10, 0x03, 0x12, 0x16, 0x0a, 0x12, 0x4e, + 0x4f, 0x52, 0x4d, 0x41, 0x4c, 0x5f, 0x53, 0x45, 0x43, 0x4f, 0x4e, 0x44, 0x5f, 0x48, 0x41, 0x4c, + 0x46, 0x10, 0x04, 0x12, 0x14, 0x0a, 0x10, 0x45, 0x58, 0x54, 0x52, 0x41, 0x5f, 0x54, 0x49, 0x4d, + 0x45, 0x5f, 0x42, 0x52, 0x45, 0x41, 0x4b, 0x10, 0x05, 0x12, 0x18, 0x0a, 0x14, 0x45, 0x58, 0x54, + 0x52, 0x41, 0x5f, 0x46, 0x49, 0x52, 0x53, 0x54, 0x5f, 0x48, 0x41, 0x4c, 0x46, 0x5f, 0x50, 0x52, + 0x45, 0x10, 0x06, 0x12, 0x14, 0x0a, 0x10, 0x45, 0x58, 0x54, 0x52, 0x41, 0x5f, 0x46, 0x49, 0x52, + 0x53, 0x54, 0x5f, 0x48, 0x41, 0x4c, 0x46, 0x10, 0x07, 0x12, 0x13, 0x0a, 0x0f, 0x45, 0x58, 0x54, + 0x52, 0x41, 0x5f, 0x48, 0x41, 0x4c, 0x46, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x10, 0x08, 0x12, 0x19, + 0x0a, 0x15, 0x45, 0x58, 0x54, 0x52, 0x41, 0x5f, 0x53, 0x45, 0x43, 0x4f, 0x4e, 0x44, 0x5f, 0x48, + 0x41, 0x4c, 0x46, 0x5f, 0x50, 0x52, 0x45, 0x10, 0x09, 0x12, 0x15, 0x0a, 0x11, 0x45, 0x58, 0x54, + 0x52, 0x41, 0x5f, 0x53, 0x45, 0x43, 0x4f, 0x4e, 0x44, 0x5f, 0x48, 0x41, 0x4c, 0x46, 0x10, 0x0a, + 0x12, 0x1a, 0x0a, 0x16, 0x50, 0x45, 0x4e, 0x41, 0x4c, 0x54, 0x59, 0x5f, 0x53, 0x48, 0x4f, 0x4f, + 0x54, 0x4f, 0x55, 0x54, 0x5f, 0x42, 0x52, 0x45, 0x41, 0x4b, 0x10, 0x0b, 0x12, 0x14, 0x0a, 0x10, + 0x50, 0x45, 0x4e, 0x41, 0x4c, 0x54, 0x59, 0x5f, 0x53, 0x48, 0x4f, 0x4f, 0x54, 0x4f, 0x55, 0x54, + 0x10, 0x0c, 0x12, 0x0d, 0x0a, 0x09, 0x50, 0x4f, 0x53, 0x54, 0x5f, 0x47, 0x41, 0x4d, 0x45, 0x10, + 0x0d, 0x22, 0x96, 0x03, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x08, 0x0a, + 0x04, 0x48, 0x41, 0x4c, 0x54, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x53, 0x54, 0x4f, 0x50, 0x10, + 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x4e, 0x4f, 0x52, 0x4d, 0x41, 0x4c, 0x5f, 0x53, 0x54, 0x41, 0x52, + 0x54, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x46, 0x4f, 0x52, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, + 0x52, 0x54, 0x10, 0x03, 0x12, 0x1a, 0x0a, 0x16, 0x50, 0x52, 0x45, 0x50, 0x41, 0x52, 0x45, 0x5f, + 0x4b, 0x49, 0x43, 0x4b, 0x4f, 0x46, 0x46, 0x5f, 0x59, 0x45, 0x4c, 0x4c, 0x4f, 0x57, 0x10, 0x04, + 0x12, 0x18, 0x0a, 0x14, 0x50, 0x52, 0x45, 0x50, 0x41, 0x52, 0x45, 0x5f, 0x4b, 0x49, 0x43, 0x4b, + 0x4f, 0x46, 0x46, 0x5f, 0x42, 0x4c, 0x55, 0x45, 0x10, 0x05, 0x12, 0x1a, 0x0a, 0x16, 0x50, 0x52, + 0x45, 0x50, 0x41, 0x52, 0x45, 0x5f, 0x50, 0x45, 0x4e, 0x41, 0x4c, 0x54, 0x59, 0x5f, 0x59, 0x45, + 0x4c, 0x4c, 0x4f, 0x57, 0x10, 0x06, 0x12, 0x18, 0x0a, 0x14, 0x50, 0x52, 0x45, 0x50, 0x41, 0x52, + 0x45, 0x5f, 0x50, 0x45, 0x4e, 0x41, 0x4c, 0x54, 0x59, 0x5f, 0x42, 0x4c, 0x55, 0x45, 0x10, 0x07, + 0x12, 0x16, 0x0a, 0x12, 0x44, 0x49, 0x52, 0x45, 0x43, 0x54, 0x5f, 0x46, 0x52, 0x45, 0x45, 0x5f, + 0x59, 0x45, 0x4c, 0x4c, 0x4f, 0x57, 0x10, 0x08, 0x12, 0x14, 0x0a, 0x10, 0x44, 0x49, 0x52, 0x45, + 0x43, 0x54, 0x5f, 0x46, 0x52, 0x45, 0x45, 0x5f, 0x42, 0x4c, 0x55, 0x45, 0x10, 0x09, 0x12, 0x1c, + 0x0a, 0x14, 0x49, 0x4e, 0x44, 0x49, 0x52, 0x45, 0x43, 0x54, 0x5f, 0x46, 0x52, 0x45, 0x45, 0x5f, + 0x59, 0x45, 0x4c, 0x4c, 0x4f, 0x57, 0x10, 0x0a, 0x1a, 0x02, 0x08, 0x01, 0x12, 0x1a, 0x0a, 0x12, + 0x49, 0x4e, 0x44, 0x49, 0x52, 0x45, 0x43, 0x54, 0x5f, 0x46, 0x52, 0x45, 0x45, 0x5f, 0x42, 0x4c, + 0x55, 0x45, 0x10, 0x0b, 0x1a, 0x02, 0x08, 0x01, 0x12, 0x12, 0x0a, 0x0e, 0x54, 0x49, 0x4d, 0x45, + 0x4f, 0x55, 0x54, 0x5f, 0x59, 0x45, 0x4c, 0x4c, 0x4f, 0x57, 0x10, 0x0c, 0x12, 0x10, 0x0a, 0x0c, + 0x54, 0x49, 0x4d, 0x45, 0x4f, 0x55, 0x54, 0x5f, 0x42, 0x4c, 0x55, 0x45, 0x10, 0x0d, 0x12, 0x13, + 0x0a, 0x0b, 0x47, 0x4f, 0x41, 0x4c, 0x5f, 0x59, 0x45, 0x4c, 0x4c, 0x4f, 0x57, 0x10, 0x0e, 0x1a, + 0x02, 0x08, 0x01, 0x12, 0x11, 0x0a, 0x09, 0x47, 0x4f, 0x41, 0x4c, 0x5f, 0x42, 0x4c, 0x55, 0x45, + 0x10, 0x0f, 0x1a, 0x02, 0x08, 0x01, 0x12, 0x19, 0x0a, 0x15, 0x42, 0x41, 0x4c, 0x4c, 0x5f, 0x50, + 0x4c, 0x41, 0x43, 0x45, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x59, 0x45, 0x4c, 0x4c, 0x4f, 0x57, 0x10, + 0x10, 0x12, 0x17, 0x0a, 0x13, 0x42, 0x41, 0x4c, 0x4c, 0x5f, 0x50, 0x4c, 0x41, 0x43, 0x45, 0x4d, + 0x45, 0x4e, 0x54, 0x5f, 0x42, 0x4c, 0x55, 0x45, 0x10, 0x11, 0x4a, 0x04, 0x08, 0x0b, 0x10, 0x0c, + 0x4a, 0x04, 0x08, 0x0d, 0x10, 0x0e, 0x4a, 0x04, 0x08, 0x0e, 0x10, 0x0f, 0x22, 0x71, 0x0a, 0x16, + 0x47, 0x61, 0x6d, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, + 0x6c, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2b, 0x0a, 0x0b, 0x67, 0x61, 0x6d, 0x65, 0x5f, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x47, 0x61, + 0x6d, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x67, 0x61, 0x6d, 0x65, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x65, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x65, 0x64, 0x2a, + 0x54, 0x0a, 0x09, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x11, 0x0a, 0x0d, + 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x5f, 0x4d, 0x41, 0x54, 0x43, 0x48, 0x10, 0x00, 0x12, + 0x0f, 0x0a, 0x0b, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x50, 0x48, 0x41, 0x53, 0x45, 0x10, 0x01, + 0x12, 0x15, 0x0a, 0x11, 0x45, 0x4c, 0x49, 0x4d, 0x49, 0x4e, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, + 0x50, 0x48, 0x41, 0x53, 0x45, 0x10, 0x02, 0x12, 0x0c, 0x0a, 0x08, 0x46, 0x52, 0x49, 0x45, 0x4e, + 0x44, 0x4c, 0x59, 0x10, 0x03, 0x42, 0x3f, 0x5a, 0x3d, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x52, 0x6f, 0x62, 0x6f, 0x43, 0x75, 0x70, 0x2d, 0x53, 0x53, 0x4c, 0x2f, + 0x73, 0x73, 0x6c, 0x2d, 0x67, 0x61, 0x6d, 0x65, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x6c, 0x65, 0x72, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x61, 0x70, 0x70, + 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, } var ( diff --git a/internal/app/state/ssl_gc_state.pb.go b/internal/app/state/ssl_gc_state.pb.go index bf486d8b..04f9ffb7 100644 --- a/internal/app/state/ssl_gc_state.pb.go +++ b/internal/app/state/ssl_gc_state.pb.go @@ -618,6 +618,7 @@ type TeamInfo struct { ChallengeFlags *int32 `protobuf:"varint,17,opt,name=challenge_flags,json=challengeFlags" json:"challenge_flags,omitempty"` BotSubstitutionAllowed *bool `protobuf:"varint,18,opt,name=bot_substitution_allowed,json=botSubstitutionAllowed" json:"bot_substitution_allowed,omitempty"` BotSubstitutionsLeft *int32 `protobuf:"varint,19,opt,name=bot_substitutions_left,json=botSubstitutionsLeft" json:"bot_substitutions_left,omitempty"` + BotSubstitutionTimeLeft *durationpb.Duration `protobuf:"bytes,20,opt,name=bot_substitution_time_left,json=botSubstitutionTimeLeft" json:"bot_substitution_time_left,omitempty"` } func (x *TeamInfo) Reset() { @@ -785,6 +786,13 @@ func (x *TeamInfo) GetBotSubstitutionsLeft() int32 { return 0 } +func (x *TeamInfo) GetBotSubstitutionTimeLeft() *durationpb.Duration { + if x != nil { + return x.BotSubstitutionTimeLeft + } + return nil +} + type State struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1103,7 +1111,7 @@ var file_ssl_gc_state_proto_rawDesc = []byte{ 0x03, 0x28, 0x0b, 0x32, 0x09, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x61, 0x63, 0x63, - 0x65, 0x70, 0x74, 0x65, 0x64, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x22, 0xda, 0x07, 0x0a, 0x08, + 0x65, 0x70, 0x74, 0x65, 0x64, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x22, 0xb2, 0x08, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x67, 0x6f, 0x61, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x67, 0x6f, 0x61, @@ -1165,90 +1173,96 @@ var file_ssl_gc_state_proto_rawDesc = []byte{ 0x65, 0x64, 0x12, 0x34, 0x0a, 0x16, 0x62, 0x6f, 0x74, 0x5f, 0x73, 0x75, 0x62, 0x73, 0x74, 0x69, 0x74, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x6c, 0x65, 0x66, 0x74, 0x18, 0x13, 0x20, 0x01, 0x28, 0x05, 0x52, 0x14, 0x62, 0x6f, 0x74, 0x53, 0x75, 0x62, 0x73, 0x74, 0x69, 0x74, 0x75, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x4c, 0x65, 0x66, 0x74, 0x22, 0xa4, 0x08, 0x0a, 0x05, 0x53, 0x74, 0x61, - 0x74, 0x65, 0x12, 0x24, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x0e, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x67, - 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, - 0x61, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, - 0x61, 0x6e, 0x64, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x29, 0x0a, 0x0a, - 0x67, 0x61, 0x6d, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x0a, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x09, 0x67, 0x61, - 0x6d, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x47, 0x0a, 0x12, 0x73, 0x74, 0x61, 0x67, 0x65, - 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x65, 0x6c, 0x61, 0x70, 0x73, 0x65, 0x64, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, - 0x73, 0x74, 0x61, 0x67, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x45, 0x6c, 0x61, 0x70, 0x73, 0x65, 0x64, - 0x12, 0x41, 0x0a, 0x0f, 0x73, 0x74, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x6c, - 0x65, 0x66, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x73, 0x74, 0x61, 0x67, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x4c, - 0x65, 0x66, 0x74, 0x12, 0x44, 0x0a, 0x10, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x74, 0x69, 0x6d, - 0x65, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0e, 0x6d, 0x61, 0x74, 0x63, 0x68, - 0x54, 0x69, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x34, 0x0a, 0x0a, 0x74, 0x65, 0x61, - 0x6d, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x65, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x74, 0x65, 0x61, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, - 0x2d, 0x0a, 0x0d, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x6f, 0x73, - 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x32, - 0x52, 0x0c, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x6f, 0x73, 0x12, 0x2b, - 0x0a, 0x0c, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x0a, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x0b, - 0x6e, 0x65, 0x78, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x5c, 0x0a, 0x1d, 0x63, - 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, - 0x6d, 0x65, 0x5f, 0x72, 0x65, 0x6d, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x0c, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x1a, 0x63, - 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, - 0x52, 0x65, 0x6d, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x12, 0x2b, 0x0a, 0x0b, 0x67, 0x61, 0x6d, - 0x65, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0a, - 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x67, 0x61, 0x6d, 0x65, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x37, 0x0a, 0x0f, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, - 0x61, 0x6c, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x0e, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, - 0x0e, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x12, - 0x25, 0x0a, 0x08, 0x64, 0x69, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0f, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x09, 0x2e, 0x44, 0x69, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x64, 0x69, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x33, 0x0a, 0x12, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, - 0x6b, 0x69, 0x63, 0x6b, 0x6f, 0x66, 0x66, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x11, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x05, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x10, 0x66, 0x69, 0x72, 0x73, 0x74, - 0x4b, 0x69, 0x63, 0x6b, 0x6f, 0x66, 0x66, 0x54, 0x65, 0x61, 0x6d, 0x12, 0x29, 0x0a, 0x0a, 0x6d, - 0x61, 0x74, 0x63, 0x68, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x0a, 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x54, 0x79, 0x70, 0x65, 0x52, 0x09, 0x6d, 0x61, 0x74, - 0x63, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x4a, 0x0a, 0x13, 0x72, 0x65, 0x61, 0x64, 0x79, 0x5f, - 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x14, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, - 0x11, 0x72, 0x65, 0x61, 0x64, 0x79, 0x43, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x54, 0x69, - 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x0e, 0x73, 0x68, 0x6f, 0x6f, 0x74, 0x6f, 0x75, 0x74, 0x5f, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x53, 0x68, 0x6f, - 0x6f, 0x74, 0x6f, 0x75, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x0d, 0x73, 0x68, 0x6f, 0x6f, - 0x74, 0x6f, 0x75, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x16, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x1a, 0x47, 0x0a, 0x0e, 0x54, 0x65, 0x61, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x1f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x09, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x4a, 0x04, 0x08, 0x10, 0x10, 0x11, 0x22, - 0xcc, 0x01, 0x0a, 0x0d, 0x53, 0x68, 0x6f, 0x6f, 0x74, 0x6f, 0x75, 0x74, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x12, 0x22, 0x0a, 0x09, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x05, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x08, 0x6e, 0x65, 0x78, - 0x74, 0x54, 0x65, 0x61, 0x6d, 0x12, 0x52, 0x0a, 0x12, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x5f, - 0x6f, 0x66, 0x5f, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x24, 0x2e, 0x53, 0x68, 0x6f, 0x6f, 0x74, 0x6f, 0x75, 0x74, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x2e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, - 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x10, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, - 0x66, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x73, 0x1a, 0x43, 0x0a, 0x15, 0x4e, 0x75, 0x6d, - 0x62, 0x65, 0x72, 0x4f, 0x66, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x3f, - 0x5a, 0x3d, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x52, 0x6f, 0x62, - 0x6f, 0x43, 0x75, 0x70, 0x2d, 0x53, 0x53, 0x4c, 0x2f, 0x73, 0x73, 0x6c, 0x2d, 0x67, 0x61, 0x6d, - 0x65, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x2f, 0x69, 0x6e, 0x74, - 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x61, 0x70, 0x70, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x69, 0x6f, 0x6e, 0x73, 0x4c, 0x65, 0x66, 0x74, 0x12, 0x56, 0x0a, 0x1a, 0x62, 0x6f, 0x74, 0x5f, + 0x73, 0x75, 0x62, 0x73, 0x74, 0x69, 0x74, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, + 0x65, 0x5f, 0x6c, 0x65, 0x66, 0x74, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, + 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x17, 0x62, 0x6f, 0x74, 0x53, 0x75, 0x62, 0x73, + 0x74, 0x69, 0x74, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x4c, 0x65, 0x66, 0x74, + 0x22, 0xa4, 0x08, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x24, 0x0a, 0x05, 0x73, 0x74, + 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0e, 0x2e, 0x52, 0x65, 0x66, 0x65, + 0x72, 0x65, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x67, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x67, 0x65, + 0x12, 0x22, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x08, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x07, 0x63, 0x6f, 0x6d, + 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x29, 0x0a, 0x0a, 0x67, 0x61, 0x6d, 0x65, 0x5f, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x52, 0x09, 0x67, 0x61, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, + 0x47, 0x0a, 0x12, 0x73, 0x74, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x65, 0x6c, + 0x61, 0x70, 0x73, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x73, 0x74, 0x61, 0x67, 0x65, 0x54, 0x69, 0x6d, + 0x65, 0x45, 0x6c, 0x61, 0x70, 0x73, 0x65, 0x64, 0x12, 0x41, 0x0a, 0x0f, 0x73, 0x74, 0x61, 0x67, + 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x6c, 0x65, 0x66, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x73, 0x74, + 0x61, 0x67, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x4c, 0x65, 0x66, 0x74, 0x12, 0x44, 0x0a, 0x10, 0x6d, + 0x61, 0x74, 0x63, 0x68, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x52, 0x0e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x72, + 0x74, 0x12, 0x34, 0x0a, 0x0a, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, + 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x54, 0x65, + 0x61, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x74, 0x65, + 0x61, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2d, 0x0a, 0x0d, 0x70, 0x6c, 0x61, 0x63, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x6f, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, + 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x32, 0x52, 0x0c, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x50, 0x6f, 0x73, 0x12, 0x2b, 0x0a, 0x0c, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x63, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x43, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x0b, 0x6e, 0x65, 0x78, 0x74, 0x43, 0x6f, 0x6d, 0x6d, + 0x61, 0x6e, 0x64, 0x12, 0x5c, 0x0a, 0x1d, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x72, 0x65, 0x6d, 0x61, 0x69, + 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x1a, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x41, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x65, 0x6d, 0x61, 0x69, 0x6e, 0x69, 0x6e, + 0x67, 0x12, 0x2b, 0x0a, 0x0b, 0x67, 0x61, 0x6d, 0x65, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, + 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x52, 0x0a, 0x67, 0x61, 0x6d, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x37, + 0x0a, 0x0f, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, + 0x73, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, + 0x61, 0x6c, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x0e, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, + 0x6c, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x12, 0x25, 0x0a, 0x08, 0x64, 0x69, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x09, 0x2e, 0x44, 0x69, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x64, 0x69, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x33, + 0x0a, 0x12, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x6b, 0x69, 0x63, 0x6b, 0x6f, 0x66, 0x66, 0x5f, + 0x74, 0x65, 0x61, 0x6d, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x05, 0x2e, 0x54, 0x65, 0x61, + 0x6d, 0x52, 0x10, 0x66, 0x69, 0x72, 0x73, 0x74, 0x4b, 0x69, 0x63, 0x6b, 0x6f, 0x66, 0x66, 0x54, + 0x65, 0x61, 0x6d, 0x12, 0x29, 0x0a, 0x0a, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x74, 0x79, 0x70, + 0x65, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0a, 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x54, + 0x79, 0x70, 0x65, 0x52, 0x09, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x4a, + 0x0a, 0x13, 0x72, 0x65, 0x61, 0x64, 0x79, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, + 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x11, 0x72, 0x65, 0x61, 0x64, 0x79, 0x43, 0x6f, + 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x0e, 0x73, 0x68, + 0x6f, 0x6f, 0x74, 0x6f, 0x75, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x15, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x53, 0x68, 0x6f, 0x6f, 0x74, 0x6f, 0x75, 0x74, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x52, 0x0d, 0x73, 0x68, 0x6f, 0x6f, 0x74, 0x6f, 0x75, 0x74, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, 0x6d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x18, 0x16, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x47, 0x0a, 0x0e, 0x54, 0x65, 0x61, 0x6d, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x1f, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x09, 0x2e, 0x54, 0x65, + 0x61, 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x4a, 0x04, 0x08, 0x10, 0x10, 0x11, 0x22, 0xcc, 0x01, 0x0a, 0x0d, 0x53, 0x68, 0x6f, 0x6f, + 0x74, 0x6f, 0x75, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x22, 0x0a, 0x09, 0x6e, 0x65, 0x78, + 0x74, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x05, 0x2e, 0x54, + 0x65, 0x61, 0x6d, 0x52, 0x08, 0x6e, 0x65, 0x78, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x12, 0x52, 0x0a, + 0x12, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x6f, 0x66, 0x5f, 0x61, 0x74, 0x74, 0x65, 0x6d, + 0x70, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x53, 0x68, 0x6f, 0x6f, + 0x74, 0x6f, 0x75, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x4f, 0x66, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x10, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, + 0x73, 0x1a, 0x43, 0x0a, 0x15, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x41, 0x74, 0x74, + 0x65, 0x6d, 0x70, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x3f, 0x5a, 0x3d, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x52, 0x6f, 0x62, 0x6f, 0x43, 0x75, 0x70, 0x2d, 0x53, 0x53, 0x4c, + 0x2f, 0x73, 0x73, 0x6c, 0x2d, 0x67, 0x61, 0x6d, 0x65, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x6c, 0x65, 0x72, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x61, 0x70, + 0x70, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, } var ( @@ -1309,31 +1323,32 @@ var file_ssl_gc_state_proto_depIdxs = []int32{ 16, // 16: TeamInfo.requests_bot_substitution_since:type_name -> google.protobuf.Timestamp 16, // 17: TeamInfo.requests_timeout_since:type_name -> google.protobuf.Timestamp 16, // 18: TeamInfo.requests_emergency_stop_since:type_name -> google.protobuf.Timestamp - 18, // 19: State.stage:type_name -> Referee.Stage - 5, // 20: State.command:type_name -> Command - 6, // 21: State.game_state:type_name -> GameState - 15, // 22: State.stage_time_elapsed:type_name -> google.protobuf.Duration - 15, // 23: State.stage_time_left:type_name -> google.protobuf.Duration - 16, // 24: State.match_time_start:type_name -> google.protobuf.Timestamp - 12, // 25: State.team_state:type_name -> State.TeamStateEntry - 19, // 26: State.placement_pos:type_name -> Vector2 - 5, // 27: State.next_command:type_name -> Command - 15, // 28: State.current_action_time_remaining:type_name -> google.protobuf.Duration - 14, // 29: State.game_events:type_name -> GameEvent - 8, // 30: State.proposal_groups:type_name -> ProposalGroup - 20, // 31: State.division:type_name -> Division - 17, // 32: State.first_kickoff_team:type_name -> Team - 21, // 33: State.match_type:type_name -> MatchType - 16, // 34: State.ready_continue_time:type_name -> google.protobuf.Timestamp - 11, // 35: State.shootout_state:type_name -> ShootoutState - 17, // 36: ShootoutState.next_team:type_name -> Team - 13, // 37: ShootoutState.number_of_attempts:type_name -> ShootoutState.NumberOfAttemptsEntry - 9, // 38: State.TeamStateEntry.value:type_name -> TeamInfo - 39, // [39:39] is the sub-list for method output_type - 39, // [39:39] is the sub-list for method input_type - 39, // [39:39] is the sub-list for extension type_name - 39, // [39:39] is the sub-list for extension extendee - 0, // [0:39] is the sub-list for field type_name + 15, // 19: TeamInfo.bot_substitution_time_left:type_name -> google.protobuf.Duration + 18, // 20: State.stage:type_name -> Referee.Stage + 5, // 21: State.command:type_name -> Command + 6, // 22: State.game_state:type_name -> GameState + 15, // 23: State.stage_time_elapsed:type_name -> google.protobuf.Duration + 15, // 24: State.stage_time_left:type_name -> google.protobuf.Duration + 16, // 25: State.match_time_start:type_name -> google.protobuf.Timestamp + 12, // 26: State.team_state:type_name -> State.TeamStateEntry + 19, // 27: State.placement_pos:type_name -> Vector2 + 5, // 28: State.next_command:type_name -> Command + 15, // 29: State.current_action_time_remaining:type_name -> google.protobuf.Duration + 14, // 30: State.game_events:type_name -> GameEvent + 8, // 31: State.proposal_groups:type_name -> ProposalGroup + 20, // 32: State.division:type_name -> Division + 17, // 33: State.first_kickoff_team:type_name -> Team + 21, // 34: State.match_type:type_name -> MatchType + 16, // 35: State.ready_continue_time:type_name -> google.protobuf.Timestamp + 11, // 36: State.shootout_state:type_name -> ShootoutState + 17, // 37: ShootoutState.next_team:type_name -> Team + 13, // 38: ShootoutState.number_of_attempts:type_name -> ShootoutState.NumberOfAttemptsEntry + 9, // 39: State.TeamStateEntry.value:type_name -> TeamInfo + 40, // [40:40] is the sub-list for method output_type + 40, // [40:40] is the sub-list for method input_type + 40, // [40:40] is the sub-list for extension type_name + 40, // [40:40] is the sub-list for extension extendee + 0, // [0:40] is the sub-list for field type_name } func init() { file_ssl_gc_state_proto_init() } diff --git a/internal/app/state/teaminfo.go b/internal/app/state/teaminfo.go index d202fe2b..1c27b43a 100644 --- a/internal/app/state/teaminfo.go +++ b/internal/app/state/teaminfo.go @@ -21,6 +21,7 @@ func newTeamInfo() (t *TeamInfo) { t.ChallengeFlags = new(int32) t.BotSubstitutionAllowed = new(bool) t.BotSubstitutionsLeft = new(int32) + t.BotSubstitutionTimeLeft = new(durationpb.Duration) *t.CanPlaceBall = true *t.Name = "Unknown" diff --git a/internal/app/statemachine/change_gameevent.go b/internal/app/statemachine/change_gameevent.go index 04ba7547..ec8b4468 100644 --- a/internal/app/statemachine/change_gameevent.go +++ b/internal/app/statemachine/change_gameevent.go @@ -112,11 +112,14 @@ func (s *StateMachine) processChangeAddGameEvent(newState *state.State, change * // bot substitution if *gameEvent.Type == state.GameEvent_BOT_SUBSTITUTION { // halt the game to allow teams to substitute robots - changes = append(changes, createCommandChange(state.NewCommandNeutral(state.Command_HALT))) + if !newState.GameState.IsHalted() { + changes = append(changes, createCommandChange(state.NewCommandNeutral(state.Command_HALT))) + } event := gameEvent.GetBotSubstitution() if event.ByTeam.Known() { *newState.TeamInfo(*event.ByTeam).BotSubstitutionAllowed = true + newState.TeamInfo(*event.ByTeam).BotSubstitutionTimeLeft = durationpb.New(s.gameConfig.BotSubstitutionTime) if *newState.TeamInfo(*event.ByTeam).BotSubstitutionsLeft > 0 { *newState.TeamInfo(*event.ByTeam).BotSubstitutionsLeft-- } else { diff --git a/proto/ssl_gc_rcon_remotecontrol.proto b/proto/ssl_gc_rcon_remotecontrol.proto index df8e5e1d..4e2717e2 100644 --- a/proto/ssl_gc_rcon_remotecontrol.proto +++ b/proto/ssl_gc_rcon_remotecontrol.proto @@ -97,6 +97,12 @@ message RemoteControlTeamState { // if true, team is allowed to substitute robots optional bool can_substitute_robot = 11; + + // number of bot substitutions left by the team in this halftime + optional uint32 bot_substitutions_left = 13; + + // number of seconds left for current bot substitution + optional float bot_substitution_time_left = 14; } // All possible request types that the remote control can make diff --git a/proto/ssl_gc_referee_message.proto b/proto/ssl_gc_referee_message.proto index 5cbad3d7..d71a4b1c 100644 --- a/proto/ssl_gc_referee_message.proto +++ b/proto/ssl_gc_referee_message.proto @@ -162,6 +162,8 @@ message Referee { optional bool bot_substitution_allowed = 16; // The number of bot substitutions left by the team in this halftime optional uint32 bot_substitutions_left = 17; + // The number of microseconds left for current bot substitution + optional uint32 bot_substitution_time_left = 18; } // Information about the two teams. diff --git a/proto/ssl_gc_state.proto b/proto/ssl_gc_state.proto index e2724b91..888e0e60 100644 --- a/proto/ssl_gc_state.proto +++ b/proto/ssl_gc_state.proto @@ -100,6 +100,7 @@ message TeamInfo { optional int32 challenge_flags = 17; optional bool bot_substitution_allowed = 18; optional int32 bot_substitutions_left = 19; + optional google.protobuf.Duration bot_substitution_time_left = 20; } message State {