summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/core/servers.c2
-rw-r--r--src/irc/core/irc-commands.c3
-rw-r--r--src/irc/core/irc-nicklist.c12
-rw-r--r--src/irc/core/irc-servers.h2
4 files changed, 14 insertions, 5 deletions
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) */