diff --git a/irc/client.go b/irc/client.go index 4721ec50..5dedb650 100644 --- a/irc/client.go +++ b/irc/client.go @@ -1181,7 +1181,8 @@ func (client *Client) destroy(session *Session) { // should we destroy the whole client this time? // BRB is not respected if this is a destroy of the whole client (i.e., session == nil) brbEligible := session != nil && (brbState == BrbEnabled || alwaysOn) - shouldDestroy := !client.destroyed && remainingSessions == 0 && !brbEligible + alreadyDestroyed := client.destroyed + shouldDestroy := !alreadyDestroyed && remainingSessions == 0 && !brbEligible if shouldDestroy { // if it's our job to destroy it, don't let anyone else try client.destroyed = true @@ -1230,7 +1231,7 @@ func (client *Client) destroy(session *Session) { } // decrement stats if we have no more sessions, even if the client will not be destroyed - if shouldDestroy || remainingSessions == 0 { + if shouldDestroy || (!alreadyDestroyed && remainingSessions == 0) { invisible := client.HasMode(modes.Invisible) operator := client.HasMode(modes.LocalOperator) || client.HasMode(modes.Operator) client.server.stats.Remove(registered, invisible, operator) diff --git a/irc/commands.go b/irc/commands.go index cddcb8a4..a899b571 100644 --- a/irc/commands.go +++ b/irc/commands.go @@ -54,22 +54,18 @@ func (cmd *Command) Run(server *Server, client *Client, session *Session, msg ir return cmd.handler(server, client, msg, rb) }() + // after each command, see if we can send registration to the client + if !exiting && !client.registered { + exiting = server.tryRegister(client, session) + } + // most servers do this only for PING/PONG, but we'll do it for any command: if client.registered { // touch even if `exiting`, so we record the time of a QUIT accurately session.idletimer.Touch() } - if exiting { - return - } - - // after each command, see if we can send registration to the client - if !client.registered { - exiting = server.tryRegister(client, session) - } - - if client.registered && !cmd.leaveClientIdle { + if !exiting && client.registered && !cmd.leaveClientIdle { client.Active(session) }