diff --git a/client.go b/client.go index 2e5f58c..74b9526 100644 --- a/client.go +++ b/client.go @@ -221,7 +221,7 @@ func (client *Client) Connect(addr string, ssl bool) (err error) { client.quit = false client.mutex.Unlock() - _ = client.EmitSync(context.Background(), NewEvent("client", "connecting")) + client.EmitNonBlocking(NewEvent("client", "connecting")) if ssl { conn, err = tls.Dial("tcp", addr, &tls.Config{ @@ -237,7 +237,7 @@ func (client *Client) Connect(addr string, ssl bool) (err error) { } } - client.Emit(NewEvent("client", "connect")) + client.EmitNonBlocking(NewEvent("client", "connect")) go func() { reader := bufio.NewReader(conn) @@ -246,16 +246,18 @@ func (client *Client) Connect(addr string, ssl bool) (err error) { for { line, err := reader.ReadString('\n') if err != nil { + client.EmitNonBlocking(NewErrorEvent("read", "Read failed: " + err.Error())) break } line = replacer.Replace(line) event, err := ParsePacket(line) if err != nil { + client.EmitNonBlocking(NewErrorEvent("parse", "Read failed: " + err.Error())) continue } - client.Emit(event) + client.EmitNonBlocking(event) } client.mutex.Lock() @@ -263,7 +265,7 @@ func (client *Client) Connect(addr string, ssl bool) (err error) { client.ready = false client.mutex.Unlock() - client.Emit(NewEvent("client", "disconnect")) + client.EmitNonBlocking(NewEvent("client", "disconnect")) }() client.mutex.Lock() @@ -297,7 +299,8 @@ func (client *Client) Connected() bool { } // Send sends a line to the server. A line-feed will be automatically added if one -// is not provided. +// is not provided. If this isn't part of early registration, SendQueued might save +// you from a potential flood kick. func (client *Client) Send(line string) error { client.mutex.RLock() conn := client.conn @@ -311,16 +314,18 @@ func (client *Client) Send(line string) error { line += "\r\n" } + _ = conn.SetWriteDeadline(time.Now().Add(time.Second * 30)) _, err := conn.Write([]byte(line)) if err != nil { - client.EmitNonBlocking(NewErrorEvent("network", err.Error())) + client.EmitNonBlocking(NewErrorEvent("write", err.Error())) _ = client.Disconnect() } return err } -// Sendf is Send with a fmt.Sprintf +// Sendf is Send with a fmt.Sprintf. If this isn't part of early registration, +// SendQueuedf might save you from a potential flood kick. func (client *Client) Sendf(format string, a ...interface{}) error { return client.Send(fmt.Sprintf(format, a...)) }