completely changed the NeonSpam settings / scanner management
[NeonServV5.git] / src / cmd_neonspam_set.c
index 41e78253c473421a2a52a2703fa9c5b8fa56ab99..9890a6272493150a56f4082fcf59fbc9391a1e3f 100644 (file)
 
 #include "cmd_neonspam.h"
 
-typedef char* neonspam_cmd_set_function(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *cvalue, char *argument);
-static void neonspam_cmd_set_setting(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, int setting, char *argument);
-static char* neonspam_cmd_set_trigger(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *cvalue, char *argument);
-static char* neonspam_cmd_set_spamlimit(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *cvalue, char *argument);
-static char* neonspam_cmd_set_spamreaction(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *cvalue, char *argument);
-static char* neonspam_cmd_set_floodreaction(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *cvalue, char *argument);
-static char* neonspam_cmd_setjoinfloodreaction(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *cvalue, char *argument);
-static char* neonspam_cmd_setspamscan(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *cvalue, char *argument);
-static char* neonspam_cmd_setfloodscan(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *cvalue, char *argument);
-static char* neonspam_cmd_setjoinfloodscan(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *cvalue, char *argument);
-static char* neonspam_cmd_setbotnetscan(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *cvalue, char *argument);
-static char* neonspam_cmd_setscanchanops(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *cvalue, char *argument);
-static char* neonspam_cmd_setscanvoiced(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *cvalue, char *argument);
-static char* neonspam_cmd_setexceptlevel(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *cvalue, char *argument);
-static char* neonspam_cmd_setfloodsensibility(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *cvalue, char *argument);
-static char* neonspam_cmd_setjoinsensibility(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *cvalue, char *argument);
-
-#define NS_VALID_FUNCTION 0x01
-#define NS_VALID_STRING   0x02
-#define NS_VALID_ACCESS   0x04
-#define NS_VALID_NO501    0x08
-#define NS_VALID_OPTIONS  0x10
-#define NS_VALID_NUMERIC  0x20
-#define NS_VALID_BOOLEAN  0x40
-
-#define NS_HAS_OPT  0x100 /* options (SET_OPTION_{NAME}_{VALUE}) */
-#define NS_HAS_HELP 0x200 /* help    (SET_HELP_{NAME}) - only shown if help is requested */
+typedef char* neonspam_cmd_set_function(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, int intparam, char *charparam, char *argument, char *retBuf);
+static char* neonspam_cmd_set_trigger(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, int intparam, char *charparam, char *argument, char *retBuf);
+static char* neonspam_cmd_setflags(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, int intparam, char *charparam, char *argument, char *retBuf);
+static char* neonspam_cmd_setexcept(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, int intparam, char *charparam, char *argument, char *retBuf);
+static char* neonspam_cmd_set_reaction(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, int intparam, char *charparam, char *argument, char *retBuf);
+static char* neonspam_cmd_set_reaction_time(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, int intparam, char *charparam, char *argument, char *retBuf);
+static char* neonspam_cmd_setpercent(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, int intparam, char *charparam, char *argument, char *retBuf);
+static char* neonspam_cmd_setsensibility(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, int intparam, char *charparam, char *argument, char *retBuf);
+static char* neonspam_cmd_set_spamlimit(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, int intparam, char *charparam, char *argument, char *retBuf);
 
 static MYSQL_ROW neonspam_settings_row, neonspam_settings_defaults;
