Decode ChatMsg as chat.Message but not pk.String

This commit is contained in:
JunDao
2019-05-02 12:18:00 +08:00
parent 1f0bdf19a3
commit c74cffcc22
4 changed files with 43 additions and 36 deletions

View File

@ -150,22 +150,14 @@ func (c *Client) handlePacket(p pk.Packet) (disconnect bool, err error) {
// } // }
func handleDisconnectPacket(c *Client, p pk.Packet) error { func handleDisconnectPacket(c *Client, p pk.Packet) error {
var rowReason pk.String var reason chat.Message
err := p.Scan(&rowReason)
err := p.Scan(&reason)
if err != nil { if err != nil {
return err return err
} }
if c.Events.Disconnect != nil { return c.Events.Disconnect(reason)
var reason chat.Message
err := reason.UnmarshalJSON([]byte(rowReason))
if err != nil {
return err
}
return c.Events.Disconnect(reason)
}
return nil
} }
// func handleSetSlotPacket(g *Client, r *bytes.Reader) error { // func handleSetSlotPacket(g *Client, r *bytes.Reader) error {
@ -259,21 +251,19 @@ func handleDisconnectPacket(c *Client, p pk.Packet) error {
// return nil // return nil
// } // }
func handleChatMessagePacket(c *Client, p pk.Packet) error { func handleChatMessagePacket(c *Client, p pk.Packet) (err error) {
var ( var (
s pk.String s chat.Message
pos pk.Byte pos pk.Byte
) )
if err := p.Scan(&s, &pos); err != nil { err = p.Scan(&s, &pos)
if err != nil {
return err return err
} }
var cm chat.Message if c.Events.ChatMsg != nil {
err := cm.UnmarshalJSON([]byte(s)) err = c.Events.ChatMsg(s)
if err == nil && c.Events.ChatMsg != nil {
err = c.Events.ChatMsg(cm)
} }
return err return err

View File

@ -10,7 +10,6 @@ import (
"crypto/x509" "crypto/x509"
"encoding/json" "encoding/json"
"fmt" "fmt"
"io"
"io/ioutil" "io/ioutil"
"net/http" "net/http"
"strings" "strings"
@ -63,7 +62,7 @@ type encryptionRequest struct {
VerifyToken []byte VerifyToken []byte
} }
func (e *encryptionRequest) Decode(r io.ByteReader) error { func (e *encryptionRequest) Decode(r pk.ComByteReader) error {
var serverID pk.String var serverID pk.String
if err := serverID.Decode(r); err != nil { if err := serverID.Decode(r); err != nil {
return err return err

View File

@ -3,9 +3,11 @@ package chat
import ( import (
"encoding/json" "encoding/json"
"fmt" "fmt"
"io"
"strings" "strings"
"github.com/Tnze/go-mc/data" "github.com/Tnze/go-mc/data"
pk "github.com/Tnze/go-mc/net/packet"
) )
//Message is a message sent by other //Message is a message sent by other
@ -36,6 +38,16 @@ func (m *Message) UnmarshalJSON(jsonMsg []byte) (err error) {
return 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{ var colors = map[string]int{
"black": 30, "black": 30,
"dark_blue": 34, "dark_blue": 34,

View File

@ -15,7 +15,13 @@ type FieldEncoder interface {
} }
type FieldDecoder 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 ( type (
@ -63,7 +69,7 @@ type (
) )
//ReadNBytes read N bytes from bytes.Reader //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) bs = make([]byte, n)
for i := 0; i < n; i++ { for i := 0; i < n; i++ {
bs[i], err = r.ReadByte() bs[i], err = r.ReadByte()
@ -83,7 +89,7 @@ func (b Boolean) Encode() []byte {
} }
//Decode a Boolean //Decode a Boolean
func (b *Boolean) Decode(r io.ByteReader) error { func (b *Boolean) Decode(r ComByteReader) error {
v, err := r.ReadByte() v, err := r.ReadByte()
if err != nil { if err != nil {
return err return err
@ -102,7 +108,7 @@ func (s String) Encode() (p []byte) {
} }
//Decode a String //Decode a String
func (s *String) Decode(r io.ByteReader) error { func (s *String) Decode(r ComByteReader) error {
var l VarInt //String length var l VarInt //String length
if err := l.Decode(r); err != nil { if err := l.Decode(r); err != nil {
return err return err
@ -123,7 +129,7 @@ func (b Byte) Encode() []byte {
} }
//Decode a Byte //Decode a Byte
func (b *Byte) Decode(r io.ByteReader) error { func (b *Byte) Decode(r ComByteReader) error {
v, err := r.ReadByte() v, err := r.ReadByte()
if err != nil { if err != nil {
return err return err
@ -138,7 +144,7 @@ func (ub UnsignedByte) Encode() []byte {
} }
//Decode a UnsignedByte //Decode a UnsignedByte
func (ub *UnsignedByte) Decode(r io.ByteReader) error { func (ub *UnsignedByte) Decode(r ComByteReader) error {
v, err := r.ReadByte() v, err := r.ReadByte()
if err != nil { if err != nil {
return err return err
@ -157,7 +163,7 @@ func (s Short) Encode() []byte {
} }
//Decode a Short //Decode a Short
func (s *Short) Decode(r io.ByteReader) error { func (s *Short) Decode(r ComByteReader) error {
bs, err := ReadNBytes(r, 2) bs, err := ReadNBytes(r, 2)
if err != nil { if err != nil {
return err return err
@ -177,7 +183,7 @@ func (us UnsignedShort) Encode() []byte {
} }
//Decode a UnsignedShort //Decode a UnsignedShort
func (us *UnsignedShort) Decode(r io.ByteReader) error { func (us *UnsignedShort) Decode(r ComByteReader) error {
bs, err := ReadNBytes(r, 2) bs, err := ReadNBytes(r, 2)
if err != nil { if err != nil {
return err return err
@ -197,7 +203,7 @@ func (i Int) Encode() []byte {
} }
//Decode a Int //Decode a Int
func (i *Int) Decode(r io.ByteReader) error { func (i *Int) Decode(r ComByteReader) error {
bs, err := ReadNBytes(r, 4) bs, err := ReadNBytes(r, 4)
if err != nil { if err != nil {
return err return err
@ -217,7 +223,7 @@ func (l Long) Encode() []byte {
} }
//Decode a Long //Decode a Long
func (l *Long) Decode(r io.ByteReader) error { func (l *Long) Decode(r ComByteReader) error {
bs, err := ReadNBytes(r, 8) bs, err := ReadNBytes(r, 8)
if err != nil { if err != nil {
return err return err
@ -246,7 +252,7 @@ func (v VarInt) Encode() (vi []byte) {
} }
//Decode a VarInt //Decode a VarInt
func (v *VarInt) Decode(r io.ByteReader) error { func (v *VarInt) Decode(r ComByteReader) error {
var n uint32 var n uint32
for i := 0; i < 5; i++ { //读数据前的长度标记 for i := 0; i < 5; i++ { //读数据前的长度标记
sec, err := r.ReadByte() sec, err := r.ReadByte()
@ -277,7 +283,7 @@ func (p Position) Encode() []byte {
} }
// Decode a Position // Decode a Position
func (p *Position) Decode(r io.ByteReader) error { func (p *Position) Decode(r ComByteReader) error {
var v Long var v Long
if err := v.Decode(r); err != nil { if err := v.Decode(r); err != nil {
return err return err
@ -308,7 +314,7 @@ func (f Float) Encode() []byte {
} }
// Decode a Float // Decode a Float
func (f *Float) Decode(r io.ByteReader) error { func (f *Float) Decode(r ComByteReader) error {
var v Int var v Int
if err := v.Decode(r); err != nil { if err := v.Decode(r); err != nil {
return err return err
@ -324,7 +330,7 @@ func (d Double) Encode() []byte {
} }
// Decode a Double // Decode a Double
func (d *Double) Decode(r io.ByteReader) error { func (d *Double) Decode(r ComByteReader) error {
var v Long var v Long
if err := v.Decode(r); err != nil { if err := v.Decode(r); err != nil {
return err return err