Exemple #1
0
// 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
}