X-Git-Url: http://git.pk910.de/?a=blobdiff_plain;f=src%2Fproto-p10.c;h=f89586b9d24103572196aad73c6b847baf9a108a;hb=23609de645133c4a2fa6b913ef677300fe9357b8;hp=e04d65650ceb16da3ad4c4c5db5bf1db4833ac27;hpb=71d1f0aef5ee94e3c3b0a58aca5e469218717bbd;p=srvx.git diff --git a/src/proto-p10.c b/src/proto-p10.c index e04d656..f89586b 100644 --- a/src/proto-p10.c +++ b/src/proto-p10.c @@ -2627,6 +2627,38 @@ mod_chanmode_parse(struct chanNode *channel, char **modes, unsigned int argc, un } } break; + case 'f': + if (add) { + if (in_arg >= argc) + goto error; + mode = modes[in_arg++]; + if(mode[0] == '!' && !(flags & MCP_OPERMODE)) { //noflood flag also for overriders + //only allow opers + goto error; + } + if(mode[0] == '+' || mode[0] == '@') { + mode++; + } + char *p; + int count = 0, time = 0; + for(p = mode; p[0]; p++) { + if(p[0] == ':') { + char tmpchar = p[0]; + p[0] = '\0'; + count = strtoul(mode,0,10); + p[0] = tmpchar; + p++; + time = strtoul(p,0,10); + break; + } + } + if(count <= 0 || time <= 0 || count > 100 || time > 600) + goto error; + change->modes_set |= MODE_NOFLOOD; + safestrncpy(change->new_noflood, modes[in_arg - 1], sizeof(change->new_noflood)); + } else { + change->modes_clear |= MODE_NOFLOOD; + } case 'F': if (add) { if (in_arg >= argc) @@ -2819,6 +2851,7 @@ mod_chanmode_announce(struct userNode *who, struct chanNode *channel, struct mod DO_MODE_CHAR(LIMIT, 'l'); DO_MODE_CHAR(ACCESS, 'a'); DO_MODE_CHAR(ALTCHAN, 'F'); + DO_MODE_CHAR(NOFLOOD, 'f'); DO_MODE_CHAR(DELAYJOINS, 'D'); DO_MODE_CHAR(REGONLY, 'r'); DO_MODE_CHAR(NOCOLORS, 'c'); @@ -2888,6 +2921,8 @@ mod_chanmode_announce(struct userNode *who, struct chanNode *channel, struct mod } if (change->modes_set & MODE_ALTCHAN) mod_chanmode_append(&chbuf, 'F', change->new_altchan); + if (change->modes_set & MODE_NOFLOOD) + mod_chanmode_append(&chbuf, 'f', change->new_noflood); } for (arg = 0; arg < change->argc; ++arg) { if (change->args[arg].mode & MODE_REMOVE) @@ -2936,6 +2971,7 @@ mod_chanmode_format(struct mod_chanmode *change, char *outbuff) DO_MODE_CHAR(LIMIT, 'l'); DO_MODE_CHAR(ACCESS, 'a'); DO_MODE_CHAR(ALTCHAN, 'F'); + DO_MODE_CHAR(NOFLOOD, 'f'); DO_MODE_CHAR(KEY, 'k'); DO_MODE_CHAR(UPASS, 'U'); DO_MODE_CHAR(APASS, 'A'); @@ -2968,6 +3004,7 @@ mod_chanmode_format(struct mod_chanmode *change, char *outbuff) DO_MODE_CHAR(KEY, 'k'), args_used += sprintf(args + args_used, " %s", change->new_key); DO_MODE_CHAR(KEY, 'a'), args_used += sprintf(args + args_used, " %d", change->new_access); DO_MODE_CHAR(KEY, 'F'), args_used += sprintf(args + args_used, " %s", change->new_altchan); + DO_MODE_CHAR(KEY, 'f'), args_used += sprintf(args + args_used, " %s", change->new_noflood); DO_MODE_CHAR(UPASS, 'U'), args_used += sprintf(args + args_used, " %s", change->new_upass); DO_MODE_CHAR(APASS, 'A'), args_used += sprintf(args + args_used, " %s", change->new_apass); #undef DO_MODE_CHAR @@ -2996,6 +3033,10 @@ clear_chanmode(struct chanNode *channel, const char *modes) cleared |= MODE_ALTCHAN; channel->altchan[0] = '\0'; break; + case 'f': + cleared |= MODE_NOFLOOD; + channel->noflood[0] = '\0'; + break; case 'k': cleared |= MODE_KEY; channel->key[0] = '\0';