X-Git-Url: https://git.r.bdr.sh/rbdr/mobius/blobdiff_plain/2b7fabb5a1ff6092dd3ea62bd882dd0c02951b81..9a75b7cbfa6fa37ed10732bbff8b722d652a1cdc:/hotline/tracker.go diff --git a/hotline/tracker.go b/hotline/tracker.go index bd7aa00..a56059f 100644 --- a/hotline/tracker.go +++ b/hotline/tracker.go @@ -4,49 +4,49 @@ import ( "bufio" "encoding/binary" "fmt" - "github.com/jhalter/mobius/concat" + "io" "net" + "slices" "strconv" "time" ) // TrackerRegistration represents the payload a Hotline server sends to a Tracker to register type TrackerRegistration struct { - Port [2]byte // Server listening port number + Port [2]byte // Server's listening TCP port number UserCount int // Number of users connected to this particular server - PassID []byte // Random number generated by the server + PassID [4]byte // Random number generated by the server Name string // Server name Description string // Description of the server } -// TODO: reimplement as io.Reader -func (tr *TrackerRegistration) Read() []byte { +// Read implements io.Reader to write tracker registration payload bytes to slice +func (tr *TrackerRegistration) Read(p []byte) (int, error) { userCount := make([]byte, 2) binary.BigEndian.PutUint16(userCount, uint16(tr.UserCount)) - return concat.Slices( - []byte{0x00, 0x01}, + return copy(p, slices.Concat( + []byte{0x00, 0x01}, // Magic number, always 1 tr.Port[:], userCount, - []byte{0x00, 0x00}, - tr.PassID, + []byte{0x00, 0x00}, // Magic number, always 0 + tr.PassID[:], []byte{uint8(len(tr.Name))}, []byte(tr.Name), []byte{uint8(len(tr.Description))}, []byte(tr.Description), - ) + )[:]), io.EOF } func register(tracker string, tr *TrackerRegistration) error { conn, err := net.Dial("udp", tracker) if err != nil { - return err + return fmt.Errorf("failed to dial tracker: %w", err) } + defer conn.Close() - b := tr.Read() - - if _, err := conn.Write(b); err != nil { - return err + if _, err := io.Copy(conn, tr); err != nil { + return fmt.Errorf("failed to write to connection: %w", err) } return nil