summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/channels.c33
-rw-r--r--src/chanserv.c29
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)