irc_join(user, mn->channel);
if (mn->modes) {
change.args[0].mode = mn->modes;
- change.args[0].member = mn;
+ change.args[0].u.member = mn;
mod_chanmode_announce(user, mn->channel, &change);
}
}
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;
argc++;
}
if (argc) {
- extern struct userNode *opserv;
struct mod_chanmode *change;
change = mod_chanmode_alloc(argc);
struct modeNode *mn = cNode->members.list[nn];
if ((mn->modes & MODE_CHANOP) && IsService(mn->user) && IsLocal(mn->user)) {
change->args[argc].mode = MODE_CHANOP;
- change->args[argc].member = mn;
+ change->args[argc].u.member = mn;
argc++;
}
}
assert(argc == change->argc);
- if (change->argc > 0)
- mod_chanmode_announce(change->args[0].member->user, cNode, change);
- else
- mod_chanmode_announce(opserv, cNode, change);
+ change->args[0].u.member->modes &= ~MODE_CHANOP;
+ mod_chanmode_announce(change->args[0].u.member->user, cNode, change);
mod_chanmode_free(change);
}
}
{
unsigned int n;
+ verify(channel);
dict_remove(channels, channel->name);
if (channel->members.used || channel->locks) {
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);
- if (!deleting && !channel->members.used && !channel->locks)
+ /* free memory */
+ free(mNode);
+
+ if (!deleting && !channel->members.used && !channel->locks && !(channel->modes & MODE_REGISTERED))
DelChannel(channel);
}
{
unsigned int n;
struct modeNode *mn = NULL;
+
+ verify(channel);
+ verify(channel->members.list);
+ verify(user);
+ verify(user->channels.list);
if (channel->members.used < user->channels.used) {
for (n=0; n<channel->members.used; n++) {
+ verify(channel->members.list[n]);
if (user == channel->members.list[n]->user) {
mn = channel->members.list[n];
break;
}
} else {
for (n=0; n<user->channels.used; n++) {
+ verify(user->channels.list[n]);
if (channel == user->channels.list[n]->channel) {
mn = user->channels.list[n];
break;
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);