X-Git-Url: https://jfr.im/git/irc/evilnet/x3.git/blobdiff_plain/d76ed9a966ee3d955c8ef00ecc02e643c2005e2e..b3076f1675cc9f0761035f5a36e22327ca8904d9:/src/hash.c?ds=sidebyside diff --git a/src/hash.c b/src/hash.c index 439b68d..e5ecd47 100644 --- a/src/hash.c +++ b/src/hash.c @@ -148,7 +148,7 @@ ReintroduceUser(struct userNode *user) 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); } } @@ -309,12 +309,18 @@ wipeout_channel(struct chanNode *cNode, time_t new_time, char **modes, unsigned free(cNode->banlist.list[nn]); cNode->banlist.used = 0; + /* remove our old exe,[t list, replace it with the new one */ + for (nn=0; nnexemptlist.used; nn++) + free(cNode->exemptlist.list[nn]); + cNode->exemptlist.used = 0; + /* deop anybody in the channel now, but count services to reop */ for (nn=argc=0; nnmembers.used; nn++) { struct modeNode *mn = cNode->members.list[nn]; if ((mn->modes & MODE_CHANOP) && IsService(mn->user) && IsLocal(mn->user)) argc++; } + if (argc) { struct mod_chanmode *change; @@ -327,19 +333,19 @@ wipeout_channel(struct chanNode *cNode, time_t new_time, char **modes, unsigned 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); - change->args[0].member->modes &= ~MODE_CHANOP; - mod_chanmode_announce(change->args[0].member->user, 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); } } struct chanNode * -AddChannel(const char *name, time_t time_, const char *modes, char *banlist) +AddChannel(const char *name, time_t time_, const char *modes, char *banlist, char *exemptlist) { struct chanNode *cNode; char new_modes[MAXLEN], *argv[MAXNUMPARAMS]; @@ -358,6 +364,7 @@ AddChannel(const char *name, time_t time_, const char *modes, char *banlist) cNode = calloc(1, sizeof(*cNode) + strlen(name)); strcpy(cNode->name, name); banList_init(&cNode->banlist); + exemptList_init(&cNode->exemptlist); modeList_init(&cNode->members); mod_chanmode(NULL, cNode, argv, nn, 0); dict_insert(channels, cNode->name, cNode); @@ -399,6 +406,23 @@ AddChannel(const char *name, time_t time_, const char *modes, char *banlist) } } + /* go through list of exempts and add each one */ + if (exemptlist && (rel_age >= 0)) { + for (nn=0; exemptlist[nn];) { + char *exempt = exemptlist + nn; + struct exemptNode *en; + while (exemptlist[nn] != ' ' && exemptlist[nn]) + nn++; + while (exemptlist[nn] == ' ') + exemptlist[nn++] = 0; + en = calloc(1, sizeof(*en)); + safestrncpy(en->exempt, exempt, sizeof(en->exempt)); + safestrncpy(en->who, "", sizeof(en->who)); + en->set = now; + exemptList_append(&cNode->exemptlist, en); + } + } + return cNode; } @@ -440,11 +464,17 @@ DelChannel(struct chanNode *channel) free(channel->banlist.list[--n]); channel->banlist.used = 0; + /* delete all channel exempts */ + for (n=channel->exemptlist.used; n>0; ) + free(channel->exemptlist.list[--n]); + channel->exemptlist.used = 0; + for (n=0; nmembers); banList_clean(&channel->banlist); + exemptList_clean(&channel->exemptlist); free(channel); } @@ -632,6 +662,16 @@ int ChannelBanExists(struct chanNode *channel, const char *ban) return 0; } +int ChannelExemptExists(struct chanNode *channel, const char *exempt) +{ + unsigned int n; + + for (n = 0; n < channel->exemptlist.used; n++) + if (match_ircglobs(channel->exemptlist.list[n]->exempt, exempt)) + return 1; + return 0; +} + static topic_func_t *tf_list; static unsigned int tf_size = 0, tf_used = 0; @@ -712,6 +752,7 @@ GetUserMode(struct chanNode *channel, struct userNode *user) DEFINE_LIST(userList, struct userNode*) DEFINE_LIST(modeList, struct modeNode*) DEFINE_LIST(banList, struct banNode*) +DEFINE_LIST(exemptList, struct exemptNode*) DEFINE_LIST(channelList, struct chanNode*) DEFINE_LIST(serverList, struct server*)