diff --git a/bot/mcbot.go b/bot/mcbot.go index 16dadc6..4d76c16 100644 --- a/bot/mcbot.go +++ b/bot/mcbot.go @@ -7,6 +7,7 @@ package bot import ( "fmt" "net" + "strconv" mcnet "github.com/Tnze/go-mc/net" pk "github.com/Tnze/go-mc/net/packet" @@ -17,34 +18,34 @@ const ProtocolVersion = 736 // JoinServer connect a Minecraft server for playing the game. func (c *Client) JoinServer(addr string, port int) (err error) { - conn, err := net.Dial("tcp", fmt.Sprintf("%s:%d", addr, port)) - if err != nil { - err = fmt.Errorf("bot: connect server fail: %v", err) - return - } - return c.join(conn) + return c.JoinServerWithDialer(&net.Dialer{}, fmt.Sprintf("%s:%d", addr, port)) } // JoinServerWithDialer is similar to JoinServer but using a Dialer. func (c *Client) JoinServerWithDialer(d Dialer, addr string) (err error) { + return c.join(d, addr) +} + +func (c *Client) join(d Dialer, addr string) (err error) { conn, err := d.Dial("tcp", addr) if err != nil { err = fmt.Errorf("bot: connect server fail: %v", err) - return + return err } - return c.join(conn) -} - -// JoinConn join a Minecraft server through a connection for playing the game. -func (c *Client) join(conn net.Conn) (err error) { //Set Conn c.conn = mcnet.WrapConn(conn) - //Get Addr - strform := c.conn.Socket.RemoteAddr().String() - var addr string - var port int - fmt.Sscanf(strform, "%s:%d", &addr, &port) + //Get Host and Port + host, portStr, err := net.SplitHostPort(addr) + if err != nil { + err = fmt.Errorf("bot: connect server fail: %v", err) + return err + } + port, err := strconv.Atoi(portStr) + if err != nil { + err = fmt.Errorf("bot: connect server fail: %v", err) + return err + } //Handshake err = c.conn.WritePacket( @@ -52,7 +53,7 @@ func (c *Client) join(conn net.Conn) (err error) { pk.Marshal( 0x00, //Handshake packet ID pk.VarInt(ProtocolVersion), //Protocol version - pk.String(addr), //Server's address + pk.String(host), //Server's address pk.UnsignedShort(port), pk.Byte(2), ))