static void event_end_of_names(IRC_SERVER_REC *server, const char *data) { char *params, *channel; IRC_CHANNEL_REC *chanrec; NICK_REC *ownnick; int nicks; g_return_if_fail(server != NULL); params = event_get_params(data, 2, NULL, &channel); chanrec = irc_channel_find(server, channel); if (chanrec != NULL && !chanrec->names_got) { ownnick = nicklist_find(CHANNEL(chanrec), server->nick); if (ownnick == NULL) { /* stupid server - assume we have ops if channel is empty */ nicks = g_hash_table_size(chanrec->nicks); ownnick = irc_nicklist_insert(chanrec, server->nick, nicks == 0, FALSE, FALSE, FALSE, NULL); } nicklist_set_own(CHANNEL(chanrec), ownnick); chanrec->chanop = chanrec->ownnick->op; chanrec->names_got = TRUE; signal_emit("channel joined", 1, chanrec); } g_free(params); }
static void nick_hash_add(CHANNEL_REC *channel, NICK_REC *nick) { NICK_REC *list; nick->next = NULL; list = g_hash_table_lookup(channel->nicks, nick->nick); if (list == NULL) g_hash_table_insert(channel->nicks, nick->nick, nick); else { /* multiple nicks with same name */ while (list->next != NULL) list = list->next; list->next = nick; } /* move our own nick to beginning of the nick list.. */ if (nick == channel->ownnick) nicklist_set_own(channel, nick); }
void xmpp_nicklist_rename(MUC_REC *channel, XMPP_NICK_REC *nick, const char *oldnick, const char *newnick) { g_return_if_fail(IS_MUC(channel)); g_return_if_fail(IS_XMPP_NICK(nick)); g_return_if_fail(oldnick != NULL); g_return_if_fail(newnick != NULL); /* remove old nick from hash table */ nick_hash_remove(CHANNEL(channel), NICK(nick)); g_free(nick->nick); nick->nick = g_strdup(newnick); /* add new nick to hash table */ nick_hash_add(CHANNEL(channel), NICK(nick)); signal_emit("nicklist changed", 3, channel, nick, oldnick); if (strcmp(oldnick, channel->nick) == 0) { nicklist_set_own(CHANNEL(channel), NICK(nick)); g_free(channel->nick); channel->nick = g_strdup(newnick); } }