Files
mc-router/mcproto/decode.go
T
Geoff Bourne cc590524c4 Add connection webhook notifications (#392)
Also 

* Added decode of LoginStart message
* Add metrics backend constants
* Updated usage section
* Documented MaxFrameLength
2025-04-21 20:28:34 -05:00

68 lines
1.5 KiB
Go

package mcproto
import (
"bytes"
"github.com/pkg/errors"
)
const invalidPacketDataBytesMsg = "data should be byte slice from Packet.Data"
// DecodeHandshake takes the Packet.Data bytes and decodes a Handshake message from it
func DecodeHandshake(data interface{}) (*Handshake, error) {
dataBytes, ok := data.([]byte)
if !ok {
return nil, errors.New(invalidPacketDataBytesMsg)
}
handshake := &Handshake{}
buffer := bytes.NewBuffer(dataBytes)
var err error
handshake.ProtocolVersion, err = ReadVarInt(buffer)
if err != nil {
return nil, err
}
handshake.ServerAddress, err = ReadString(buffer)
if err != nil {
return nil, err
}
handshake.ServerPort, err = ReadUnsignedShort(buffer)
if err != nil {
return nil, err
}
nextState, err := ReadVarInt(buffer)
if err != nil {
return nil, err
}
handshake.NextState = State(nextState)
return handshake, nil
}
// DecodeLoginStart takes the Packet.Data bytes and decodes a LoginStart message from it
func DecodeLoginStart(data interface{}) (*LoginStart, error) {
dataBytes, ok := data.([]byte)
if !ok {
return nil, errors.New(invalidPacketDataBytesMsg)
}
loginStart := &LoginStart{}
buffer := bytes.NewBuffer(dataBytes)
var err error
loginStart.Name, err = ReadString(buffer)
if err != nil {
return nil, errors.Wrap(err, "failed to read username")
}
loginStart.PlayerUuid, err = ReadUuid(buffer)
if err != nil {
return nil, errors.Wrap(err, "failed to read player uuid")
}
return loginStart, nil
}