diff --git a/bot/configuration.go b/bot/configuration.go index 3c9bbdb..06de2a4 100644 --- a/bot/configuration.go +++ b/bot/configuration.go @@ -1,18 +1,32 @@ package bot import ( + "github.com/Tnze/go-mc/chat" "github.com/Tnze/go-mc/data/packetid" "github.com/Tnze/go-mc/nbt" "github.com/Tnze/go-mc/net" pk "github.com/Tnze/go-mc/net/packet" ) +type ConfigErr struct { + Stage string + Err error +} + +func (l ConfigErr) Error() string { + return "bot: configuration error: [" + l.Stage + "] " + l.Err.Error() +} + +func (l ConfigErr) Unwrap() error { + return l.Err +} + func (c *Client) joinConfiguration(conn *net.Conn) error { receiving := "config custom payload" for { var p pk.Packet if err := conn.ReadPacket(&p); err != nil { - return LoginErr{receiving, err} + return ConfigErr{receiving, err} } switch packetid.ClientboundPacketID(p.ID) { @@ -21,17 +35,24 @@ func (c *Client) joinConfiguration(conn *net.Conn) error { var data pk.PluginMessageData err := p.Scan(&channel, &data) if err != nil { - return LoginErr{"custom payload", err} + return ConfigErr{"custom payload", err} } // TODO: Provide configuration custom data handling interface case packetid.ClientboundConfigDisconnect: + var reason chat.Message + err := p.Scan(&reason) + if err != nil { + return ConfigErr{"disconnect", err} + } + return ConfigErr{"disconnect", DisconnectErr(reason)} + case packetid.ClientboundConfigFinishConfiguration: err := conn.WritePacket(pk.Marshal( packetid.ServerboundConfigFinishConfiguration, )) if err != nil { - return LoginErr{"finish config", err} + return ConfigErr{"finish config", err} } return nil @@ -39,7 +60,7 @@ func (c *Client) joinConfiguration(conn *net.Conn) error { var keepAliveID pk.Long err := p.Scan(&keepAliveID) if err != nil { - return LoginErr{"keep alive", err} + return ConfigErr{"keep alive", err} } // send it back err = conn.WritePacket(pk.Marshal( @@ -47,7 +68,7 @@ func (c *Client) joinConfiguration(conn *net.Conn) error { keepAliveID, )) if err != nil { - return LoginErr{"keep alive", err} + return ConfigErr{"keep alive", err} } case packetid.ClientboundConfigPing: @@ -55,7 +76,7 @@ func (c *Client) joinConfiguration(conn *net.Conn) error { var registryCodec nbt.RawMessage err := p.Scan(pk.NBT(®istryCodec)) if err != nil { - return LoginErr{"registry data", err} + return ConfigErr{"registry data", err} } // TODO: Handle registries diff --git a/bot/login.go b/bot/login.go index 199d909..52fd992 100644 --- a/bot/login.go +++ b/bot/login.go @@ -24,6 +24,19 @@ import ( pk "github.com/Tnze/go-mc/net/packet" ) +type LoginErr struct { + Stage string + Err error +} + +func (l LoginErr) Error() string { + return "bot: login error: [" + l.Stage + "] " + l.Err.Error() +} + +func (l LoginErr) Unwrap() error { + return l.Err +} + func (c *Client) joinLogin(conn *net.Conn) error { var err error if c.Auth.UUID != "" { diff --git a/bot/mcbot.go b/bot/mcbot.go index 063d4b1..8e45c33 100644 --- a/bot/mcbot.go +++ b/bot/mcbot.go @@ -121,19 +121,6 @@ func (c *Client) join(addr string, options JoinOptions) error { return nil } -type LoginErr struct { - Stage string - Err error -} - -func (l LoginErr) Error() string { - return "bot: " + l.Stage + " error: " + l.Err.Error() -} - -func (l LoginErr) Unwrap() error { - return l.Err -} - type DisconnectErr chat.Message func (d DisconnectErr) Error() string {