// own function, because it is used in GetClientInfo() & GetAllClientInfo() func parseClientInfoResponse(response *cubecode.Packet) (clientInfoRaw ClientInfoRaw, err error) { // omit 7 first bytes: EXTENDED_INFO, EXTENDED_INFO_CLIENT_INFO, CN, EXTENDED_INFO_ACK, EXTENDED_INFO_VERSION, EXTENDED_INFO_NO_ERROR, EXTENDED_INFO_CLIENT_INFO_RESPONSE_INFO for i := 0; i < 7; i++ { _, err = response.ReadInt() if err != nil { err = errors.New("extinfo: error skipping response header: " + err.Error()) return } } clientInfoRaw.ClientNum, err = response.ReadInt() if err != nil { err = errors.New("extinfo: error reading client number: " + err.Error()) return } clientInfoRaw.Ping, err = response.ReadInt() if err != nil { err = errors.New("extinfo: error reading ping: " + err.Error()) return } clientInfoRaw.Name, err = response.ReadString() if err != nil { err = errors.New("extinfo: error reading client name: " + err.Error()) return } clientInfoRaw.Team, err = response.ReadString() if err != nil { err = errors.New("extinfo: error reading team: " + err.Error()) return } clientInfoRaw.Frags, err = response.ReadInt() if err != nil { err = errors.New("extinfo: error reading frags: " + err.Error()) return } clientInfoRaw.Flags, err = response.ReadInt() if err != nil { err = errors.New("extinfo: error reading flags: " + err.Error()) return } clientInfoRaw.Deaths, err = response.ReadInt() if err != nil { err = errors.New("extinfo: error reading deaths: " + err.Error()) return } clientInfoRaw.Teamkills, err = response.ReadInt() if err != nil { err = errors.New("extinfo: error reading teamkills: " + err.Error()) return } clientInfoRaw.Accuracy, err = response.ReadInt() if err != nil { err = errors.New("extinfo: error reading accuracy: " + err.Error()) return } clientInfoRaw.Health, err = response.ReadInt() if err != nil { err = errors.New("extinfo: error reading health: " + err.Error()) return } clientInfoRaw.Armour, err = response.ReadInt() if err != nil { err = errors.New("extinfo: error reading armour: " + err.Error()) return } clientInfoRaw.Weapon, err = response.ReadInt() if err != nil { err = errors.New("extinfo: error reading weapon in use: " + err.Error()) return } clientInfoRaw.Privilege, err = response.ReadInt() if err != nil { err = errors.New("extinfo: error reading client privilege: " + err.Error()) return } clientInfoRaw.State, err = response.ReadInt() if err != nil { err = errors.New("extinfo: error reading client state: " + err.Error()) return } // IP from next 4 bytes var ipByte1, ipByte2, ipByte3, ipByte4 byte ipByte1, err = response.ReadByte() if err != nil { err = errors.New("extinfo: error reading first IP byte: " + err.Error()) return } ipByte2, err = response.ReadByte() if err != nil { err = errors.New("extinfo: error reading second IP byte: " + err.Error()) return } ipByte3, err = response.ReadByte() if err != nil { err = errors.New("extinfo: error reading third IP byte: " + err.Error()) return } ipByte4 = 0 // sauer never sends 4th IP byte for privacy reasons clientInfoRaw.IP = net.IPv4(ipByte1, ipByte2, ipByte3, ipByte4) return }