summaryrefslogtreecommitdiff
path: root/src/irc
diff options
context:
space:
mode:
authorTimo Sirainen <cras@irssi.org>2002-01-28 05:28:25 +0000
committercras <cras@dbcabf3a-b0e7-0310-adc4-f8d773084564>2002-01-28 05:28:25 +0000
commit08c23ce6d4c21f7cee9be2248d0fec15c153a23a (patch)
treeee41bc4ea0c8fc9d53b0b67dcdd8c40f79b5edc4 /src/irc
parenta6ee439c263f9560c6b7711dd4a4d8e8c24f11aa (diff)
downloadirssi-08c23ce6d4c21f7cee9be2248d0fec15c153a23a.zip
Don't change the "wanted nick" when receiving NICK event from server, unless
we did the /NICK change. This is useful with the new irc servers changing your nick to your UID instead of killing you, at reconnect time you'd get "invalid nick" when irssi would try setting the UID as your nick.. git-svn-id: http://svn.irssi.org/repos/irssi/trunk@2351 dbcabf3a-b0e7-0310-adc4-f8d773084564
Diffstat (limited to 'src/irc')
-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
3 files changed, 14 insertions, 3 deletions
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) */