Merge pull request #15 from mdiluz/rover-logs-and-communication

Add rover logs
This commit is contained in:
Marc Di Luzio 2020-07-09 19:42:48 +01:00 committed by GitHub
commit 2671398593
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 285 additions and 121 deletions

View file

@ -90,6 +90,13 @@ func (s *Server) Status(ctx context.Context, req *rove.StatusRequest) (response
Bearing: q.Bearing, Bearing: q.Bearing,
}) })
} }
var logs []*rove.Log
for _, log := range rover.Logs {
logs = append(logs, &rove.Log{
Text: log.Text,
Time: fmt.Sprintf("%d", log.Time.Unix()), // proto uses strings under the hood for 64bit ints anyway
})
}
response = &rove.StatusResponse{ response = &rove.StatusResponse{
Name: rover.Name, Name: rover.Name,
@ -106,6 +113,7 @@ func (s *Server) Status(ctx context.Context, req *rove.StatusRequest) (response
MaximumCharge: int32(rover.MaximumCharge), MaximumCharge: int32(rover.MaximumCharge),
IncomingCommands: incoming, IncomingCommands: incoming,
QueuedCommands: queued, QueuedCommands: queued,
Logs: logs,
} }
} }
return response, nil return response, nil

View file

@ -1,10 +1,23 @@
package game package game
import ( import (
"fmt"
"log"
"time"
"github.com/mdiluz/rove/pkg/objects" "github.com/mdiluz/rove/pkg/objects"
"github.com/mdiluz/rove/pkg/vector" "github.com/mdiluz/rove/pkg/vector"
) )
// RoverLogEntry describes a single log entry for the rover
type RoverLogEntry struct {
// Time is the timestamp of the entry
Time time.Time `json:"time"`
// Text contains the information in this log entry
Text string `json:"text"`
}
// Rover describes a single rover in the world // Rover describes a single rover in the world
type Rover struct { type Rover struct {
// Unique name of this rover // Unique name of this rover
@ -31,6 +44,21 @@ type Rover struct {
// Charge is the amount of energy the rover has // Charge is the amount of energy the rover has
Charge int `json:"charge"` Charge int `json:"charge"`
// ChargeCharge is the maximum charge able to be stored // MaximumCharge is the maximum charge able to be stored
MaximumCharge int `json:"maximum-Charge"` MaximumCharge int `json:"maximum-Charge"`
// Logs Stores log of information
Logs []RoverLogEntry `json:"logs"`
}
// AddLogEntryf adds an entry to the rovers log
func (r *Rover) AddLogEntryf(format string, args ...interface{}) {
text := fmt.Sprintf(format, args...)
log.Printf("%s log entry: %s", r.Name, text)
r.Logs = append(r.Logs,
RoverLogEntry{
Time: time.Now(),
Text: text,
},
)
} }

View file

@ -122,7 +122,8 @@ func (w *World) SpawnRover() (string, error) {
} }
log.Printf("Spawned rover at %+v\n", rover.Pos) // Add a log entry for robot creation
rover.AddLogEntryf("created at %+v", rover.Pos)
// Append the rover to the list // Append the rover to the list
w.Rovers[rover.Name] = rover w.Rovers[rover.Name] = rover
@ -160,6 +161,7 @@ func (w *World) RoverRecharge(rover string) (int, error) {
// Add one charge // Add one charge
if i.Charge < i.MaximumCharge { if i.Charge < i.MaximumCharge {
i.Charge++ i.Charge++
i.AddLogEntryf("recharged to %d", i.Charge)
} }
w.Rovers[rover] = i w.Rovers[rover] = i
@ -266,12 +268,15 @@ func (w *World) MoveRover(rover string, b bearing.Bearing) (vector.Vector, error
// Get the tile and verify it's empty // Get the tile and verify it's empty
_, obj := w.Atlas.QueryPosition(newPos) _, obj := w.Atlas.QueryPosition(newPos)
if !obj.IsBlocking() { if !obj.IsBlocking() {
i.AddLogEntryf("moved %s to %+v", b.String(), newPos)
// Perform the move // Perform the move
i.Pos = newPos i.Pos = newPos
w.Rovers[rover] = i w.Rovers[rover] = i
} else { } else {
// If it is a blocking tile, reduce the rover integrity // If it is a blocking tile, reduce the rover integrity
i.AddLogEntryf("tried to move %s to %+v", b.String(), newPos)
i.Integrity = i.Integrity - 1 i.Integrity = i.Integrity - 1
i.AddLogEntryf("had a collision, new integrity %d", i.Integrity)
if i.Integrity == 0 { if i.Integrity == 0 {
// TODO: The rover needs to be left dormant with the player // TODO: The rover needs to be left dormant with the player
} else { } else {
@ -308,6 +313,7 @@ func (w *World) RoverStash(rover string) (objects.Type, error) {
return objects.None, nil return objects.None, nil
} }
r.AddLogEntryf("stashed %c", obj.Type)
r.Inventory = append(r.Inventory, obj) r.Inventory = append(r.Inventory, obj)
w.Rovers[rover] = r w.Rovers[rover] = r
w.Atlas.SetObject(r.Pos, objects.Object{Type: objects.None}) w.Atlas.SetObject(r.Pos, objects.Object{Type: objects.None})
@ -480,6 +486,7 @@ func (w *World) ExecuteCommand(c *Command, rover string) (err error) {
if len(r.Inventory) > 0 && r.Integrity < r.MaximumIntegrity { if len(r.Inventory) > 0 && r.Integrity < r.MaximumIntegrity {
r.Inventory = r.Inventory[:len(r.Inventory)-1] r.Inventory = r.Inventory[:len(r.Inventory)-1]
r.Integrity = r.Integrity + 1 r.Integrity = r.Integrity + 1
r.AddLogEntryf("repaired self to %d", r.Integrity)
w.Rovers[rover] = r w.Rovers[rover] = r
} }
case CommandRecharge: case CommandRecharge:

View file

@ -41,6 +41,7 @@ func TestWorld_GetRover(t *testing.T) {
rover, err := world.GetRover(a) rover, err := world.GetRover(a)
assert.NoError(t, err, "Failed to get rover attribs") assert.NoError(t, err, "Failed to get rover attribs")
assert.NotZero(t, rover.Range, "Rover should not be spawned blind") assert.NotZero(t, rover.Range, "Rover should not be spawned blind")
assert.Contains(t, rover.Logs[len(rover.Logs)-1].Text, "created", "Rover logs should contain the creation")
} }
func TestWorld_DestroyRover(t *testing.T) { func TestWorld_DestroyRover(t *testing.T) {
@ -87,6 +88,7 @@ func TestWorld_GetSetMovePosition(t *testing.T) {
rover, err := world.GetRover(a) rover, err := world.GetRover(a)
assert.NoError(t, err, "Failed to get rover information") assert.NoError(t, err, "Failed to get rover information")
assert.Equal(t, rover.MaximumCharge-1, rover.Charge, "Rover should have lost charge for moving") assert.Equal(t, rover.MaximumCharge-1, rover.Charge, "Rover should have lost charge for moving")
assert.Contains(t, rover.Logs[len(rover.Logs)-1].Text, "moved", "Rover logs should contain the move")
// Place a tile in front of the rover // Place a tile in front of the rover
world.Atlas.SetObject(vector.Vector{X: 0, Y: 2}, objects.Object{Type: objects.LargeRock}) world.Atlas.SetObject(vector.Vector{X: 0, Y: 2}, objects.Object{Type: objects.LargeRock})
@ -169,10 +171,11 @@ func TestWorld_RoverStash(t *testing.T) {
assert.Equal(t, i+1, len(inv)) assert.Equal(t, i+1, len(inv))
assert.Equal(t, objects.Object{Type: objects.SmallRock}, inv[i]) assert.Equal(t, objects.Object{Type: objects.SmallRock}, inv[i])
// Check that this didn't reduce the charge // Check that this did reduce the charge
info, err := world.GetRover(a) info, err := world.GetRover(a)
assert.NoError(t, err, "Failed to get rover") assert.NoError(t, err, "Failed to get rover")
assert.Equal(t, info.MaximumCharge-(i+1), info.Charge, "Rover lost charge for stash") assert.Equal(t, info.MaximumCharge-(i+1), info.Charge, "Rover lost charge for stash")
assert.Contains(t, info.Logs[len(info.Logs)-1].Text, "stashed", "Rover logs should contain the move")
} }
// Recharge the rover // Recharge the rover
@ -230,6 +233,7 @@ func TestWorld_RoverDamage(t *testing.T) {
newinfo, err := world.GetRover(a) newinfo, err := world.GetRover(a)
assert.NoError(t, err, "couldn't get rover info") assert.NoError(t, err, "couldn't get rover info")
assert.Equal(t, info.Integrity-1, newinfo.Integrity, "rover should have lost integrity") assert.Equal(t, info.Integrity-1, newinfo.Integrity, "rover should have lost integrity")
assert.Contains(t, newinfo.Logs[len(newinfo.Logs)-1].Text, "collision", "Rover logs should contain the collision")
} }
func TestWorld_RoverRepair(t *testing.T) { func TestWorld_RoverRepair(t *testing.T) {
@ -274,6 +278,7 @@ func TestWorld_RoverRepair(t *testing.T) {
newinfo, err = world.GetRover(a) newinfo, err = world.GetRover(a)
assert.NoError(t, err, "couldn't get rover info") assert.NoError(t, err, "couldn't get rover info")
assert.Equal(t, originalInfo.Integrity, newinfo.Integrity, "rover should have gained integrity") assert.Equal(t, originalInfo.Integrity, newinfo.Integrity, "rover should have gained integrity")
assert.Contains(t, newinfo.Logs[len(newinfo.Logs)-1].Text, "repair", "Rover logs should contain the repair")
// Check again that it can't repair past the max // Check again that it can't repair past the max
world.Atlas.SetObject(pos, objects.Object{Type: objects.SmallRock}) world.Atlas.SetObject(pos, objects.Object{Type: objects.SmallRock})

View file

@ -498,6 +498,63 @@ func (x *StatusRequest) GetAccount() *Account {
return nil return nil
} }
type Log struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
// The unix timestamp of the log
Time string `protobuf:"bytes,1,opt,name=time,proto3" json:"time,omitempty"`
// The text of the log
Text string `protobuf:"bytes,2,opt,name=text,proto3" json:"text,omitempty"`
}
func (x *Log) Reset() {
*x = Log{}
if protoimpl.UnsafeEnabled {
mi := &file_rove_rove_proto_msgTypes[9]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *Log) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*Log) ProtoMessage() {}
func (x *Log) ProtoReflect() protoreflect.Message {
mi := &file_rove_rove_proto_msgTypes[9]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use Log.ProtoReflect.Descriptor instead.
func (*Log) Descriptor() ([]byte, []int) {
return file_rove_rove_proto_rawDescGZIP(), []int{9}
}
func (x *Log) GetTime() string {
if x != nil {
return x.Time
}
return ""
}
func (x *Log) GetText() string {
if x != nil {
return x.Text
}
return ""
}
type StatusResponse struct { type StatusResponse struct {
state protoimpl.MessageState state protoimpl.MessageState
sizeCache protoimpl.SizeCache sizeCache protoimpl.SizeCache
@ -525,12 +582,14 @@ type StatusResponse struct {
IncomingCommands []*Command `protobuf:"bytes,10,rep,name=incomingCommands,proto3" json:"incomingCommands,omitempty"` IncomingCommands []*Command `protobuf:"bytes,10,rep,name=incomingCommands,proto3" json:"incomingCommands,omitempty"`
// The set of currently queued commands // The set of currently queued commands
QueuedCommands []*Command `protobuf:"bytes,11,rep,name=queuedCommands,proto3" json:"queuedCommands,omitempty"` QueuedCommands []*Command `protobuf:"bytes,11,rep,name=queuedCommands,proto3" json:"queuedCommands,omitempty"`
// The most recent logs
Logs []*Log `protobuf:"bytes,12,rep,name=logs,proto3" json:"logs,omitempty"`
} }
func (x *StatusResponse) Reset() { func (x *StatusResponse) Reset() {
*x = StatusResponse{} *x = StatusResponse{}
if protoimpl.UnsafeEnabled { if protoimpl.UnsafeEnabled {
mi := &file_rove_rove_proto_msgTypes[9] mi := &file_rove_rove_proto_msgTypes[10]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi) ms.StoreMessageInfo(mi)
} }
@ -543,7 +602,7 @@ func (x *StatusResponse) String() string {
func (*StatusResponse) ProtoMessage() {} func (*StatusResponse) ProtoMessage() {}
func (x *StatusResponse) ProtoReflect() protoreflect.Message { func (x *StatusResponse) ProtoReflect() protoreflect.Message {
mi := &file_rove_rove_proto_msgTypes[9] mi := &file_rove_rove_proto_msgTypes[10]
if protoimpl.UnsafeEnabled && x != nil { if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil { if ms.LoadMessageInfo() == nil {
@ -556,7 +615,7 @@ func (x *StatusResponse) ProtoReflect() protoreflect.Message {
// Deprecated: Use StatusResponse.ProtoReflect.Descriptor instead. // Deprecated: Use StatusResponse.ProtoReflect.Descriptor instead.
func (*StatusResponse) Descriptor() ([]byte, []int) { func (*StatusResponse) Descriptor() ([]byte, []int) {
return file_rove_rove_proto_rawDescGZIP(), []int{9} return file_rove_rove_proto_rawDescGZIP(), []int{10}
} }
func (x *StatusResponse) GetName() string { func (x *StatusResponse) GetName() string {
@ -636,6 +695,13 @@ func (x *StatusResponse) GetQueuedCommands() []*Command {
return nil return nil
} }
func (x *StatusResponse) GetLogs() []*Log {
if x != nil {
return x.Logs
}
return nil
}
// Empty placeholder // Empty placeholder
type ServerStatusRequest struct { type ServerStatusRequest struct {
state protoimpl.MessageState state protoimpl.MessageState
@ -646,7 +712,7 @@ type ServerStatusRequest struct {
func (x *ServerStatusRequest) Reset() { func (x *ServerStatusRequest) Reset() {
*x = ServerStatusRequest{} *x = ServerStatusRequest{}
if protoimpl.UnsafeEnabled { if protoimpl.UnsafeEnabled {
mi := &file_rove_rove_proto_msgTypes[10] mi := &file_rove_rove_proto_msgTypes[11]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi) ms.StoreMessageInfo(mi)
} }
@ -659,7 +725,7 @@ func (x *ServerStatusRequest) String() string {
func (*ServerStatusRequest) ProtoMessage() {} func (*ServerStatusRequest) ProtoMessage() {}
func (x *ServerStatusRequest) ProtoReflect() protoreflect.Message { func (x *ServerStatusRequest) ProtoReflect() protoreflect.Message {
mi := &file_rove_rove_proto_msgTypes[10] mi := &file_rove_rove_proto_msgTypes[11]
if protoimpl.UnsafeEnabled && x != nil { if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil { if ms.LoadMessageInfo() == nil {
@ -672,7 +738,7 @@ func (x *ServerStatusRequest) ProtoReflect() protoreflect.Message {
// Deprecated: Use ServerStatusRequest.ProtoReflect.Descriptor instead. // Deprecated: Use ServerStatusRequest.ProtoReflect.Descriptor instead.
func (*ServerStatusRequest) Descriptor() ([]byte, []int) { func (*ServerStatusRequest) Descriptor() ([]byte, []int) {
return file_rove_rove_proto_rawDescGZIP(), []int{10} return file_rove_rove_proto_rawDescGZIP(), []int{11}
} }
type ServerStatusResponse struct { type ServerStatusResponse struct {
@ -695,7 +761,7 @@ type ServerStatusResponse struct {
func (x *ServerStatusResponse) Reset() { func (x *ServerStatusResponse) Reset() {
*x = ServerStatusResponse{} *x = ServerStatusResponse{}
if protoimpl.UnsafeEnabled { if protoimpl.UnsafeEnabled {
mi := &file_rove_rove_proto_msgTypes[11] mi := &file_rove_rove_proto_msgTypes[12]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi) ms.StoreMessageInfo(mi)
} }
@ -708,7 +774,7 @@ func (x *ServerStatusResponse) String() string {
func (*ServerStatusResponse) ProtoMessage() {} func (*ServerStatusResponse) ProtoMessage() {}
func (x *ServerStatusResponse) ProtoReflect() protoreflect.Message { func (x *ServerStatusResponse) ProtoReflect() protoreflect.Message {
mi := &file_rove_rove_proto_msgTypes[11] mi := &file_rove_rove_proto_msgTypes[12]
if protoimpl.UnsafeEnabled && x != nil { if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil { if ms.LoadMessageInfo() == nil {
@ -721,7 +787,7 @@ func (x *ServerStatusResponse) ProtoReflect() protoreflect.Message {
// Deprecated: Use ServerStatusResponse.ProtoReflect.Descriptor instead. // Deprecated: Use ServerStatusResponse.ProtoReflect.Descriptor instead.
func (*ServerStatusResponse) Descriptor() ([]byte, []int) { func (*ServerStatusResponse) Descriptor() ([]byte, []int) {
return file_rove_rove_proto_rawDescGZIP(), []int{11} return file_rove_rove_proto_rawDescGZIP(), []int{12}
} }
func (x *ServerStatusResponse) GetVersion() string { func (x *ServerStatusResponse) GetVersion() string {
@ -771,7 +837,7 @@ type Vector struct {
func (x *Vector) Reset() { func (x *Vector) Reset() {
*x = Vector{} *x = Vector{}
if protoimpl.UnsafeEnabled { if protoimpl.UnsafeEnabled {
mi := &file_rove_rove_proto_msgTypes[12] mi := &file_rove_rove_proto_msgTypes[13]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi) ms.StoreMessageInfo(mi)
} }
@ -784,7 +850,7 @@ func (x *Vector) String() string {
func (*Vector) ProtoMessage() {} func (*Vector) ProtoMessage() {}
func (x *Vector) ProtoReflect() protoreflect.Message { func (x *Vector) ProtoReflect() protoreflect.Message {
mi := &file_rove_rove_proto_msgTypes[12] mi := &file_rove_rove_proto_msgTypes[13]
if protoimpl.UnsafeEnabled && x != nil { if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil { if ms.LoadMessageInfo() == nil {
@ -797,7 +863,7 @@ func (x *Vector) ProtoReflect() protoreflect.Message {
// Deprecated: Use Vector.ProtoReflect.Descriptor instead. // Deprecated: Use Vector.ProtoReflect.Descriptor instead.
func (*Vector) Descriptor() ([]byte, []int) { func (*Vector) Descriptor() ([]byte, []int) {
return file_rove_rove_proto_rawDescGZIP(), []int{12} return file_rove_rove_proto_rawDescGZIP(), []int{13}
} }
func (x *Vector) GetX() int32 { func (x *Vector) GetX() int32 {
@ -826,7 +892,7 @@ type Account struct {
func (x *Account) Reset() { func (x *Account) Reset() {
*x = Account{} *x = Account{}
if protoimpl.UnsafeEnabled { if protoimpl.UnsafeEnabled {
mi := &file_rove_rove_proto_msgTypes[13] mi := &file_rove_rove_proto_msgTypes[14]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi) ms.StoreMessageInfo(mi)
} }
@ -839,7 +905,7 @@ func (x *Account) String() string {
func (*Account) ProtoMessage() {} func (*Account) ProtoMessage() {}
func (x *Account) ProtoReflect() protoreflect.Message { func (x *Account) ProtoReflect() protoreflect.Message {
mi := &file_rove_rove_proto_msgTypes[13] mi := &file_rove_rove_proto_msgTypes[14]
if protoimpl.UnsafeEnabled && x != nil { if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil { if ms.LoadMessageInfo() == nil {
@ -852,7 +918,7 @@ func (x *Account) ProtoReflect() protoreflect.Message {
// Deprecated: Use Account.ProtoReflect.Descriptor instead. // Deprecated: Use Account.ProtoReflect.Descriptor instead.
func (*Account) Descriptor() ([]byte, []int) { func (*Account) Descriptor() ([]byte, []int) {
return file_rove_rove_proto_rawDescGZIP(), []int{13} return file_rove_rove_proto_rawDescGZIP(), []int{14}
} }
func (x *Account) GetName() string { func (x *Account) GetName() string {
@ -907,78 +973,83 @@ var file_rove_rove_proto_rawDesc = []byte{
0x22, 0x38, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x22, 0x38, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
0x74, 0x12, 0x27, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x74, 0x12, 0x27, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01,
0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e,
0x74, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x98, 0x03, 0x0a, 0x0e, 0x53, 0x74, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x2d, 0x0a, 0x03, 0x4c, 0x6f,
0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x65, 0x78, 0x74, 0x18, 0x02, 0x20,
0x65, 0x12, 0x28, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x65, 0x78, 0x74, 0x22, 0xb7, 0x03, 0x0a, 0x0e, 0x53, 0x74,
0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04,
0x72, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65,
0x61, 0x6e, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x12, 0x28, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01,
0x65, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x04, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72,
0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61,
0x1a, 0x0a, 0x08, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x6e, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65,
0x05, 0x52, 0x08, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x04, 0x20,
0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1a,
0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x12, 0x2a, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x0a, 0x08, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05,
0x69, 0x6d, 0x75, 0x6d, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x18, 0x07, 0x20, 0x52, 0x08, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e,
0x01, 0x28, 0x05, 0x52, 0x10, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x49, 0x6e, 0x74, 0x65, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x69,
0x67, 0x72, 0x69, 0x74, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x18, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x12, 0x2a, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x69,
0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x12, 0x24, 0x0a, 0x6d, 0x75, 0x6d, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x18, 0x07, 0x20, 0x01,
0x0d, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x18, 0x09, 0x28, 0x05, 0x52, 0x10, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x49, 0x6e, 0x74, 0x65, 0x67,
0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x69, 0x74, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x18, 0x08,
0x72, 0x67, 0x65, 0x12, 0x39, 0x0a, 0x10, 0x69, 0x6e, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x43, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x12, 0x24, 0x0a, 0x0d,
0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x18, 0x09, 0x20,
0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x10, 0x69, 0x6e, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x43, 0x68, 0x61, 0x72,
0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x12, 0x35, 0x67, 0x65, 0x12, 0x39, 0x0a, 0x10, 0x69, 0x6e, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x43, 0x6f,
0x0a, 0x0e, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x72,
0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x10, 0x69, 0x6e, 0x63,
0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x0e, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x43, 0x6f, 0x6d, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x12, 0x35, 0x0a,
0x6d, 0x61, 0x6e, 0x64, 0x73, 0x22, 0x15, 0x0a, 0x13, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x0e, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18,
0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xa1, 0x01, 0x0a, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d,
0x14, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x0e, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x43, 0x6f, 0x6d, 0x6d,
0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x61, 0x6e, 0x64, 0x73, 0x12, 0x1d, 0x0a, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x0c, 0x20, 0x03,
0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0b, 0x32, 0x09, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x4c, 0x6f, 0x67, 0x52, 0x04, 0x6c,
0x14, 0x0a, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x6f, 0x67, 0x73, 0x22, 0x15, 0x0a, 0x13, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61,
0x72, 0x65, 0x61, 0x64, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x69, 0x63, 0x6b, 0x52, 0x61, 0x74, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xa1, 0x01, 0x0a, 0x14, 0x53,
0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x74, 0x69, 0x63, 0x6b, 0x52, 0x61, 0x74, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f,
0x65, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x69, 0x63, 0x6b, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01,
0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a,
0x69, 0x63, 0x6b, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x74, 0x69, 0x63, 0x6b, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x72, 0x65,
0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x65, 0x78, 0x74, 0x54, 0x69, 0x63, 0x6b, 0x61, 0x64, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x69, 0x63, 0x6b, 0x52, 0x61, 0x74, 0x65, 0x18,
0x22, 0x24, 0x0a, 0x06, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x0c, 0x0a, 0x01, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x74, 0x69, 0x63, 0x6b, 0x52, 0x61, 0x74, 0x65, 0x12,
0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x78, 0x12, 0x0c, 0x0a, 0x01, 0x79, 0x18, 0x02, 0x20, 0x20, 0x0a, 0x0b, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x69, 0x63, 0x6b, 0x18, 0x04,
0x01, 0x28, 0x05, 0x52, 0x01, 0x79, 0x22, 0x35, 0x0a, 0x07, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x69, 0x63,
0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x6b, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x74, 0x69, 0x63, 0x6b, 0x18, 0x05,
0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x65, 0x78, 0x74, 0x54, 0x69, 0x63, 0x6b, 0x22, 0x24,
0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x32, 0x91, 0x03, 0x0a, 0x06, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x0c, 0x0a, 0x01, 0x78, 0x18, 0x01, 0x20,
0x0a, 0x04, 0x52, 0x6f, 0x76, 0x65, 0x12, 0x5d, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x01, 0x28, 0x05, 0x52, 0x01, 0x78, 0x12, 0x0c, 0x0a, 0x01, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28,
0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x19, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x65, 0x05, 0x52, 0x01, 0x79, 0x22, 0x35, 0x0a, 0x07, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12,
0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e,
0x74, 0x1a, 0x1a, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x02, 0x20,
0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x32, 0x91, 0x03, 0x0a, 0x04,
0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2d, 0x73, 0x52, 0x6f, 0x76, 0x65, 0x12, 0x5d, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74,
0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x4f, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x61, 0x74, 0x75, 0x73, 0x12, 0x19, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x65, 0x72, 0x76,
0x72, 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x1a, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61,
0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4,
0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x22, 0x09, 0x2f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2d, 0x73, 0x74, 0x61,
0x74, 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x4b, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x74, 0x75, 0x73, 0x12, 0x4f, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12,
0x64, 0x12, 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52,
0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x65,
0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x13, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14,
0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x22, 0x09, 0x2f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65,
0x3a, 0x01, 0x2a, 0x12, 0x43, 0x0a, 0x05, 0x52, 0x61, 0x64, 0x61, 0x72, 0x12, 0x12, 0x2e, 0x72, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x4b, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12,
0x6f, 0x76, 0x65, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65,
0x1a, 0x13, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x73, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d,
0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x13, 0x82, 0xd3,
0x72, 0x61, 0x64, 0x61, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x47, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x3a, 0x01,
0x75, 0x73, 0x12, 0x13, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2a, 0x12, 0x43, 0x0a, 0x05, 0x52, 0x61, 0x64, 0x61, 0x72, 0x12, 0x12, 0x2e, 0x72, 0x6f, 0x76,
0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x65, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13,
0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x12, 0x82, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f,
0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x22, 0x07, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x3a, 0x01, 0x6e, 0x73, 0x65, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x72, 0x61,
0x2a, 0x42, 0x21, 0x5a, 0x1f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x64, 0x61, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x47, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73,
0x6d, 0x64, 0x69, 0x6c, 0x75, 0x7a, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x12, 0x13, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65,
0x72, 0x6f, 0x76, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x74, 0x61,
0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x12, 0x82, 0xd3, 0xe4,
0x93, 0x02, 0x0c, 0x22, 0x07, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x3a, 0x01, 0x2a, 0x42,
0x21, 0x5a, 0x1f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x64,
0x69, 0x6c, 0x75, 0x7a, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x72, 0x6f,
0x76, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
} }
var ( var (
@ -993,7 +1064,7 @@ func file_rove_rove_proto_rawDescGZIP() []byte {
return file_rove_rove_proto_rawDescData return file_rove_rove_proto_rawDescData
} }
var file_rove_rove_proto_msgTypes = make([]protoimpl.MessageInfo, 14) var file_rove_rove_proto_msgTypes = make([]protoimpl.MessageInfo, 15)
var file_rove_rove_proto_goTypes = []interface{}{ var file_rove_rove_proto_goTypes = []interface{}{
(*Command)(nil), // 0: rove.Command (*Command)(nil), // 0: rove.Command
(*CommandRequest)(nil), // 1: rove.CommandRequest (*CommandRequest)(nil), // 1: rove.CommandRequest
@ -1004,36 +1075,38 @@ var file_rove_rove_proto_goTypes = []interface{}{
(*RegisterRequest)(nil), // 6: rove.RegisterRequest (*RegisterRequest)(nil), // 6: rove.RegisterRequest
(*RegisterResponse)(nil), // 7: rove.RegisterResponse (*RegisterResponse)(nil), // 7: rove.RegisterResponse
(*StatusRequest)(nil), // 8: rove.StatusRequest (*StatusRequest)(nil), // 8: rove.StatusRequest
(*StatusResponse)(nil), // 9: rove.StatusResponse (*Log)(nil), // 9: rove.Log
(*ServerStatusRequest)(nil), // 10: rove.ServerStatusRequest (*StatusResponse)(nil), // 10: rove.StatusResponse
(*ServerStatusResponse)(nil), // 11: rove.ServerStatusResponse (*ServerStatusRequest)(nil), // 11: rove.ServerStatusRequest
(*Vector)(nil), // 12: rove.Vector (*ServerStatusResponse)(nil), // 12: rove.ServerStatusResponse
(*Account)(nil), // 13: rove.Account (*Vector)(nil), // 13: rove.Vector
(*Account)(nil), // 14: rove.Account
} }
var file_rove_rove_proto_depIdxs = []int32{ var file_rove_rove_proto_depIdxs = []int32{
13, // 0: rove.CommandRequest.account:type_name -> rove.Account 14, // 0: rove.CommandRequest.account:type_name -> rove.Account
0, // 1: rove.CommandRequest.commands:type_name -> rove.Command 0, // 1: rove.CommandRequest.commands:type_name -> rove.Command
13, // 2: rove.RadarRequest.account:type_name -> rove.Account 14, // 2: rove.RadarRequest.account:type_name -> rove.Account
13, // 3: rove.RegisterResponse.account:type_name -> rove.Account 14, // 3: rove.RegisterResponse.account:type_name -> rove.Account
13, // 4: rove.StatusRequest.account:type_name -> rove.Account 14, // 4: rove.StatusRequest.account:type_name -> rove.Account
12, // 5: rove.StatusResponse.position:type_name -> rove.Vector 13, // 5: rove.StatusResponse.position:type_name -> rove.Vector
0, // 6: rove.StatusResponse.incomingCommands:type_name -> rove.Command 0, // 6: rove.StatusResponse.incomingCommands:type_name -> rove.Command
0, // 7: rove.StatusResponse.queuedCommands:type_name -> rove.Command 0, // 7: rove.StatusResponse.queuedCommands:type_name -> rove.Command
10, // 8: rove.Rove.ServerStatus:input_type -> rove.ServerStatusRequest 9, // 8: rove.StatusResponse.logs:type_name -> rove.Log
6, // 9: rove.Rove.Register:input_type -> rove.RegisterRequest 11, // 9: rove.Rove.ServerStatus:input_type -> rove.ServerStatusRequest
1, // 10: rove.Rove.Command:input_type -> rove.CommandRequest 6, // 10: rove.Rove.Register:input_type -> rove.RegisterRequest
4, // 11: rove.Rove.Radar:input_type -> rove.RadarRequest 1, // 11: rove.Rove.Command:input_type -> rove.CommandRequest
8, // 12: rove.Rove.Status:input_type -> rove.StatusRequest 4, // 12: rove.Rove.Radar:input_type -> rove.RadarRequest
11, // 13: rove.Rove.ServerStatus:output_type -> rove.ServerStatusResponse 8, // 13: rove.Rove.Status:input_type -> rove.StatusRequest
7, // 14: rove.Rove.Register:output_type -> rove.RegisterResponse 12, // 14: rove.Rove.ServerStatus:output_type -> rove.ServerStatusResponse
2, // 15: rove.Rove.Command:output_type -> rove.CommandResponse 7, // 15: rove.Rove.Register:output_type -> rove.RegisterResponse
5, // 16: rove.Rove.Radar:output_type -> rove.RadarResponse 2, // 16: rove.Rove.Command:output_type -> rove.CommandResponse
9, // 17: rove.Rove.Status:output_type -> rove.StatusResponse 5, // 17: rove.Rove.Radar:output_type -> rove.RadarResponse
13, // [13:18] is the sub-list for method output_type 10, // 18: rove.Rove.Status:output_type -> rove.StatusResponse
8, // [8:13] is the sub-list for method input_type 14, // [14:19] is the sub-list for method output_type
8, // [8:8] is the sub-list for extension type_name 9, // [9:14] is the sub-list for method input_type
8, // [8:8] is the sub-list for extension extendee 9, // [9:9] is the sub-list for extension type_name
0, // [0:8] is the sub-list for field type_name 9, // [9:9] is the sub-list for extension extendee
0, // [0:9] is the sub-list for field type_name
} }
func init() { file_rove_rove_proto_init() } func init() { file_rove_rove_proto_init() }
@ -1151,7 +1224,7 @@ func file_rove_rove_proto_init() {
} }
} }
file_rove_rove_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { file_rove_rove_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*StatusResponse); i { switch v := v.(*Log); i {
case 0: case 0:
return &v.state return &v.state
case 1: case 1:
@ -1163,7 +1236,7 @@ func file_rove_rove_proto_init() {
} }
} }
file_rove_rove_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { file_rove_rove_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*ServerStatusRequest); i { switch v := v.(*StatusResponse); i {
case 0: case 0:
return &v.state return &v.state
case 1: case 1:
@ -1175,7 +1248,7 @@ func file_rove_rove_proto_init() {
} }
} }
file_rove_rove_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { file_rove_rove_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*ServerStatusResponse); i { switch v := v.(*ServerStatusRequest); i {
case 0: case 0:
return &v.state return &v.state
case 1: case 1:
@ -1187,7 +1260,7 @@ func file_rove_rove_proto_init() {
} }
} }
file_rove_rove_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { file_rove_rove_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*Vector); i { switch v := v.(*ServerStatusResponse); i {
case 0: case 0:
return &v.state return &v.state
case 1: case 1:
@ -1199,6 +1272,18 @@ func file_rove_rove_proto_init() {
} }
} }
file_rove_rove_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { file_rove_rove_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*Vector); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_rove_rove_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*Account); i { switch v := v.(*Account); i {
case 0: case 0:
return &v.state return &v.state
@ -1217,7 +1302,7 @@ func file_rove_rove_proto_init() {
GoPackagePath: reflect.TypeOf(x{}).PkgPath(), GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
RawDescriptor: file_rove_rove_proto_rawDesc, RawDescriptor: file_rove_rove_proto_rawDesc,
NumEnums: 0, NumEnums: 0,
NumMessages: 14, NumMessages: 15,
NumExtensions: 0, NumExtensions: 0,
NumServices: 1, NumServices: 1,
}, },

View file

@ -251,6 +251,19 @@
"type": "object", "type": "object",
"title": "Empty placeholder" "title": "Empty placeholder"
}, },
"roveLog": {
"type": "object",
"properties": {
"time": {
"type": "string",
"title": "The unix timestamp of the log"
},
"text": {
"type": "string",
"title": "The text of the log"
}
}
},
"roveRadarRequest": { "roveRadarRequest": {
"type": "object", "type": "object",
"properties": { "properties": {
@ -395,6 +408,13 @@
"$ref": "#/definitions/roveCommand" "$ref": "#/definitions/roveCommand"
}, },
"title": "The set of currently queued commands" "title": "The set of currently queued commands"
},
"logs": {
"type": "array",
"items": {
"$ref": "#/definitions/roveLog"
},
"title": "The most recent logs"
} }
} }
}, },

View file

@ -120,6 +120,14 @@ message StatusRequest {
Account account = 1; Account account = 1;
} }
message Log {
// The unix timestamp of the log
string time = 1;
// The text of the log
string text = 2;
}
message StatusResponse { message StatusResponse {
// The name of the rover // The name of the rover
string name = 1; string name = 1;
@ -153,6 +161,9 @@ message StatusResponse {
// The set of currently queued commands // The set of currently queued commands
repeated Command queuedCommands = 11; repeated Command queuedCommands = 11;
// The most recent logs
repeated Log logs = 12;
} }
// Empty placeholder // Empty placeholder