diff --git a/bot/ingame.go b/bot/ingame.go index d24d7cb..aae015d 100644 --- a/bot/ingame.go +++ b/bot/ingame.go @@ -150,22 +150,14 @@ func (c *Client) handlePacket(p pk.Packet) (disconnect bool, err error) { // } func handleDisconnectPacket(c *Client, p pk.Packet) error { - var rowReason pk.String - err := p.Scan(&rowReason) + var reason chat.Message + + err := p.Scan(&reason) if err != nil { return err } - if c.Events.Disconnect != nil { - var reason chat.Message - err := reason.UnmarshalJSON([]byte(rowReason)) - if err != nil { - return err - } - - return c.Events.Disconnect(reason) - } - return nil + return c.Events.Disconnect(reason) } // func handleSetSlotPacket(g *Client, r *bytes.Reader) error { @@ -259,21 +251,19 @@ func handleDisconnectPacket(c *Client, p pk.Packet) error { // return nil // } -func handleChatMessagePacket(c *Client, p pk.Packet) error { +func handleChatMessagePacket(c *Client, p pk.Packet) (err error) { var ( - s pk.String + s chat.Message pos pk.Byte ) - if err := p.Scan(&s, &pos); err != nil { + err = p.Scan(&s, &pos) + if err != nil { return err } - var cm chat.Message - err := cm.UnmarshalJSON([]byte(s)) - - if err == nil && c.Events.ChatMsg != nil { - err = c.Events.ChatMsg(cm) + if c.Events.ChatMsg != nil { + err = c.Events.ChatMsg(s) } return err diff --git a/bot/login.go b/bot/login.go index d1dd70e..b2b9ed9 100644 --- a/bot/login.go +++ b/bot/login.go @@ -10,7 +10,6 @@ import ( "crypto/x509" "encoding/json" "fmt" - "io" "io/ioutil" "net/http" "strings" @@ -63,7 +62,7 @@ type encryptionRequest struct { VerifyToken []byte } -func (e *encryptionRequest) Decode(r io.ByteReader) error { +func (e *encryptionRequest) Decode(r pk.ComByteReader) error { var serverID pk.String if err := serverID.Decode(r); err != nil { return err diff --git a/chat/chatMsg.go b/chat/chatMsg.go index 5f2dc53..07c4a0f 100644 --- a/chat/chatMsg.go +++ b/chat/chatMsg.go @@ -3,9 +3,11 @@ package chat import ( "encoding/json" "fmt" + "io" "strings" "github.com/Tnze/go-mc/data" + pk "github.com/Tnze/go-mc/net/packet" ) //Message is a message sent by other @@ -36,6 +38,16 @@ func (m *Message) UnmarshalJSON(jsonMsg []byte) (err error) { return } +//Decode a ChatMsg packet +func (m *Message) Decode(r pk.ComByteReader) error { + var Len pk.VarInt + if err := Len.Decode(r); err != nil { + return err + } + + return json.NewDecoder(io.LimitReader(r, int64(Len))).Decode(m) +} + var colors = map[string]int{ "black": 30, "dark_blue": 34, diff --git a/net/packet/types.go b/net/packet/types.go index e7e9ac1..d6860da 100644 --- a/net/packet/types.go +++ b/net/packet/types.go @@ -15,7 +15,13 @@ type FieldEncoder interface { } type FieldDecoder interface { - Decode(r io.ByteReader) error + Decode(r ComByteReader) error +} + +//ComByteReader is both io.Reader and io.ByteReader +type ComByteReader interface { + io.ByteReader + io.Reader } type ( @@ -63,7 +69,7 @@ type ( ) //ReadNBytes read N bytes from bytes.Reader -func ReadNBytes(r io.ByteReader, n int) (bs []byte, err error) { +func ReadNBytes(r ComByteReader, n int) (bs []byte, err error) { bs = make([]byte, n) for i := 0; i < n; i++ { bs[i], err = r.ReadByte() @@ -83,7 +89,7 @@ func (b Boolean) Encode() []byte { } //Decode a Boolean -func (b *Boolean) Decode(r io.ByteReader) error { +func (b *Boolean) Decode(r ComByteReader) error { v, err := r.ReadByte() if err != nil { return err @@ -102,7 +108,7 @@ func (s String) Encode() (p []byte) { } //Decode a String -func (s *String) Decode(r io.ByteReader) error { +func (s *String) Decode(r ComByteReader) error { var l VarInt //String length if err := l.Decode(r); err != nil { return err @@ -123,7 +129,7 @@ func (b Byte) Encode() []byte { } //Decode a Byte -func (b *Byte) Decode(r io.ByteReader) error { +func (b *Byte) Decode(r ComByteReader) error { v, err := r.ReadByte() if err != nil { return err @@ -138,7 +144,7 @@ func (ub UnsignedByte) Encode() []byte { } //Decode a UnsignedByte -func (ub *UnsignedByte) Decode(r io.ByteReader) error { +func (ub *UnsignedByte) Decode(r ComByteReader) error { v, err := r.ReadByte() if err != nil { return err @@ -157,7 +163,7 @@ func (s Short) Encode() []byte { } //Decode a Short -func (s *Short) Decode(r io.ByteReader) error { +func (s *Short) Decode(r ComByteReader) error { bs, err := ReadNBytes(r, 2) if err != nil { return err @@ -177,7 +183,7 @@ func (us UnsignedShort) Encode() []byte { } //Decode a UnsignedShort -func (us *UnsignedShort) Decode(r io.ByteReader) error { +func (us *UnsignedShort) Decode(r ComByteReader) error { bs, err := ReadNBytes(r, 2) if err != nil { return err @@ -197,7 +203,7 @@ func (i Int) Encode() []byte { } //Decode a Int -func (i *Int) Decode(r io.ByteReader) error { +func (i *Int) Decode(r ComByteReader) error { bs, err := ReadNBytes(r, 4) if err != nil { return err @@ -217,7 +223,7 @@ func (l Long) Encode() []byte { } //Decode a Long -func (l *Long) Decode(r io.ByteReader) error { +func (l *Long) Decode(r ComByteReader) error { bs, err := ReadNBytes(r, 8) if err != nil { return err @@ -246,7 +252,7 @@ func (v VarInt) Encode() (vi []byte) { } //Decode a VarInt -func (v *VarInt) Decode(r io.ByteReader) error { +func (v *VarInt) Decode(r ComByteReader) error { var n uint32 for i := 0; i < 5; i++ { //读数据前的长度标记 sec, err := r.ReadByte() @@ -277,7 +283,7 @@ func (p Position) Encode() []byte { } // Decode a Position -func (p *Position) Decode(r io.ByteReader) error { +func (p *Position) Decode(r ComByteReader) error { var v Long if err := v.Decode(r); err != nil { return err @@ -308,7 +314,7 @@ func (f Float) Encode() []byte { } // Decode a Float -func (f *Float) Decode(r io.ByteReader) error { +func (f *Float) Decode(r ComByteReader) error { var v Int if err := v.Decode(r); err != nil { return err @@ -324,7 +330,7 @@ func (d Double) Encode() []byte { } // Decode a Double -func (d *Double) Decode(r io.ByteReader) error { +func (d *Double) Decode(r ComByteReader) error { var v Long if err := v.Decode(r); err != nil { return err