-#define SPAMSERV_SETTINGS_QUERY "`channel_scanstate`, `channel_scanexcept`, `channel_maxrepeat`, `channel_repeatreaction`, `channel_maxflood`, `channel_floodtime`, `channel_floodreaction`, `channel_maxjoin`, `channel_jointime`, `channel_joinreaction`"
-#define SPAMSERV_SETTINGS_RESET "`channel_scanstate` = NULL, `channel_scanexcept` = NULL, `channel_maxrepeat` = NULL, `channel_repeatreaction` = NULL, `channel_maxflood` = NULL, `channel_floodtime` = NULL, `channel_floodreaction` = NULL, `channel_maxjoin` = NULL, `channel_jointime` = NULL, `channel_joinreaction` = NULL"
+#define SPAMSERV_SETTINGS_QUERY "`channel_spam_reaction`, `channel_spam_reaction_duration`, `channel_flood_reaction`, `channel_flood_reaction_duration`, `channel_join_reaction`, `channel_join_reaction_duration`, `channel_botnet_bantime`, `channel_caps_reaction`, `channel_caps_reaction_duration`, `channel_digit_reaction`, `channel_digit_reaction_duration`"
+#define SPAMSERV_SETTINGS_RESET "\
+`channel_scanner` = NULL, \
+`channel_spam_limit` = NULL, \
+`channel_spam_reaction` = NULL, \
+`channel_spam_reaction_duration` = NULL, \
+`channel_spam_except` = NULL, \
+`channel_flood_limit` = NULL, \
+`channel_flood_time` = NULL, \
+`channel_flood_reaction` = NULL, \
+`channel_flood_reaction_duration` = NULL, \
+`channel_flood_except` = NULL, \
+`channel_join_limit` = NULL, \
+`channel_join_time` = NULL, \
+`channel_join_reaction` = NULL, \
+`channel_join_reaction_duration` = NULL, \
+`channel_join_except` = NULL, \
+`channel_botnet_bantime` = NULL, \
+`channel_botnet_except` = NULL, \
+`channel_caps_percent` = NULL, \
+`channel_caps_reaction` = NULL, \
+`channel_caps_reaction_duration` = NULL, \
+`channel_caps_except` = NULL,\
+`channel_digit_percent` = NULL, \
+`channel_digit_reaction` = NULL, \
+`channel_digit_reaction_duration` = NULL, \
+`channel_digit_except` = NULL "
 
 static const struct {
+    unsigned int if_flag;
+    unsigned int indent;
     const char *setting;
-    const char *chanfield;
-    unsigned int valid;
-    void *parameter;
     void *function;
+    int intparam;
+    char *charparam;
 } neonspam_settings[] = {
-    {"Trigger",           NULL,  NS_VALID_FUNCTION,                                 NULL, neonspam_cmd_set_trigger},
-    {"SpamLimit",         NULL,  NS_VALID_OPTIONS | NS_VALID_FUNCTION | NS_HAS_OPT, "5",  neonspam_cmd_set_spamlimit},
-    {"SpamReaction",      NULL,  NS_VALID_OPTIONS | NS_VALID_FUNCTION | NS_HAS_OPT, "3",  neonspam_cmd_set_spamreaction},
-    {"FloodReaction",     NULL,  NS_VALID_OPTIONS | NS_VALID_FUNCTION | NS_HAS_OPT, "3",  neonspam_cmd_set_floodreaction},
-    {"JoinFloodReaction", NULL,  NS_VALID_OPTIONS | NS_VALID_FUNCTION | NS_HAS_OPT, "3",  neonspam_cmd_setjoinfloodreaction},
-    {"SpamScan",          NULL,  NS_VALID_BOOLEAN | NS_VALID_FUNCTION,              NULL, neonspam_cmd_setspamscan},
-    {"FloodScan",         NULL,  NS_VALID_BOOLEAN | NS_VALID_FUNCTION,              NULL, neonspam_cmd_setfloodscan},
-    {"JoinFloodScan",     NULL,  NS_VALID_BOOLEAN | NS_VALID_FUNCTION,              NULL, neonspam_cmd_setjoinfloodscan},
-    {"BotNetScan",        NULL,  NS_VALID_BOOLEAN | NS_VALID_FUNCTION,              NULL, neonspam_cmd_setbotnetscan},
-    {"ScanChanOps",       NULL,  NS_VALID_BOOLEAN | NS_VALID_FUNCTION,              NULL, neonspam_cmd_setscanchanops},
-    {"ScanVoiced",        NULL,  NS_VALID_BOOLEAN | NS_VALID_FUNCTION,              NULL, neonspam_cmd_setscanvoiced},
-    {"ExceptLevel",       NULL,  NS_VALID_ACCESS | NS_VALID_FUNCTION,               NULL, neonspam_cmd_setexceptlevel},
-    {"FloodSensibility",  NULL,  NS_VALID_FUNCTION,                                 NULL, neonspam_cmd_setfloodsensibility},
-    {"JoinSensibility",   NULL,  NS_VALID_FUNCTION,                                 NULL, neonspam_cmd_setjoinsensibility},
-    {NULL, NULL, 0, NULL}
+    {0,                                                0,  "Trigger",           neonspam_cmd_set_trigger,         0,                              NULL},
+    
+    {0,                                                0,  "SpamScan",          neonspam_cmd_setflags,            SPAMSETTINGS_SPAMSCAN,          NULL},
+    {SPAMSETTINGS_SPAMSCAN,                            2,  "SpamLimit",         neonspam_cmd_set_spamlimit,       0,                              NULL},
+    {SPAMSETTINGS_SPAMSCAN | SPAMSETTINGS_SETTIMEBAN,  2,  "SpamReaction",      neonspam_cmd_set_reaction,        0,                              "channel_spam_reaction"},
+    {SPAMSETTINGS_SPAMSCAN | SPAMSETTINGS_ISTIMEBAN,   4,  "SpamBanDuration",   neonspam_cmd_set_reaction_time,   1,                              "channel_spam_reaction_duration"},
+    {SPAMSETTINGS_SPAMSCAN,                            2,  "SpamScanChanOps",   neonspam_cmd_setflags,            SPAMSETTINGS_SPAMSCAN_OPS,      NULL},
+    {SPAMSETTINGS_SPAMSCAN,                            2,  "SpamScanVoiced",    neonspam_cmd_setflags,            SPAMSETTINGS_SPAMSCAN_VOICE,    NULL},
+    {SPAMSETTINGS_SPAMSCAN,                            2,  "SpamScanExcept",    neonspam_cmd_setexcept,           SPAMSETTINGS_SPAMEXCINDEX,      "channel_spam_except"},
+    
+    {0,                                                0,  "FloodScan",         neonspam_cmd_setflags,            SPAMSETTINGS_FLOODSCAN,         NULL},
+    {SPAMSETTINGS_FLOODSCAN,                           2,  "FloodSensibility",  neonspam_cmd_setsensibility,      SPAMSETTINGS_FLOODSENINDEX,     "channel_flood_"},
+    {SPAMSETTINGS_FLOODSCAN | SPAMSETTINGS_SETTIMEBAN, 2,  "FloodReaction",     neonspam_cmd_set_reaction,        2,                              "channel_flood_reaction"},
+    {SPAMSETTINGS_FLOODSCAN | SPAMSETTINGS_ISTIMEBAN,  4,  "FloodBanDuration",  neonspam_cmd_set_reaction_time,   3,                              "channel_flood_reaction_duration"},
+    {SPAMSETTINGS_FLOODSCAN,                           2,  "FloodScanChanOps",  neonspam_cmd_setflags,            SPAMSETTINGS_FLOODSCAN_OPS,     NULL},
+    {SPAMSETTINGS_FLOODSCAN,                           2,  "FloodScanVoiced",   neonspam_cmd_setflags,            SPAMSETTINGS_FLOODSCAN_VOICE,   NULL},
+    {SPAMSETTINGS_FLOODSCAN,                           2,  "FloodScanExcept",   neonspam_cmd_setexcept,           SPAMSETTINGS_FLOODEXCINDEX,     "channel_flood_except"},
+    
+    {0,                                                0,  "JoinScan",          neonspam_cmd_setflags,            SPAMSETTINGS_JOINSCAN,          NULL},
+    {SPAMSETTINGS_JOINSCAN,                            2,  "JoinSensibility",   neonspam_cmd_setsensibility,      SPAMSETTINGS_JOINSENINDEX,      "channel_join_"},
+    {SPAMSETTINGS_JOINSCAN | SPAMSETTINGS_SETTIMEBAN,  2,  "JoinReaction",      neonspam_cmd_set_reaction,        4,                              "channel_join_reaction"},
+    {SPAMSETTINGS_JOINSCAN | SPAMSETTINGS_ISTIMEBAN,   4,  "JoinBanDuration",   neonspam_cmd_set_reaction_time,   5,                              "channel_join_reaction_duration"},
+    {SPAMSETTINGS_JOINSCAN,                            2,  "JoinScanChanOps",   neonspam_cmd_setflags,            SPAMSETTINGS_JOINSCAN_OPS,      NULL},
+    {SPAMSETTINGS_JOINSCAN,                            2,  "JoinScanVoiced",    neonspam_cmd_setflags,            SPAMSETTINGS_JOINSCAN_VOICE,    NULL},
+    {SPAMSETTINGS_JOINSCAN,                            2,  "JoinScanExcept",    neonspam_cmd_setexcept,           SPAMSETTINGS_JOINEXCINDEX,      "channel_join_except"},
+    
+    {0,                                                0,  "BotNetScan",        neonspam_cmd_setflags,            SPAMSETTINGS_BOTNETSCAN,        NULL},
+    {SPAMSETTINGS_BOTNETSCAN,                          4,  "BotNetBanDuration", neonspam_cmd_set_reaction_time,   6,                              "channel_botnet_bantime"},
+    {SPAMSETTINGS_BOTNETSCAN,                          2,  "BotNetScanChanOps", neonspam_cmd_setflags,            SPAMSETTINGS_BOTNETSCAN_OPS,    NULL},
+    {SPAMSETTINGS_BOTNETSCAN,                          2,  "BotNetScanVoiced",  neonspam_cmd_setflags,            SPAMSETTINGS_BOTNETSCAN_VOICE,  NULL},
+    //{SPAMSETTINGS_BOTNETSCAN,                          2,  "BotNetScanExcept",  neonspam_cmd_setexcept,           SPAMSETTINGS_BOTNETEXCINDEX,    "channel_botnet_except"},
+    
+    {0,                                                0,  "CapsScan",          neonspam_cmd_setflags,            SPAMSETTINGS_CAPSSCAN,          NULL},
+    {SPAMSETTINGS_CAPSSCAN,                            2,  "CapsPercent",       neonspam_cmd_setpercent,          SPAMSETTINGS_CAPSPERCENTINDEX,  "channel_caps_percent"},
+    {SPAMSETTINGS_CAPSSCAN | SPAMSETTINGS_SETTIMEBAN,  2,  "CapsReaction",      neonspam_cmd_set_reaction,        7,                              "channel_caps_reaction"},
+    {SPAMSETTINGS_CAPSSCAN | SPAMSETTINGS_ISTIMEBAN,   4,  "CapsBanDuration",   neonspam_cmd_set_reaction_time,   8,                              "channel_caps_reaction_duration"},
+    {SPAMSETTINGS_CAPSSCAN,                            2,  "CapsScanChanOps",   neonspam_cmd_setflags,            SPAMSETTINGS_CAPSSCAN_OPS,      NULL},
+    {SPAMSETTINGS_CAPSSCAN,                            2,  "CapsScanVoiced",    neonspam_cmd_setflags,            SPAMSETTINGS_CAPSSCAN_VOICE,    NULL},
+    {SPAMSETTINGS_CAPSSCAN,                            2,  "CapsScanExcept",    neonspam_cmd_setexcept,           SPAMSETTINGS_CAPSEXCINDEX,      "channel_caps_except"},
+    
+    {0,                                                0,  "DigitScan",         neonspam_cmd_setflags,            SPAMSETTINGS_DIGITSCAN,         NULL},
+    {SPAMSETTINGS_DIGITSCAN,                           2,  "DigitPercent",      neonspam_cmd_setpercent,          SPAMSETTINGS_DIGITPERCENTINDEX, "channel_digit_percent"},
+    {SPAMSETTINGS_DIGITSCAN | SPAMSETTINGS_SETTIMEBAN, 2,  "DigitReaction",     neonspam_cmd_set_reaction,        9,                              "channel_digit_reaction"},
+    {SPAMSETTINGS_DIGITSCAN | SPAMSETTINGS_ISTIMEBAN,  4,  "DigitBanDuration",  neonspam_cmd_set_reaction_time,   10,                             "channel_digit_reaction_duration"},
+    {SPAMSETTINGS_DIGITSCAN,                           2,  "DigitScanChanOps",  neonspam_cmd_setflags,            SPAMSETTINGS_DIGITSCAN_OPS,     NULL},
+    {SPAMSETTINGS_DIGITSCAN,                           2,  "DigitScanVoiced",   neonspam_cmd_setflags,            SPAMSETTINGS_DIGITSCAN_VOICE,   NULL},
+    {SPAMSETTINGS_DIGITSCAN,                           2,  "DigitScanExcept",   neonspam_cmd_setexcept,           SPAMSETTINGS_DIGITEXCINDEX,     "channel_digit_except"},
+    
+    {0, 0, NULL, NULL, 0, NULL}
 };
 
 #define MAX_QUERY_LEN 1024
