diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/channels.c | 33 | ||||
-rw-r--r-- | src/chanserv.c | 29 |
2 files changed, 62 insertions, 0 deletions
diff --git a/src/channels.c b/src/channels.c index 9fff738b4..2e83ca083 100644 --- a/src/channels.c +++ b/src/channels.c @@ -33,6 +33,9 @@ static void del_exception(Channel * chan, char *mask); #ifdef HAS_FMODE static char *get_flood(Channel * chan); #endif +#ifdef HAS_JOINFLOOD +static char *get_joinflood(Channel * chan); +#endif static char *get_key(Channel * chan); static char *get_limit(Channel * chan); #ifdef HAS_LMODE @@ -42,6 +45,9 @@ static Channel *join_user_update(User * user, Channel * chan, char *name); #ifdef HAS_FMODE static void set_flood(Channel * chan, char *value); #endif +#ifdef HAS_JOINFLOOD +static void set_joinflood(Channel * chan, char *value); +#endif static void set_key(Channel * chan, char *value); static void set_limit(Channel * chan, char *value); #ifdef HAS_LMODE @@ -167,7 +173,11 @@ CBMode cbmodes[128] = { { 0 }, /* g */ { 0 }, /* h */ { CMODE_i, 0, NULL, NULL }, +#ifdef HAS_JOINFLOOD + { CMODE_j, CBM_MINUS_NO_ARG, set_joinflood, cs_set_joinflood }, +#else { 0 }, /* j */ +#endif { CMODE_k, 0, set_key, cs_set_key }, { CMODE_l, CBM_MINUS_NO_ARG, set_limit, cs_set_limit }, { CMODE_m, 0, NULL, NULL }, @@ -221,6 +231,9 @@ CBModeInfo cbmodeinfos[] = { { 'f', CMODE_f, 0, get_flood, cs_get_flood }, #endif { 'i', CMODE_i, 0, NULL, NULL }, +#ifdef HAS_JOINFLOOD + { 'j', CMODE_j, CBM_MINUS_NO_ARG, get_joinflood, cs_get_joinflood }, +#endif { 'k', CMODE_k, 0, get_key, cs_get_key }, { 'l', CMODE_l, CBM_MINUS_NO_ARG, get_limit, cs_get_limit }, { 'm', CMODE_m, 0, NULL, NULL }, @@ -1491,6 +1504,13 @@ static char *get_flood(Channel * chan) /*************************************************************************/ +static char *get_joinflood(Channel * chan) +{ + return chan->joinflood; +} + +/*************************************************************************/ + static char *get_key(Channel * chan) { return chan->key; @@ -1564,6 +1584,19 @@ static void set_flood(Channel * chan, char *value) /*************************************************************************/ +static void set_joinflood(Channel * chan, char *value) +{ + if (chan->joinflood) + free(chan->joinflood); + chan->joinflood = value ? sstrdup(value) : NULL; + + if (debug) + alog("debug: Joinflood setting of channel %s set to %s", chan->name, + chan->joinflood ? chan->joinflood : "no joinflood settings"); +} + +/*************************************************************************/ + static void set_key(Channel * chan, char *value) { if (chan->key) diff --git a/src/chanserv.c b/src/chanserv.c index 06236c547..dc6015676 100644 --- a/src/chanserv.c +++ b/src/chanserv.c @@ -2403,6 +2403,13 @@ char *cs_get_flood(ChannelInfo * ci) /*************************************************************************/ +char *cs_get_joinflood(ChannelInfo * ci) +{ + return ci->mlock_joinflood; +} + +/*************************************************************************/ + char *cs_get_key(ChannelInfo * ci) { return ci->mlock_key; @@ -2459,6 +2466,28 @@ void cs_set_flood(ChannelInfo * ci, char *value) /*************************************************************************/ +#ifdef HAS_JOINFLOOD +void cs_set_joinflood(ChannelInfo * ci, char *value) +{ + char *end; + + if (ci->mlock_joinflood) + free(ci->mlock_joinflood); + + if ((*value != ':') && (strtoul(value, &end, 10) > 0) && (*end == ':') + && (*(++end) != '\0') && (strtoul(end, &end, 10) > 0) + && (*end == '\0')) { + /* Above if looks ugly, but should work (tm) */ + ci->mlock_joinflood = sstrdup(value); + } else { + ci->mlock_on &= ~CMODE_j; + ci->mlock_joinflood = NULL; + } +} +#endif + +/*************************************************************************/ + void cs_set_key(ChannelInfo * ci, char *value) { if (ci->mlock_key) |