From ce208cb3e1a6153891dd327a6735d64f9950d08a Mon Sep 17 00:00:00 2001 From: Shivaram Lingamneni Date: Tue, 25 Feb 2020 13:26:49 -0500 Subject: [PATCH 1/2] fix #814 --- irc/commands.go | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) 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) } From 1975b0968aca46dc171721fd884781b4c4cfab42 Mon Sep 17 00:00:00 2001 From: Shivaram Lingamneni Date: Tue, 25 Feb 2020 14:04:50 -0500 Subject: [PATCH 2/2] fix double decrement of stats on ping timeout --- irc/client.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) 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)