@@ -107,10 +149,19 @@ CMD_BIND(neonspam_cmd_set) {
         i = 0;
         j = 0;
         char *args = (argc > 1 ? merge_argv(argv, 1, argc) : NULL);
+        neonspam_settings_row = NULL;
+        neonspam_settings_defaults = NULL;
         while(neonspam_settings[i].setting) {
             if(!stricmp(neonspam_settings[i].setting, argv[0])) {
                 //setting found
-                neonspam_cmd_set_setting(client, user, chan, event, i, args);
+                char valueBuf[MAXLEN];
+                char *value;
+                neonspam_cmd_set_function *func = neonspam_settings[i].function;
+                value = func(client, user, chan, event, neonspam_settings[i].intparam, neonspam_settings[i].charparam, args, valueBuf);
+                if(value) {
+                    reply(getTextBot(), user, "\002%s\002 %s", neonspam_settings[i].setting, value);
+                    //TODO: reply valid options
+                }
                 j = 1;
                 break;
             }
@@ -121,12 +172,12 @@ CMD_BIND(neonspam_cmd_set) {
             reply(getTextBot(), user, "NS_SET_UNKNOWN_SETTING", argv[0]);
         }
     } else {
-        char *value, *org_value, *tmp, nameBuf[64];
+        char valueBuf[MAXLEN], nameBuf[MAXLEN];
+        char *value;
+        int namePos, boolflag = 0;
         MYSQL_RES *res, *defaults_res;
         struct Table *table;
         char *content[2];
-        char query[MAXLEN];
-        int querypos;
         i = 0;
         while(neonspam_settings[i].setting)
             i++;
@@ -138,43 +189,26 @@ CMD_BIND(neonspam_cmd_set) {
         printf_mysql_query("SELECT " SPAMSERV_SETTINGS_QUERY " FROM `channels` WHERE `channel_id` = '%d'", chan->channel_id);
         res = mysql_use();
         neonspam_settings_row = mysql_fetch_row(res);
-        i = 0;
-        j = 0;
+        i = -1;
         reply(getTextBot(), user, "NS_SET_HEADER", chan->name);
-        while(neonspam_settings[i].setting) {
-            char valueBuf[MAXLEN];
-            if(neonspam_settings[i].valid & NS_VALID_FUNCTION) {
-                neonspam_cmd_set_function *func = neonspam_settings[i].function;
-                org_value = func(client, user, chan, event, NULL, NULL, valueBuf);
-            } else
-                org_value = "0";
-            value = org_value;
-            if(neonspam_settings[i].valid & NS_VALID_BOOLEAN) {
-                if(!strcmp(value, "0"))
-                    value = get_language_string(user, "NS_SET_OFF");
-                else
-                    value = get_language_string(user, "NS_SET_ON");
+        while(neonspam_settings[++i].setting) {
+            if((chan->spam_settings->flags & (neonspam_settings[i].if_flag & SPAMSETTINGS_FLAGS)) != (neonspam_settings[i].if_flag & SPAMSETTINGS_FLAGS))
+                continue;
+            if((neonspam_settings[i].if_flag & SPAMSETTINGS_ISTIMEBAN) && !boolflag)
+                continue;
+            namePos = 0;
+            for(j = 0; j < neonspam_settings[i].indent; j++) {
+                nameBuf[namePos++] = ' ';
             }
-            strcpy(query, value);
-            querypos = strlen(query);
-            if(neonspam_settings[i].valid & NS_HAS_OPT) {
-                sprintf(nameBuf, "NS_SET_OPTION_%s_%s", neonspam_settings[i].setting, org_value);
-                tmp = get_language_string(user, nameBuf);
-                if(tmp) {
-                    querypos += sprintf(query+querypos, " - %s", tmp);
-                }
-            }
-            if(argc && neonspam_settings[i].valid & NS_HAS_HELP) {
-                sprintf(nameBuf, "NS_SET_HELP_%s", neonspam_settings[i].setting);
-                tmp = get_language_string(user, nameBuf);
-                if(tmp) {
-                    querypos += sprintf(query+querypos, " - %s", tmp);
-                }
-            }
-            content[0] = (char*)neonspam_settings[i].setting;
-            content[1] = query;
+            neonspam_cmd_set_function *func = neonspam_settings[i].function;
+            value = func(client, user, chan, event, neonspam_settings[i].intparam, neonspam_settings[i].charparam, NULL, valueBuf);
+            if(neonspam_settings[i].if_flag & SPAMSETTINGS_SETTIMEBAN)
+                boolflag = !strcmp(value, "2");
+            //TODO: append option or help info
+            sprintf(nameBuf + namePos, "%s", neonspam_settings[i].setting);
+            content[0] = nameBuf;
+            content[1] = value;
             table_add(table, content);
-            i++;
         }
         char **table_lines = table_end(table);
         for(i = 0; i < table->entrys; i++) {
@@ -184,115 +218,7 @@ CMD_BIND(neonspam_cmd_set) {
     }
 }
 
-static void neonspam_cmd_set_setting(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, int setting, char *args) {
-    char *value;
-    char valueBuf[MAXLEN];
-    char nameBuf[64];
-    //get current value
-    MYSQL_RES *res;
-    printf_mysql_query("SELECT " SPAMSERV_SETTINGS_QUERY " FROM `channels` WHERE `channel_id` = '%d'", chan->channel_id);
-    res = mysql_use();
-    neonspam_settings_row = mysql_fetch_row(res);
-    printf_mysql_query("SELECT " SPAMSERV_SETTINGS_QUERY " FROM `channels` WHERE `channel_name` = 'defaults'");
-    res = mysql_use();
-    neonspam_settings_defaults = mysql_fetch_row(res);
-    if(neonspam_settings[setting].valid & NS_VALID_FUNCTION) {
-        neonspam_cmd_set_function *func = neonspam_settings[setting].function;
-        if(!(value = func(client, user, chan, event, NULL, NULL, valueBuf)))
-            return;
-    } else
-        value = "0";
-    if(args) {
-        //change the channel setting
-        //check the new argument
-        int valid = neonspam_settings[setting].valid;
-        if(valid & NS_VALID_STRING) {
-            if(!strcmp(args, "*")) {
-                args = "";
-            }
-        }
-        if(valid & NS_VALID_ACCESS) {
-            int caccess = atoi(args);
-            int max = ((valid & NS_VALID_NO501) ? 500 : 501);
-            if(caccess < 0 || caccess > max) {
-                reply(getTextBot(), user, "NS_INVALID_ACCESS", caccess);
-                return;
-            }
-            int uaccess = getChannelAccess(user, chan, 0);
-            if(uaccess == 500) uaccess++;
-            if(atoi(value) > uaccess) {
-                if(isGodMode(user)) {
-                    event->flags |= CMDFLAG_OPLOG;
-                } else {
-                    reply(getTextBot(), user, "NS_SET_CANNOT_SET");
-                    return;
-                }
-            }
-            if(caccess > uaccess) {
-                if(isGodMode(user)) {
-                    event->flags |= CMDFLAG_OPLOG;
-                } else {
-                    reply(getTextBot(), user, "NS_SET_BADLEVEL");
-                    return;
-                }
-            }
-            sprintf(nameBuf, "%d", caccess);
-            args = nameBuf;
-        }
-        if(valid & NS_VALID_OPTIONS) {
-            int options = atoi((char *) neonspam_settings[setting].parameter);
-            int coption = atoi(args);
-            if(coption < 0 || coption >= options) {
-                reply(getTextBot(), user, "NS_SET_INVALID_OPTION", coption);
-                int i;
-                int nameBufPos = 0;
-                if(valid & NS_HAS_OPT) {
-                    for(i = 0; i < options; i++) {
-                        sprintf(nameBuf, "NS_SET_OPTION_%s_%d", neonspam_settings[setting].setting, i);
-                        reply(getTextBot(), user, "\002%d\002 - %s", i, get_language_string(user, nameBuf));
-                    }
-                } else {
-                    for(i = 0; i < options; i++) {
-                        nameBufPos += sprintf(nameBuf + nameBufPos, "\002%d\002, ", i);
-                    }
-                    if(nameBufPos) {
-                        nameBuf[nameBufPos-2] = '\0';
-                        reply(getTextBot(), user, nameBuf);
-                    }
-                }
-                return;
-            }
-        }
-        if(valid & NS_VALID_NUMERIC) {
-            sprintf(nameBuf, "%d", atoi(args));
-            args = nameBuf;
-        }
-        if(valid & NS_VALID_BOOLEAN) {
-            if(!strcmp(args, "0") || !stricmp(args, "off") || !stricmp(args, get_language_string(user, "NS_SET_OFF"))) {
-                args = "0";
-            } else if(!strcmp(args, "1") || !stricmp(args, "on") || !stricmp(args, get_language_string(user, "NS_SET_ON"))) {
-                args = "1";
-            } else {
-                reply(getTextBot(), user, "NS_SET_INVALID_BOOLEAN", args);
-                return;
-            }
-        }
-        //valid - set it
-        if(valid & NS_VALID_FUNCTION) {
-            neonspam_cmd_set_function *func = neonspam_settings[setting].function;
-            strcpy(valueBuf, value);
-            if(!(value = func(client, user, chan, event, neonspam_settings[setting].setting, valueBuf, args)))
-                return;
-        }
-    }
-    reply(getTextBot(), user, "\002%s\002 %s", neonspam_settings[setting].setting, value);
-    if(neonspam_settings[setting].valid & NS_HAS_HELP) {
-         sprintf(nameBuf, "NS_SET_HELP_%s", neonspam_settings[setting].setting);
-         reply(getTextBot(), user, "  %s", get_language_string(user, nameBuf));
-    }
-}
-
-static char* neonspam_cmd_set_trigger(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *cvalue, char *argument) {
+static char* neonspam_cmd_set_trigger(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, int intparam, char *charparam, char *argument, char *retBuf) {
     char *trigger;
     //get current trigger
     MYSQL_RES *res;
@@ -301,7 +227,7 @@ static char* neonspam_cmd_set_trigger(struct ClientSocket *client, struct UserNo
     res = mysql_use();
     row = mysql_fetch_row(res);
     trigger = row[0];
-    if(cvalue && argument) {
+    if(argument) {
         int uaccess = getChannelAccess(user, chan, 0);
         if(uaccess < 500) {
             if(isGodMode(user)) {
@@ -321,202 +247,137 @@ static char* neonspam_cmd_set_trigger(struct ClientSocket *client, struct UserNo
     return trigger;
 }
 
-static char* neonspam_cmd_set_spamlimit(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *cvalue, char *argument) {
-    if(!cvalue) {
-        //get current value
-        cvalue = (neonspam_settings_row[2] ? neonspam_settings_row[2] : neonspam_settings_defaults[2]);
-    }
-    else if(argument) {
-        //change value
-        printf_mysql_query("UPDATE `channels` SET `channel_maxrepeat` = '%d' WHERE `channel_id` = '%d' ", atoi(argument), chan->channel_id);
-        sprintf(cvalue, "%d", atoi(argument));
-        if(chan->spam_settings)
-            chan->spam_settings->spam_amount = atoi(argument);
-    }
-    return cvalue;
-}
-
-static char* neonspam_cmd_set_spamreaction(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *cvalue, char *argument) {
-    if(!cvalue) {
-        //get current value
-        cvalue = (neonspam_settings_row[3] ? neonspam_settings_row[3] : neonspam_settings_defaults[3]);
-    }
-    else if(argument) {
-        //change value
-        printf_mysql_query("UPDATE `channels` SET `channel_repeatreaction` = '%d' WHERE `channel_id` = '%d' ", atoi(argument), chan->channel_id);
-        sprintf(cvalue, "%d", atoi(argument));
-    }
-    return cvalue;
-}
-
-static char* neonspam_cmd_set_floodreaction(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *cvalue, char *argument) {
-    if(!cvalue) {
-        //get current value
-        cvalue = (neonspam_settings_row[6] ? neonspam_settings_row[6] : neonspam_settings_defaults[6]);
-    }
-    else if(argument) {
-        //change value
-        printf_mysql_query("UPDATE `channels` SET `channel_floodreaction` = '%d' WHERE `channel_id` = '%d' ", atoi(argument), chan->channel_id);
-        sprintf(cvalue, "%d", atoi(argument));
-    }
-    return cvalue;
-}
-
-static char* neonspam_cmd_setjoinfloodreaction(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *cvalue, char *argument) {
-    if(!cvalue) {
-        //get current value
-        cvalue = (neonspam_settings_row[9] ? neonspam_settings_row[9] : neonspam_settings_defaults[9]);
-    }
-    else if(argument) {
-        //change value
-        printf_mysql_query("UPDATE `channels` SET `channel_joinreaction` = '%d' WHERE `channel_id` = '%d' ", atoi(argument), chan->channel_id);
-        sprintf(cvalue, "%d", atoi(argument));
-    }
-    return cvalue;
-}
-
-static char* neonspam_cmd_setspamscan(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *cvalue, char *argument) {
-    if(!cvalue) {
-        //get current value
-        cvalue = ((atoi(neonspam_settings_row[0] ? neonspam_settings_row[0] : neonspam_settings_defaults[0]) & SPAMSETTINGS_SPAMSCAN) ? "1" : "0");
-    }
-    else if(argument) {
-        //change value
-        int cflags = atoi((neonspam_settings_row[0] ? neonspam_settings_row[0] : neonspam_settings_defaults[0]));
-        if(!strcmp(argument, "0"))
-            cflags &= ~SPAMSETTINGS_SPAMSCAN;
-        else
-            cflags |= SPAMSETTINGS_SPAMSCAN;
-        printf_mysql_query("UPDATE `channels` SET `channel_scanstate` = '%d' WHERE `channel_id` = '%d' ", cflags, chan->channel_id);
-        cvalue = argument;
-        if(chan->spam_settings)
-            chan->spam_settings->flags = cflags;
-    }
-    return cvalue;
-}
-
-static char* neonspam_cmd_setfloodscan(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *cvalue, char *argument) {
-    if(!cvalue) {
-        //get current value
-        cvalue = ((atoi(neonspam_settings_row[0] ? neonspam_settings_row[0] : neonspam_settings_defaults[0]) & SPAMSETTINGS_FLOODSCAN) ? "1" : "0");
-    }
-    else if(argument) {
-        //change value
-        int cflags = atoi((neonspam_settings_row[0] ? neonspam_settings_row[0] : neonspam_settings_defaults[0]));
-        if(!strcmp(argument, "0"))
-            cflags &= ~SPAMSETTINGS_FLOODSCAN;
-        else
-            cflags |= SPAMSETTINGS_FLOODSCAN;
-        printf_mysql_query("UPDATE `channels` SET `channel_scanstate` = '%d' WHERE `channel_id` = '%d' ", cflags, chan->channel_id);
-        cvalue = argument;
-        if(chan->spam_settings)
-            chan->spam_settings->flags = cflags;
-    }
-    return cvalue;
-}
-
-static char* neonspam_cmd_setjoinfloodscan(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *cvalue, char *argument) {
-    if(!cvalue) {
-        //get current value
-        cvalue = ((atoi(neonspam_settings_row[0] ? neonspam_settings_row[0] : neonspam_settings_defaults[0]) & SPAMSETTINGS_JOINSCAN) ? "1" : "0");
-    }
-    else if(argument) {
-        //change value
-        int cflags = atoi((neonspam_settings_row[0] ? neonspam_settings_row[0] : neonspam_settings_defaults[0]));
-        if(!strcmp(argument, "0"))
-            cflags &= ~SPAMSETTINGS_JOINSCAN;
-        else
-            cflags |= SPAMSETTINGS_JOINSCAN;
-        printf_mysql_query("UPDATE `channels` SET `channel_scanstate` = '%d' WHERE `channel_id` = '%d' ", cflags, chan->channel_id);
-        cvalue = argument;
-        if(chan->spam_settings)
-            chan->spam_settings->flags = cflags;
+static char* neonspam_cmd_setflags(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, int flag, char *charparam, char *argument, char *retBuf) {
+    char *value = ((chan->spam_settings->flags & flag) ? "1" : "0");
+    if(argument) {
+        //binary argument...
+        if(!strcmp(argument, "0") || !stricmp(argument, "off") || !stricmp(argument, get_language_string(user, "NS_SET_OFF"))) {
+            chan->spam_settings->flags &= ~flag;
+        } else if(!strcmp(argument, "1") || !stricmp(argument, "on") || !stricmp(argument, get_language_string(user, "NS_SET_ON"))) {
+            chan->spam_settings->flags |= flag;
+        } else {
+            reply(getTextBot(), user, "NS_SET_INVALID_BOOLEAN", argument);
+            return NULL;
+        }
+        char str_flags[50];
+        convertNeonSpamSettingsToString(chan->spam_settings->flags, str_flags);
+        printf_mysql_query("UPDATE `channels` SET `channel_scanner` = '%s' WHERE `channel_id` = '%d' ", str_flags, chan->channel_id);
+        value = argument;
     }
-    return cvalue;
+    return value;
 }
 
-static char* neonspam_cmd_setbotnetscan(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *cvalue, char *argument) {
-    if(!cvalue) {
-        //get current value
-        cvalue = ((atoi(neonspam_settings_row[0] ? neonspam_settings_row[0] : neonspam_settings_defaults[0]) & SPAMSETTINGS_BOTNETSCAN) ? "1" : "0");
-    }
-    else if(argument) {
-        //change value
-        int cflags = atoi((neonspam_settings_row[0] ? neonspam_settings_row[0] : neonspam_settings_defaults[0]));
-        if(!strcmp(argument, "0"))
-            cflags &= ~SPAMSETTINGS_BOTNETSCAN;
-        else
-            cflags |= SPAMSETTINGS_BOTNETSCAN;
-        printf_mysql_query("UPDATE `channels` SET `channel_scanstate` = '%d' WHERE `channel_id` = '%d' ", cflags, chan->channel_id);
-        cvalue = argument;
-        if(chan->spam_settings)
-            chan->spam_settings->flags = cflags;
+static char* neonspam_cmd_setexcept(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, int exceptlvl_index, char *field, char *argument, char *retBuf) {
+    unsigned int value = chan->spam_settings->exceptlevel[exceptlvl_index];
+    if(argument) {
+        //numeric argument... (access)
+        int caccess = atoi(argument);
+        if(caccess < 0 || caccess > 501) {
+            reply(getTextBot(), user, "NS_INVALID_ACCESS", caccess);
+            return NULL;
+        }
+        int uaccess = getChannelAccess(user, chan, 0);
+        if(uaccess == 500) uaccess++;
+        if(caccess > uaccess) {
+            if(isGodMode(user)) {
+                event->flags |= CMDFLAG_OPLOG;
+            } else {
+                reply(getTextBot(), user, "NS_SET_CANNOT_SET");
+                return NULL;
+            }
+        }
+        if(caccess > uaccess) {
+            if(isGodMode(user)) {
+                event->flags |= CMDFLAG_OPLOG;
+            } else {
+                reply(getTextBot(), user, "NS_SET_BADLEVEL");
+                return NULL;
+            }
+        }
+        value = caccess;
+        chan->spam_settings->exceptlevel[exceptlvl_index] = value;
+        printf_mysql_query("UPDATE `channels` SET `%s` = '%u' WHERE `channel_id` = '%d' ", field, value, chan->channel_id);
     }
-    return cvalue;
+    sprintf(retBuf, "%u", value);
+    return retBuf;
 }
 
-static char* neonspam_cmd_setscanchanops(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *cvalue, char *argument) {
-    if(!cvalue) {
-        //get current value
-        cvalue = ((atoi(neonspam_settings_row[0] ? neonspam_settings_row[0] : neonspam_settings_defaults[0]) & SPAMSETTINGS_SCANOPS) ? "1" : "0");
-    }
-    else if(argument) {
-        //change value
-        int cflags = atoi((neonspam_settings_row[0] ? neonspam_settings_row[0] : neonspam_settings_defaults[0]));
-        if(!strcmp(argument, "0"))
-            cflags &= ~SPAMSETTINGS_SCANOPS;
-        else
-            cflags |= SPAMSETTINGS_SCANOPS;
-        printf_mysql_query("UPDATE `channels` SET `channel_scanstate` = '%d' WHERE `channel_id` = '%d' ", cflags, chan->channel_id);
-        cvalue = argument;
-        if(chan->spam_settings)
-            chan->spam_settings->flags = cflags;
+static char* neonspam_cmd_set_reaction(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, int mysqlindex, char *mysqlfield, char *argument, char *retBuf) {
+    if(argument) {
+        /* valid options:
+        * 0/kick - kick
+        * 1/kickban - kickban
+        * 2/ban - timed ban
+        */
+        if(!strcmp(argument, "0") || !stricmp(argument, "kick")) {
+            argument = "0";
+        } else if(!strcmp(argument, "1") || !stricmp(argument, "kickban")) {
+            argument = "1";
+        } else if(!strcmp(argument, "2") || !stricmp(argument, "ban")) {
+            argument = "2";
+        } else {
+            reply(getTextBot(), user, "NS_SET_INVALID_OPTION_STR", argument);
+            return NULL;
+        }
+        printf_mysql_query("UPDATE `channels` SET `%s` = '%s' WHERE `channel_id` = '%d' ", mysqlfield, argument, chan->channel_id);
+        return argument;
+    } else {
+        if(neonspam_settings_row) {
+            return (neonspam_settings_row[mysqlindex] ? neonspam_settings_row[mysqlindex] : neonspam_settings_defaults[mysqlindex]);
+        } else {
+            MYSQL_RES *res;
+            MYSQL_ROW row;
+            printf_mysql_query("SELECT `%s` FROM `channels` WHERE `channel_id` = '%d'", mysqlfield, chan->channel_id);
+            res = mysql_use();
+            row = mysql_fetch_row(res);
+            return row[0];
+        }
     }
-    return cvalue;
 }
 
-static char* neonspam_cmd_setscanvoiced(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *cvalue, char *argument) {
-    if(!cvalue) {
-        //get current value
-        cvalue = ((atoi(neonspam_settings_row[0] ? neonspam_settings_row[0] : neonspam_settings_defaults[0]) & SPAMSETTINGS_SCANVOICE) ? "1" : "0");
-    }
-    else if(argument) {
-        //change value
-        int cflags = atoi((neonspam_settings_row[0] ? neonspam_settings_row[0] : neonspam_settings_defaults[0]));
-        if(!strcmp(argument, "0"))
-            cflags &= ~SPAMSETTINGS_SCANVOICE;
-        else
-            cflags |= SPAMSETTINGS_SCANVOICE;
-        printf_mysql_query("UPDATE `channels` SET `channel_scanstate` = '%d' WHERE `channel_id` = '%d' ", cflags, chan->channel_id);
-        cvalue = argument;
-        if(chan->spam_settings)
-            chan->spam_settings->flags = cflags;
+static char* neonspam_cmd_set_reaction_time(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, int mysqlindex, char *mysqlfield, char *argument, char *retBuf) {
+    int duration;
+    if(argument) {
+        duration = strToTime(user, argument);
+        if(duration < 30) {
+            reply(getTextBot(), user, "NS_TIMEBAN_DURATION_TOO_SHORT", 30);
+            return NULL;
+        }
+        printf_mysql_query("UPDATE `channels` SET `%s` = '%s' WHERE `channel_id` = '%d' ", mysqlfield, argument, chan->channel_id);
+    } else {
+        if(neonspam_settings_row) {
+            duration = atoi(neonspam_settings_row[mysqlindex] ? neonspam_settings_row[mysqlindex] : neonspam_settings_defaults[mysqlindex]);
+        } else {
+            MYSQL_RES *res;
+            MYSQL_ROW row;
+            printf_mysql_query("SELECT `%s` FROM `channels` WHERE `channel_id` = '%d'", mysqlfield, chan->channel_id);
+            res = mysql_use();
+            row = mysql_fetch_row(res);
+            duration = atoi(row[0]);
+        }
     }
-    return cvalue;
+    timeToStr(user, duration, 3, retBuf);
+    return retBuf;
 }
 
-static char* neonspam_cmd_setexceptlevel(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *cvalue, char *argument) {
-    if(!cvalue) {
-        //get current value
-        cvalue = (neonspam_settings_row[1] ? neonspam_settings_row[1] : neonspam_settings_defaults[1]);
-    }
-    else if(argument) {
-        //change value
-        printf_mysql_query("UPDATE `channels` SET `channel_scanexcept` = '%d' WHERE `channel_id` = '%d' ", atoi(argument), chan->channel_id);
-        sprintf(cvalue, "%d", atoi(argument));
-        if(chan->spam_settings)
-            chan->spam_settings->exceptlevel = atoi(argument);
+static char* neonspam_cmd_setpercent(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, int percent_index, char *mysqlfield, char *argument, char *retBuf) {
+    unsigned int value = chan->spam_settings->percent[percent_index];
+    if(argument) {
+        //numeric argument... (access)
+        value = atoi(argument);
+        if(value < 0 || value > 100) {
+            //invalid percent value
+            return NULL;
+        }
+        chan->spam_settings->percent[percent_index] = value;
+        printf_mysql_query("UPDATE `channels` SET `%s` = '%u' WHERE `channel_id` = '%d' ", mysqlfield, value, chan->channel_id);
     }
-    return cvalue;
+    sprintf(retBuf, "%u", value);
+    return retBuf;
 }
 
-static char* neonspam_cmd_setfloodsensibility(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *cvalue, char *argument) {
-    if(!cvalue) {
-        //get current value
-        sprintf(argument, "%s:%s", (neonspam_settings_row[4] ? neonspam_settings_row[4] : neonspam_settings_defaults[4]), (neonspam_settings_row[5] ? neonspam_settings_row[5] : neonspam_settings_defaults[5]));
-        cvalue = argument;
-    }
-    else if(argument) {
+static char* neonspam_cmd_setsensibility(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, int sensibility_index, char *mysqlfield, char *argument, char *retBuf) {
+    if(argument) {
         //change value
         char *delimiter = strstr(argument, ":");
         if(!delimiter) {
@@ -535,50 +396,33 @@ static char* neonspam_cmd_setfloodsensibility(struct ClientSocket *client, struc
             //invalid time period
             return NULL;
         }
-        printf_mysql_query("UPDATE `channels` SET `channel_maxflood` = '%d', `channel_floodtime` = '%d' WHERE `channel_id` = '%d' ", amount, timep, chan->channel_id);
-        sprintf(cvalue, "%d:%d", amount, timep);
-        if(chan->spam_settings) {
-            chan->spam_settings->flood_amount = amount;
-            chan->spam_settings->flood_time = timep;
-        }
+        char amountfield[50], timefield[50];
+        sprintf(amountfield, "%s%s", mysqlfield, "limit");
+        sprintf(timefield, "%s%s", mysqlfield, "time");
+        printf_mysql_query("UPDATE `channels` SET `%s` = '%d', `%s` = '%d' WHERE `channel_id` = '%d' ", amountfield, amount, timefield, timep, chan->channel_id);
+        sprintf(retBuf, "%d:%d", amount, timep);
+        chan->spam_settings->sensibility_amount[sensibility_index] = amount;
+        chan->spam_settings->sensibility_time[sensibility_index] = timep;
+    } else {
+        sprintf(retBuf, "%d:%d", chan->spam_settings->sensibility_amount[sensibility_index], chan->spam_settings->sensibility_time[sensibility_index]);
     }
-    return cvalue;
+    return retBuf;
 }
 
-static char* neonspam_cmd_setjoinsensibility(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *cvalue, char *argument) {
-    if(!cvalue) {
-        //get current value
-        sprintf(argument, "%s:%s", (neonspam_settings_row[7] ? neonspam_settings_row[7] : neonspam_settings_defaults[7]), (neonspam_settings_row[8] ? neonspam_settings_row[8] : neonspam_settings_defaults[8]));
-        cvalue = argument;
-    }
-    else if(argument) {
+static char* neonspam_cmd_set_spamlimit(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, int intparam, char *charparam, char *argument, char *retBuf) {
+    if(argument) {
         //change value
-        char *delimiter = strstr(argument, ":");
-        if(!delimiter) {
-            //invalid format
-            return NULL;
-        }
-        *delimiter = '\0';
-        delimiter++;
         int amount = atoi(argument);
-        int timep = atoi(delimiter);
-        if(amount > MAX_JOIN_AMOUNT || amount < MIN_JOIN_AMOUNT) {
+        if(amount > MAX_FLOOD_AMOUNT || amount < MIN_FLOOD_AMOUNT) {
             //invalid amount
             return NULL;
         }
-        if(timep > MAX_JOIN_TIME || timep < 0) {
-            //invalid time period
-            return NULL;
-        }
-        printf_mysql_query("UPDATE `channels` SET `channel_maxjoin` = '%d', `channel_jointime` = '%d' WHERE `channel_id` = '%d' ", amount, timep, chan->channel_id);
-        sprintf(cvalue, "%d:%d", amount, timep);
-        if(chan->spam_settings) {
-            chan->spam_settings->join_amount = amount;
-            chan->spam_settings->join_time = timep;
-        }
-    }
-    return cvalue;
+        printf_mysql_query("UPDATE `channels` SET `channel_maxrepeat` = '%d' WHERE `channel_id` = '%d' ", amount, chan->channel_id);
+        sprintf(retBuf, "%d", amount);
+        chan->spam_settings->spam_amount = amount;
+    } else
+        sprintf(retBuf, "%d", chan->spam_settings->spam_amount);
+    return retBuf;
 }
 
-
 #undef MAX_QUERY_LEN