fix
[srvx.git] / src / proto-p10.c
index b4a0707d3718d801c2b0d9c62064f5f18a8fdee1..038b636c6f50211f65ea097b2a0edd3817c37a3b 100644 (file)
@@ -1776,6 +1776,10 @@ static CMD_FUNC(cmd_relay)
              sprintf(tmp,"%s LR\n",argv[3]);
              irc_relay(tmp);
             }
+        } else if(strcmp("UC", argv[2]) == 0) {
+            char tmp[MAXLEN];
+            sprintf(tmp,"%s UC %s %s",argv[3],argv[3],argv[4]);
+            irc_relay(tmp);
         } else if(strcmp("JA", argv[2]) == 0) {
             struct userData *uData;
             struct chanNode *cn;
@@ -2623,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;
+                char *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)
@@ -2815,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');
@@ -2884,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)
@@ -2932,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');
@@ -2964,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
@@ -2992,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';