From 1f0bdf19a32129c82938cda645d93165687e09ec Mon Sep 17 00:00:00 2001 From: JunDao Date: Thu, 2 May 2019 00:39:43 +0800 Subject: [PATCH] event system --- bot/client.go | 1 + bot/event.go | 11 ++++++++ bot/ingame.go | 68 ++++++++++++++++++++++++++++++++++-------------- cmd/daze/daze.go | 26 ++++++++++++++++-- 4 files changed, 84 insertions(+), 22 deletions(-) create mode 100644 bot/event.go diff --git a/bot/client.go b/bot/client.go index 5e58254..80a459d 100644 --- a/bot/client.go +++ b/bot/client.go @@ -16,6 +16,7 @@ type Client struct { settings Settings // wd world //the map data + Events eventBroker } //NewClient init and return a new Client diff --git a/bot/event.go b/bot/event.go new file mode 100644 index 0000000..acc19ed --- /dev/null +++ b/bot/event.go @@ -0,0 +1,11 @@ +package bot + +import ( + "github.com/Tnze/go-mc/chat" +) + +type eventBroker struct { + GameStart func() error + ChatMsg func(msg chat.Message) error + Disconnect func(reason chat.Message) error +} diff --git a/bot/ingame.go b/bot/ingame.go index 649c068..d24d7cb 100644 --- a/bot/ingame.go +++ b/bot/ingame.go @@ -6,6 +6,7 @@ import ( // "time" "fmt" + "github.com/Tnze/go-mc/chat" "github.com/Tnze/go-mc/data" pk "github.com/Tnze/go-mc/net/packet" // "github.com/Tnze/gomcbot/world/entity" @@ -31,17 +32,24 @@ func (c *Client) HandleGame() error { return fmt.Errorf("bot: read packet fail: %v", err) } //handle packets - err = c.handlePacket(p) + disconnect, err := c.handlePacket(p) if err != nil { return fmt.Errorf("handle packet 0x%X error: %v", p.ID, err) } + if disconnect { + return nil + } } } -func (c *Client) handlePacket(p pk.Packet) (err error) { +func (c *Client) handlePacket(p pk.Packet) (disconnect bool, err error) { switch p.ID { case data.JoinGame: err = handleJoinGamePacket(c, p) + + if err == nil && c.Events.GameStart != nil { + err = c.Events.GameStart() + } case data.PluginMessageClientbound: err = handlePluginPacket(c, p) case data.ServerDifficulty: @@ -88,15 +96,14 @@ func (c *Client) handlePacket(p pk.Packet) (err error) { case data.UpdateHealth: //// err = handleUpdateHealthPacket(c, p) case data.ChatMessageClientbound: - ////err = handleChatMessagePacket(c, p) + err = handleChatMessagePacket(c, p) case data.BlockChange: ////err = handleBlockChangePacket(c, p) case data.MultiBlockChange: ////err = handleMultiBlockChangePacket(c, p) case 0x1A: - // should assumes that the server has already closed the connection by the time the packet arrives. - - err = fmt.Errorf("disconnect") + err = handleDisconnectPacket(c, p) + disconnect = true case 0x16: // err = handleSetSlotPacket(g, reader) case 0x51: @@ -142,6 +149,25 @@ func (c *Client) handlePacket(p pk.Packet) (err error) { // return nil // } +func handleDisconnectPacket(c *Client, p pk.Packet) error { + var rowReason pk.String + err := p.Scan(&rowReason) + 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 +} + // func handleSetSlotPacket(g *Client, r *bytes.Reader) error { // windowID, err := r.ReadByte() // if err != nil { @@ -233,23 +259,25 @@ func (c *Client) handlePacket(p pk.Packet) (err error) { // return nil // } -// func handleChatMessagePacket(c *Client, p pk.Packet) error { -// var ( -// s pk.String -// pos pk.Byte -// ) +func handleChatMessagePacket(c *Client, p pk.Packet) error { + var ( + s pk.String + pos pk.Byte + ) -// if err := p.Scan(&s, &pos); err != nil { -// return err -// } + if err := p.Scan(&s, &pos); err != nil { + return err + } -// cm, err := newChatMsg([]byte(s)) -// if err != nil { -// return err -// } + var cm chat.Message + err := cm.UnmarshalJSON([]byte(s)) -// return nil -// } + if err == nil && c.Events.ChatMsg != nil { + err = c.Events.ChatMsg(cm) + } + + return err +} // func handleUpdateHealthPacket(c *Client, p pk.Packet) (err error) { // var ( diff --git a/cmd/daze/daze.go b/cmd/daze/daze.go index 7ba17c3..5da6730 100644 --- a/cmd/daze/daze.go +++ b/cmd/daze/daze.go @@ -1,21 +1,43 @@ package main import ( - bot "github.com/Tnze/gomcbot" + "github.com/Tnze/go-mc/bot" + "github.com/Tnze/go-mc/chat" "log" ) func main() { c := bot.NewClient() - + //Login err := c.JoinServer("localhost", 25565) if err != nil { log.Fatal(err) } log.Println("Login success") + //Regist event handlers + c.Events.GameStart = onGameStart + c.Events.ChatMsg = onChatMsg + c.Events.Disconnect = onDisconnect + + //JoinGame err = c.HandleGame() if err != nil { log.Fatal(err) } } + +func onGameStart() error { + log.Println("Game start") + return nil //if err isn't nil, HandleGame() will return it. +} + +func onChatMsg(c chat.Message) error { + log.Println("Chat:", c) + return nil +} + +func onDisconnect(c chat.Message) error { + log.Println("Disconnect:", c) + return nil +}