diff --git a/src/core/nicklist.c b/src/core/nicklist.c index d5841b45..fe2a2842 100644 --- a/src/core/nicklist.c +++ b/src/core/nicklist.c @@ -57,6 +57,19 @@ NICK_REC *nicklist_insert(CHANNEL_REC *channel, const char *nick, return rec; } +/* Set host address for nick */ +void nicklist_set_host(CHANNEL_REC *channel, NICK_REC *nick, const char *host) +{ + g_return_if_fail(channel != NULL); + g_return_if_fail(nick != NULL); + g_return_if_fail(host != NULL); + + g_free_not_null(nick->host); + nick->host = g_strdup(host); + + signal_emit("nicklist host changed", 2, channel, nick); +} + static void nicklist_destroy(CHANNEL_REC *channel, NICK_REC *nick) { signal_emit("nicklist remove", 2, channel, nick); @@ -257,12 +270,12 @@ void nicklist_update_flags(SERVER_REC *server, const char *nick, if (gone != -1 && (int)rec->gone != gone) { rec->gone = gone; - signal_emit("nick gone changed", 2, channel, rec); + signal_emit("nicklist gone changed", 2, channel, rec); } if (serverop != -1 && (int)rec->serverop != serverop) { rec->serverop = serverop; - signal_emit("nick serverop changed", 2, channel, rec); + signal_emit("nicklist serverop changed", 2, channel, rec); } } g_slist_free(nicks); diff --git a/src/core/nicklist.h b/src/core/nicklist.h index e1deb154..0fde8bc6 100644 --- a/src/core/nicklist.h +++ b/src/core/nicklist.h @@ -15,6 +15,8 @@ struct _NICK_REC { /* Add new nick to list */ NICK_REC *nicklist_insert(CHANNEL_REC *channel, const char *nick, int op, int voice, int send_massjoin); +/* Set host address for nick */ +void nicklist_set_host(CHANNEL_REC *channel, NICK_REC *nick, const char *host); /* Remove nick from list */ void nicklist_remove(CHANNEL_REC *channel, NICK_REC *nick); /* Change nick */ diff --git a/src/irc/core/irc-nicklist.c b/src/irc/core/irc-nicklist.c index 245d1fdd..807934d2 100644 --- a/src/irc/core/irc-nicklist.c +++ b/src/irc/core/irc-nicklist.c @@ -134,8 +134,11 @@ static void event_who(SERVER_REC *server, const char *data) nickrec = chanrec == NULL ? NULL : nicklist_find(chanrec, nick); if (nickrec != NULL) { - if (nickrec->host == NULL) - nickrec->host = g_strdup_printf("%s@%s", user, host); + if (nickrec->host == NULL) { + char *str = g_strdup_printf("%s@%s", user, host); + nicklist_set_host(chanrec, nickrec, str); + g_free(str); + } if (nickrec->realname == NULL) nickrec->realname = g_strdup(realname); sscanf(hops, "%d", &nickrec->hops); diff --git a/src/irc/core/massjoin.c b/src/irc/core/massjoin.c index 701d2a33..1c7d55fb 100644 --- a/src/irc/core/massjoin.c +++ b/src/irc/core/massjoin.c @@ -59,7 +59,7 @@ static void event_join(IRC_SERVER_REC *server, const char *data, /* add user to nicklist */ nickrec = nicklist_insert(CHANNEL(chanrec), nick, FALSE, FALSE, TRUE); - nickrec->host = g_strdup(address); + nicklist_set_host(CHANNEL(chanrec), nickrec, address); if (chanrec->massjoins == 0) { /* no nicks waiting in massjoin queue */