diff --git a/src/core/servers.c b/src/core/servers.c index e5aac01e..e9e37add 100644 --- a/src/core/servers.c +++ b/src/core/servers.c @@ -490,9 +490,7 @@ void server_connect_unref(SERVER_CONNECT_REC *conn) void server_change_nick(SERVER_REC *server, const char *nick) { - g_free(server->connrec->nick); g_free(server->nick); - server->connrec->nick = g_strdup(nick); server->nick = g_strdup(nick); signal_emit("server nick changed", 1, server); diff --git a/src/irc/core/irc-commands.c b/src/irc/core/irc-commands.c index d18354ee..5ecfb482 100644 --- a/src/irc/core/irc-commands.c +++ b/src/irc/core/irc-commands.c @@ -317,6 +317,9 @@ static void cmd_nick(const char *data, IRC_SERVER_REC *server, WI_ITEM_REC *item if (!cmd_get_params(data, &free_arg, 1, &nick)) return; + g_free(server->last_nick); + server->last_nick = g_strdup(nick); + irc_send_cmdv(server, "NICK %s", nick); cmd_params_free(free_arg); } diff --git a/src/irc/core/irc-nicklist.c b/src/irc/core/irc-nicklist.c index 4b661e88..505eaadb 100644 --- a/src/irc/core/irc-nicklist.c +++ b/src/irc/core/irc-nicklist.c @@ -301,7 +301,7 @@ static void event_target_unavailable(IRC_SERVER_REC *server, const char *data) g_free(params); } -static void event_nick(SERVER_REC *server, const char *data, +static void event_nick(IRC_SERVER_REC *server, const char *data, const char *orignick) { char *params, *nick; @@ -312,10 +312,16 @@ static void event_nick(SERVER_REC *server, const char *data, if (g_strcasecmp(orignick, server->nick) == 0) { /* You changed your nick */ - server_change_nick(server, nick); + if (g_strcasecmp(server->last_nick, nick) == 0) { + /* changed with /NICK - keep it as wanted nick */ + g_free(server->connrec->nick); + server->connrec->nick = g_strdup(nick); + } + + server_change_nick(SERVER(server), nick); } - nicklist_rename(server, orignick, nick); + nicklist_rename(SERVER(server), orignick, nick); g_free(params); } diff --git a/src/irc/core/irc-servers.h b/src/irc/core/irc-servers.h index 0ef53a48..370dd0d1 100644 --- a/src/irc/core/irc-servers.h +++ b/src/irc/core/irc-servers.h @@ -43,6 +43,8 @@ struct _IRC_SERVER_REC { REDIRECT_REC *redirect_next; REDIRECT_REC *redirect_continue; + char *last_nick; /* last /NICK, kept even if it resulted as not valid change */ + char *real_address; /* address the irc server gives */ char *usermode; /* The whole mode string .. */ char *wanted_usermode; /* The usermode we want to use, doesn't include the modes given us by the server (eg. +r) */