]> git.r.bdr.sh - rbdr/mobius/blobdiff - hotline/tracker.go
Fix userAdminFlag bug
[rbdr/mobius] / hotline / tracker.go
index 0dce9494b393e6776a64c03b21d7d1d97113ea42..63fb279bf29dc53a89c63a7c5e22d2958d613ce3 100644 (file)
@@ -12,11 +12,11 @@ import (
 )
 
 type TrackerRegistration struct {
-       Port        []byte // Server listening port number
-       UserCount   int    // Number of users connected to this particular server
-       PassID      []byte // Random number generated by the server
-       Name        string // Server name
-       Description string // Description of the server
+       Port        [2]byte // Server listening port number
+       UserCount   int     // Number of users connected to this particular server
+       PassID      []byte  // Random number generated by the server
+       Name        string  // Server name
+       Description string  // Description of the server
 }
 
 func (tr *TrackerRegistration) Payload() []byte {
@@ -25,7 +25,7 @@ func (tr *TrackerRegistration) Payload() []byte {
 
        return concat.Slices(
                []byte{0x00, 0x01},
-               tr.Port,
+               tr.Port[:],
                userCount,
                []byte{0x00, 0x00},
                tr.PassID,
@@ -36,7 +36,7 @@ func (tr *TrackerRegistration) Payload() []byte {
        )
 }
 
-func register(tracker string, tr TrackerRegistration) error {
+func register(tracker string, tr *TrackerRegistration) error {
        conn, err := net.Dial("udp", tracker)
        if err != nil {
                return err
@@ -49,9 +49,6 @@ func register(tracker string, tr TrackerRegistration) error {
        return nil
 }
 
-type ServerListing struct {
-}
-
 const trackerTimeout = 5 * time.Second
 
 // All string values use 8-bit ASCII character set encoding.
@@ -67,10 +64,10 @@ type TrackerHeader struct {
        Version  [2]byte // Old protocol (1) or new (2)
 }
 
-//Message type 2       1       Sending list of servers
-//Message data size    2               Remaining size of this request
-//Number of servers    2               Number of servers in the server list
-//Number of servers    2               Same as previous field
+// Message type        2       1       Sending list of servers
+// Message data size   2               Remaining size of this request
+// Number of servers   2               Number of servers in the server list
+// Number of servers   2               Same as previous field
 type ServerInfoHeader struct {
        MsgType     [2]byte // always has value of 1
        MsgDataSize [2]byte // Remaining size of request
@@ -79,18 +76,21 @@ type ServerInfoHeader struct {
 }
 
 type ServerRecord struct {
-       IPAddr          []byte
-       Port            []byte
-       NumUsers        []byte // Number of users connected to this particular server
-       Unused          []byte
+       IPAddr          [4]byte
+       Port            [2]byte
+       NumUsers        [2]byte // Number of users connected to this particular server
+       Unused          [2]byte
        NameSize        byte   // Length of name string
-       Name            []byte // Server’s name
+       Name            []byte // Server name
        DescriptionSize byte
        Description     []byte
 }
 
 func GetListing(addr string) ([]ServerRecord, error) {
        conn, err := net.DialTimeout("tcp", addr, trackerTimeout)
+       if err != nil {
+               return []ServerRecord{}, err
+       }
        defer func() { _ = conn.Close() }()
 
        _, err = conn.Write(
@@ -162,11 +162,11 @@ func GetListing(addr string) ([]ServerRecord, error) {
 }
 
 func (s *ServerRecord) Read(b []byte) (n int, err error) {
-       s.IPAddr = b[0:4]
-       s.Port = b[4:6]
-       s.NumUsers = b[6:8]
-       s.NameSize = b[10]
+       copy(s.IPAddr[:], b[0:4])
+       copy(s.Port[:], b[4:6])
+       copy(s.NumUsers[:], b[6:8])
        nameLen := int(b[10])
+
        s.Name = b[11 : 11+nameLen]
        s.DescriptionSize = b[11+nameLen]
        s.Description = b[12+nameLen : 12+nameLen+int(s.DescriptionSize)]
@@ -175,13 +175,13 @@ func (s *ServerRecord) Read(b []byte) (n int, err error) {
 }
 
 func (s *ServerRecord) PortInt() int {
-       data := binary.BigEndian.Uint16(s.Port)
+       data := binary.BigEndian.Uint16(s.Port[:])
        return int(data)
 }
 
 func (s *ServerRecord) Addr() string {
        return fmt.Sprintf("%s:%s",
-               net.IP(s.IPAddr),
-               strconv.Itoa(int(binary.BigEndian.Uint16(s.Port))),
+               net.IP(s.IPAddr[:]),
+               strconv.Itoa(int(binary.BigEndian.Uint16(s.Port[:]))),
        )
 }