package proto import ( "bytes" "errors" "io" "github.com/admin-else/strom/data" "github.com/admin-else/strom/event" "github.com/admin-else/strom/proto_base" ) var BadPacketTypeError = errors.New("bad packet type") var BadPacketIdError = errors.New("bad packet id") var PacketNotFullyDecodedError = errors.New("packet not fully decoded") // UnCodablePacket represents a packet that could not be decoded due to proto_generated not supporting all packets. type UnCodablePacket struct { Err error Data []byte Direction proto_base.Direction } func (u *UnCodablePacket) Encode(w io.Writer) (err error) { _, err = w.Write(u.Data) return } func (u *UnCodablePacket) Decode(r io.Reader) (err error) { err = errors.New("how did you even get here") return } type Conn struct { RawConn *event.Loop State proto_base.State Actor proto_base.Actor Version string ProtocolVersion int32 } func (c *Conn) SetVersion(version string) (err error) { c.Version = version versionData, err := data.LookUpProtocolVersionByName(c.Version) if err != nil { return } c.ProtocolVersion = int32(versionData.Version) return } func (c *Conn) Send(packet proto_base.EncodeDecodeAble) (err error) { switch packet := packet.(type) { case *UnCodablePacket: err = c.SendRaw(packet.Data) default: i, ok := LookupPacketInfoByTypeLookupPacketInfoByTypeAndMore(packet, c.State) if !ok { err = BadPacketTypeError } var packetBuff = bytes.NewBuffer(nil) err = proto_base.EncodeVarInt(packetBuff, i.PacketId) if err != nil { return } err = packet.Encode(packetBuff) if err != nil { return } err = c.SendRaw(packetBuff.Bytes()) } return } func (c *Conn) Receive() (packet proto_base.EncodeDecodeAble, err error) { packetBytes, err := c.ReceiveRaw() if err != nil { return } b := bytes.NewBuffer(packetBytes) id, err := proto_base.DecodeVarInt(b) if err != nil { return } packet, ok := LookUpTypeByPacketInfoAndCopyType(c.Actor.ReceiveDirection(), c.State, id, c.ProtocolVersion) if !ok { packet = &UnCodablePacket{Err: BadPacketIdError, Data: packetBytes, Direction: c.Actor.ReceiveDirection()} return } err = packet.Decode(b) if err != nil { packet = &UnCodablePacket{Err: err, Data: packetBytes, Direction: c.Actor.ReceiveDirection()} err = nil } if b.Len() != 0 { err = nil packet = &UnCodablePacket{Err: PacketNotFullyDecodedError, Data: packetBytes, Direction: c.Actor.ReceiveDirection()} return } return } func (c *Conn) OnTick(_ event.Tick) (err error) { packet, err := c.Receive() if err != nil { return } err = c.Loop.Fire(packet) return } func (c *Conn) StartOne(handler any) (err error) { return c.Start(handler) } func (c *Conn) Start(handlers ...any) (err error) { c.Loop = &event.Loop{} c.Handlers = append(c.Handlers, c) c.Handlers = append(c.Handlers, handlers...) err = c.Loop.Start() return }