diff --git a/irc/client_lookup_set.go b/irc/client_lookup_set.go index fb0a72b2..f0d435cb 100644 --- a/irc/client_lookup_set.go +++ b/irc/client_lookup_set.go @@ -48,9 +48,8 @@ func (clients *ClientManager) Get(nick string) *Client { return nil } -func (clients *ClientManager) removeInternal(client *Client) (err error) { +func (clients *ClientManager) removeInternal(client *Client, oldcfnick, oldskeleton string) (err error) { // requires holding the writable Lock() - oldcfnick, oldskeleton := client.uniqueIdentifiers() if oldcfnick == "*" || oldcfnick == "" { return errNickMissing } @@ -88,7 +87,8 @@ func (clients *ClientManager) Remove(client *Client) error { clients.Lock() defer clients.Unlock() - return clients.removeInternal(client) + oldcfnick, oldskeleton := client.uniqueIdentifiers() + return clients.removeInternal(client, oldcfnick, oldskeleton) } // Handles a RESUME by attaching a session to a designated client. It is the @@ -240,10 +240,11 @@ func (clients *ClientManager) SetNick(client *Client, session *Session, newNick return "", errNicknameInUse, false } + formercfnick, formerskeleton := client.uniqueIdentifiers() if changeSuccess := client.SetNick(newNick, newCfNick, newSkeleton); !changeSuccess { return "", errClientDestroyed, false } - clients.removeInternal(client) + clients.removeInternal(client, formercfnick, formerskeleton) clients.byNick[newCfNick] = client clients.bySkeleton[newSkeleton] = client return newNick, nil, false diff --git a/irc/nickname.go b/irc/nickname.go index e7e96af5..8f917c17 100644 --- a/irc/nickname.go +++ b/irc/nickname.go @@ -129,7 +129,8 @@ func fixupNickEqualsAccount(client *Client, rb *ResponseBuffer, config *Config) if !client.registered { return true } - if performNickChange(client.server, client, client, rb.session, client.AccountName(), rb) != nil { + err := performNickChange(client.server, client, client, rb.session, client.AccountName(), rb) + if err != nil && err != errNoop { client.server.accounts.Logout(client) nsNotice(rb, client.t("A client is already using that account; try logging out and logging back in with SASL")) return false