diff --git a/internal/app/publish/publisher.go b/internal/app/publish/publisher.go index fcc2b7ec..58ae9aab 100644 --- a/internal/app/publish/publisher.go +++ b/internal/app/publish/publisher.go @@ -76,12 +76,9 @@ func (p *Publisher) SendMessage(refereeMsg *state.Referee) { if len(p.conns) == 0 && !p.connect() { return } + + bytes, err := marshalRefereeMessage(refereeMsg) for _, conn := range p.conns { - bytes, err := proto.Marshal(refereeMsg) - if err != nil { - log.Printf("Could not marshal referee message: %v\nError: %v", refereeMsg, err) - return - } _, err = conn.Write(bytes) if err != nil { log.Println("Could not write referee message:", err) @@ -89,3 +86,29 @@ func (p *Publisher) SendMessage(refereeMsg *state.Referee) { } } } + +func marshalRefereeMessage(refereeMsg *state.Referee) ([]byte, error) { + bytes, err := proto.Marshal(refereeMsg) + if err != nil { + log.Printf("Could not marshal referee message: %v\nError: %v", refereeMsg, err) + return nil, err + } + + if len(bytes) > maxDatagramSize { + log.Printf("Referee message is too large (%d bytes) to send in one packet. Shortening message.", len(bytes)) + + shortenedRefereeMsg := proto.Clone(refereeMsg).(*state.Referee) + shortenedRefereeMsg.GameEvents = []*state.GameEvent{} + shortenedRefereeMsg.GameEventProposals = []*state.GameEventProposalGroup{} + + bytes, err = proto.Marshal(shortenedRefereeMsg) + if err != nil { + log.Printf("Could not marshal referee message: %v\nError: %v", shortenedRefereeMsg, err) + return nil, err + } + + return bytes, nil + } + + return bytes, nil +}