user->modes |= FLAGS_STAMPED;
}
+void
+assign_fakehost(struct userNode *user, const char *host, int announce)
+{
+ safestrncpy(user->fakehost, host, sizeof(user->fakehost));
+ if (announce)
+ irc_fakehost(user, host);
+}
+
static new_channel_func_t *ncf_list;
static unsigned int ncf_size = 0, ncf_used = 0;
struct modeNode* mNode;
unsigned int n;
- if (reason) {
+ if (reason)
irc_part(user, channel, reason);
- }
mNode = GetUserMode(channel, user);
/* remove modeNode from channel and user */
modeList_remove(&channel->members, mNode);
modeList_remove(&user->channels, mNode);
- free(mNode);
+ /* make callbacks */
for (n=0; n<pf_used; n++)
- pf_list[n](user, channel, reason);
+ pf_list[n](mNode, reason);
+
+ /* free memory */
+ free(mNode);
- if (!deleting && !channel->members.used && !channel->locks)
+ if (!deleting && !channel->members.used && !channel->locks && !(channel->modes & MODE_REGISTERED))
DelChannel(channel);
}
static void
hash_cleanup(void)
{
+ dict_iterator_t it, next;
+
DelServer(self, 0, NULL);
+ for (it = dict_first(channels); it; it = next) {
+ next = iter_next(it);
+ DelChannel(iter_data(it));
+ }
dict_delete(channels);
dict_delete(clients);
dict_delete(servers);