From bdde4f62f973bb5f4a5cc4793fb9df8c732a5fe3 Mon Sep 17 00:00:00 2001 From: Juliane Clausen Date: Wed, 27 Aug 2014 15:51:06 +0200 Subject: [PATCH] Set irc.currentnick to irc.nick if irc.currentnick is empty. Handle nicks longer than 8 characters for IRC event 437 too. Fixes issue 43 (IRC client gets stuck on nick collision) --- irc_callback.go | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/irc_callback.go b/irc_callback.go index c782379..ff688c5 100644 --- a/irc_callback.go +++ b/irc_callback.go @@ -160,15 +160,34 @@ func (irc *Connection) setupCallbacks() { irc.AddCallback("CTCP_PING", func(e *Event) { irc.SendRawf("NOTICE %s :\x01%s\x01", e.Nick, e.Message()) }) - irc.AddCallback("437", func(e *Event) { - irc.nickcurrent = irc.nickcurrent + "_" + // 437: ERR_UNAVAILRESOURCE " :Nick/channel is temporarily unavailable" + // Add a _ to current nick. If irc.nickcurrent is empty this cannot + // work. It has to be set somewhere first in case the nick is already + // taken or unavailable from the beginning. + irc.AddCallback("437", func(e *Event) { + // If irc.nickcurrent hasn't been set yet, set to irc.nick + if irc.nickcurrent == "" { + irc.nickcurrent = irc.nick + } + + if len(irc.nickcurrent) > 8 { + irc.nickcurrent = "_" + irc.nickcurrent + } else { + irc.nickcurrent = irc.nickcurrent + "_" + } irc.SendRawf("NICK %s", irc.nickcurrent) }) + // 433: ERR_NICKNAMEINUSE " :Nickname is already in use" + // Add a _ to current nick. irc.AddCallback("433", func(e *Event) { + // If irc.nickcurrent hasn't been set yet, set to irc.nick + if irc.nickcurrent == "" { + irc.nickcurrent = irc.nick + } + if len(irc.nickcurrent) > 8 { irc.nickcurrent = "_" + irc.nickcurrent - } else { irc.nickcurrent = irc.nickcurrent + "_" } @@ -183,12 +202,16 @@ func (irc *Connection) setupCallbacks() { } }) + // NICK Define a nickname. + // Set irc.nickcurrent to the new nick actually used in this connection. irc.AddCallback("NICK", func(e *Event) { if e.Nick == irc.nick { irc.nickcurrent = e.Message() } }) + // 1: RPL_WELCOME "Welcome to the Internet Relay Network !@" + // Set irc.nickcurrent to the actually used nick in this connection. irc.AddCallback("001", func(e *Event) { irc.nickcurrent = e.Arguments[0] })