better execution of handlers after client disconnect; improve docs
This commit is contained in:
parent
4ea5d7efcb
commit
9602c14886
38
client.go
38
client.go
@ -124,8 +124,11 @@ type Config struct {
|
|||||||
// sent from the server, or other useful debug logs. Defaults to
|
// sent from the server, or other useful debug logs. Defaults to
|
||||||
// ioutil.Discard. For quick debugging, this could be set to os.Stdout.
|
// ioutil.Discard. For quick debugging, this could be set to os.Stdout.
|
||||||
Debug io.Writer
|
Debug io.Writer
|
||||||
// Out is used to print out a prettified version of certain, important
|
// Out is used to write out a prettified version of incoming events. For
|
||||||
// events, ignoring ones that are not important.
|
// example, channel JOIN/PART, PRIVMSG/NOTICE, KICk, etc. Useful to get
|
||||||
|
// a brief output of the activity of the client. If you are looking to
|
||||||
|
// log raw messages, look at a handler and girc.ALLEVENTS and the relevant
|
||||||
|
// Event.Bytes() or Event.String() methods.
|
||||||
Out io.Writer
|
Out io.Writer
|
||||||
// RecoverFunc is called when a handler throws a panic. If RecoverFunc is
|
// RecoverFunc is called when a handler throws a panic. If RecoverFunc is
|
||||||
// set, the panic will be considered recovered, otherwise the client will
|
// set, the panic will be considered recovered, otherwise the client will
|
||||||
@ -135,8 +138,10 @@ type Config struct {
|
|||||||
// Debug is unset.
|
// Debug is unset.
|
||||||
RecoverFunc func(c *Client, e *HandlerError)
|
RecoverFunc func(c *Client, e *HandlerError)
|
||||||
// SupportedCaps are the IRCv3 capabilities you would like the client to
|
// SupportedCaps are the IRCv3 capabilities you would like the client to
|
||||||
// support. Only use this if you have not called DisableTracking(). The
|
// support on top of the ones which the client already supports (see
|
||||||
// keys value gets passed to the server if supported.
|
// cap.go for which ones the client enables by default). Only use this
|
||||||
|
// if you have not called DisableTracking(). The keys value gets passed
|
||||||
|
// to the server if supported.
|
||||||
SupportedCaps map[string][]string
|
SupportedCaps map[string][]string
|
||||||
// Version is the application version information that will be used in
|
// Version is the application version information that will be used in
|
||||||
// response to a CTCP VERSION, if default CTCP replies have not been
|
// response to a CTCP VERSION, if default CTCP replies have not been
|
||||||
@ -151,7 +156,9 @@ type Config struct {
|
|||||||
PingDelay time.Duration
|
PingDelay time.Duration
|
||||||
|
|
||||||
// disableTracking disables all channel and user-level tracking. Useful
|
// disableTracking disables all channel and user-level tracking. Useful
|
||||||
// for highly embedded scripts with single purposes.
|
// for highly embedded scripts with single purposes. This has an exported
|
||||||
|
// method which enables this and ensures prop cleanup, see
|
||||||
|
// Client.DisableTracking().
|
||||||
disableTracking bool
|
disableTracking bool
|
||||||
// HandleNickCollide when set, allows the client to handle nick collisions
|
// HandleNickCollide when set, allows the client to handle nick collisions
|
||||||
// in a custom way. If unset, the client will attempt to append a
|
// in a custom way. If unset, the client will attempt to append a
|
||||||
@ -252,7 +259,8 @@ func (c *Client) String() string {
|
|||||||
|
|
||||||
// Close closes the network connection to the server, and sends a STOPPED
|
// Close closes the network connection to the server, and sends a STOPPED
|
||||||
// event. This should cause Connect() to return with nil. This should be
|
// event. This should cause Connect() to return with nil. This should be
|
||||||
// safe to call multiple times.
|
// safe to call multiple times. See Connect()'s documentation on how
|
||||||
|
// handlers and goroutines are handled when disconnected from the server.
|
||||||
func (c *Client) Close() {
|
func (c *Client) Close() {
|
||||||
c.RunHandlers(&Event{Command: STOPPED, Trailing: c.Server()})
|
c.RunHandlers(&Event{Command: STOPPED, Trailing: c.Server()})
|
||||||
|
|
||||||
@ -279,12 +287,28 @@ func (c *Client) execLoop(done chan struct{}, wg *sync.WaitGroup) {
|
|||||||
c.debug.Print("starting execLoop")
|
c.debug.Print("starting execLoop")
|
||||||
defer c.debug.Print("closing execLoop")
|
defer c.debug.Print("closing execLoop")
|
||||||
|
|
||||||
|
var event *Event
|
||||||
|
|
||||||
for {
|
for {
|
||||||
select {
|
select {
|
||||||
case <-done:
|
case <-done:
|
||||||
|
// We've been told to exit, however we shouldn't bail on the
|
||||||
|
// current events in the queue that should be processed, as one
|
||||||
|
// may want to handle an ERROR, QUIT, etc.
|
||||||
|
|
||||||
|
for {
|
||||||
|
select {
|
||||||
|
case event = <-c.rx:
|
||||||
|
c.RunHandlers(event)
|
||||||
|
default:
|
||||||
|
goto done
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
done:
|
||||||
wg.Done()
|
wg.Done()
|
||||||
return
|
return
|
||||||
case event := <-c.rx:
|
case event = <-c.rx:
|
||||||
c.RunHandlers(event)
|
c.RunHandlers(event)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
8
conn.go
8
conn.go
@ -196,9 +196,11 @@ func (c *ircConn) Close() error {
|
|||||||
|
|
||||||
// Connect attempts to connect to the given IRC server. Returns only when
|
// Connect attempts to connect to the given IRC server. Returns only when
|
||||||
// an error has occurred, or a disconnect was requested with Close(). Connect
|
// an error has occurred, or a disconnect was requested with Close(). Connect
|
||||||
// will only return once all goroutines have been closed to ensure there are
|
// will only return once all client-based goroutines have been closed to
|
||||||
// no long-running routines becoming backed up. This also means that this
|
// ensure there are no long-running routines becoming backed up.
|
||||||
// will wait for all non-background handlers to complete.
|
//
|
||||||
|
// Connect will wait for all non-goroutine handlers to complete on error/quit,
|
||||||
|
// however it will not wait for goroutine handlers.
|
||||||
//
|
//
|
||||||
// If this returns nil, this means that the client requested to be closed
|
// If this returns nil, this means that the client requested to be closed
|
||||||
// (e.g. Client.Close()). Connect will panic if called when the last call has
|
// (e.g. Client.Close()). Connect will panic if called when the last call has
|
||||||
|
Loading…
Reference in New Issue
Block a user