1 /* cmd_neonspam_set.c - NeonServ v5.6
2 * Copyright (C) 2011-2012 Philipp Kreil (pk910)
4 * This program is free software: you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation, either version 3 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program. If not, see <http://www.gnu.org/licenses/>.
18 #include "cmd_neonspam.h"
20 typedef char* neonspam_cmd_set_function(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, int intparam, char *charparam, char *argument, char *retBuf);
21 static char* neonspam_cmd_set_trigger(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, int intparam, char *charparam, char *argument, char *retBuf);
22 static char* neonspam_cmd_setflags(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, int intparam, char *charparam, char *argument, char *retBuf);
23 static char* neonspam_cmd_setexcept(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, int intparam, char *charparam, char *argument, char *retBuf);
24 static char* neonspam_cmd_set_reaction(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, int intparam, char *charparam, char *argument, char *retBuf);
25 static char* neonspam_cmd_set_reaction_time(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, int intparam, char *charparam, char *argument, char *retBuf);
26 static char* neonspam_cmd_setpercent(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, int intparam, char *charparam, char *argument, char *retBuf);
27 static char* neonspam_cmd_setsensibility(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, int intparam, char *charparam, char *argument, char *retBuf);
28 static char* neonspam_cmd_set_spamlimit(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, int intparam, char *charparam, char *argument, char *retBuf);
29 static char* neonspam_cmd_setscanops(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, int intparam, char *charparam, char *argument, char *retBuf);
30 static char* neonspam_cmd_setscanvoice(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, int intparam, char *charparam, char *argument, char *retBuf);
31 static char* neonspam_cmd_setscanexcept(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, int intparam, char *charparam, char *argument, char *retBuf);
33 static MYSQL_ROW neonspam_settings_row, neonspam_settings_defaults;
34 #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`, `channel_badword_reaction`, `channel_badword_reaction_duration`"
35 #define SPAMSERV_SETTINGS_RESET "\
36 `channel_scanner` = NULL, \
37 `channel_spam_limit` = NULL, \
38 `channel_spam_reaction` = NULL, \
39 `channel_spam_reaction_duration` = NULL, \
40 `channel_spam_except` = NULL, \
41 `channel_flood_limit` = NULL, \
42 `channel_flood_time` = NULL, \
43 `channel_flood_reaction` = NULL, \
44 `channel_flood_reaction_duration` = NULL, \
45 `channel_flood_except` = NULL, \
46 `channel_join_limit` = NULL, \
47 `channel_join_time` = NULL, \
48 `channel_join_reaction` = NULL, \
49 `channel_join_reaction_duration` = NULL, \
50 `channel_join_except` = NULL, \
51 `channel_botnet_bantime` = NULL, \
52 `channel_botnet_except` = NULL, \
53 `channel_caps_percent` = NULL, \
54 `channel_caps_reaction` = NULL, \
55 `channel_caps_reaction_duration` = NULL, \
56 `channel_caps_except` = NULL,\
57 `channel_digit_percent` = NULL, \
58 `channel_digit_reaction` = NULL, \
59 `channel_digit_reaction_duration` = NULL, \
60 `channel_digit_except` = NULL, \
61 `channel_badword_reaction` = NULL, \
62 `channel_badword_reaction_duration` = NULL, \
63 `channel_badword_except` = NULL "
65 #define SET_HELP 0x0001
66 #define SET_BOOL 0x0002
67 #define SET_OPT 0x0004
69 #define SET_SCANOPS 0x0010
70 #define SET_SCANVOICE 0x0020
71 #define SET_SCANEXCEPT 0x0040
73 #define SET_OPT_MAX 0xff00
74 #define SET_OPT_SHIFT 8
84 } neonspam_settings[] = {
85 {0, 0, "Trigger", neonspam_cmd_set_trigger, 0, NULL, SET_HELP},
87 {0, 0, "SpamScan", neonspam_cmd_setflags, SPAMSETTINGS_SPAMSCAN, NULL, SET_BOOL},
88 {SPAMSETTINGS_SPAMSCAN, 2, "SpamLimit", neonspam_cmd_set_spamlimit, 0, NULL, SET_HELP},
89 {SPAMSETTINGS_SPAMSCAN | SPAMSETTINGS_SETTIMEBAN, 2, "SpamReaction", neonspam_cmd_set_reaction, 0, "channel_spam_reaction", SET_OPT | (3 << SET_OPT_SHIFT)},
90 {SPAMSETTINGS_SPAMSCAN | SPAMSETTINGS_ISTIMEBAN, 4, "SpamBanDuration", neonspam_cmd_set_reaction_time, 1, "channel_spam_reaction_duration", 0},
91 {SPAMSETTINGS_SPAMSCAN, 2, "SpamScanChanOps", neonspam_cmd_setflags, SPAMSETTINGS_SPAMSCAN_OPS, NULL, SET_BOOL | SET_SCANOPS},
92 {SPAMSETTINGS_SPAMSCAN, 2, "SpamScanVoiced", neonspam_cmd_setflags, SPAMSETTINGS_SPAMSCAN_VOICE, NULL, SET_BOOL | SET_SCANVOICE},
93 {SPAMSETTINGS_SPAMSCAN, 2, "SpamScanExcept", neonspam_cmd_setexcept, SPAMSETTINGS_SPAMEXCINDEX, "channel_spam_except", SET_HELP | SET_SCANEXCEPT},
95 {0, 0, "FloodScan", neonspam_cmd_setflags, SPAMSETTINGS_FLOODSCAN, NULL, SET_BOOL},
96 {SPAMSETTINGS_FLOODSCAN, 2, "FloodSensibility", neonspam_cmd_setsensibility, SPAMSETTINGS_FLOODSENINDEX, "channel_flood_", SET_HELP},
97 {SPAMSETTINGS_FLOODSCAN | SPAMSETTINGS_SETTIMEBAN, 2, "FloodReaction", neonspam_cmd_set_reaction, 2, "channel_flood_reaction", SET_OPT | (3 << SET_OPT_SHIFT)},
98 {SPAMSETTINGS_FLOODSCAN | SPAMSETTINGS_ISTIMEBAN, 4, "FloodBanDuration", neonspam_cmd_set_reaction_time, 3, "channel_flood_reaction_duration",0},
99 {SPAMSETTINGS_FLOODSCAN, 2, "FloodScanChanOps", neonspam_cmd_setflags, SPAMSETTINGS_FLOODSCAN_OPS, NULL, SET_BOOL | SET_SCANOPS},
100 {SPAMSETTINGS_FLOODSCAN, 2, "FloodScanVoiced", neonspam_cmd_setflags, SPAMSETTINGS_FLOODSCAN_VOICE, NULL, SET_BOOL | SET_SCANVOICE},
101 {SPAMSETTINGS_FLOODSCAN, 2, "FloodScanExcept", neonspam_cmd_setexcept, SPAMSETTINGS_FLOODEXCINDEX, "channel_flood_except", SET_HELP | SET_SCANEXCEPT},
103 {0, 0, "JoinScan", neonspam_cmd_setflags, SPAMSETTINGS_JOINSCAN, NULL, SET_BOOL},
104 {SPAMSETTINGS_JOINSCAN, 2, "JoinSensibility", neonspam_cmd_setsensibility, SPAMSETTINGS_JOINSENINDEX, "channel_join_", SET_HELP},
105 {SPAMSETTINGS_JOINSCAN | SPAMSETTINGS_SETTIMEBAN, 2, "JoinReaction", neonspam_cmd_set_reaction, 4, "channel_join_reaction", SET_OPT | (3 << SET_OPT_SHIFT)},
106 {SPAMSETTINGS_JOINSCAN | SPAMSETTINGS_ISTIMEBAN, 4, "JoinBanDuration", neonspam_cmd_set_reaction_time, 5, "channel_join_reaction_duration", 0},
107 {SPAMSETTINGS_JOINSCAN, 2, "JoinScanChanOps", neonspam_cmd_setflags, SPAMSETTINGS_JOINSCAN_OPS, NULL, SET_BOOL | SET_SCANOPS},
108 {SPAMSETTINGS_JOINSCAN, 2, "JoinScanVoiced", neonspam_cmd_setflags, SPAMSETTINGS_JOINSCAN_VOICE, NULL, SET_BOOL | SET_SCANVOICE},
109 {SPAMSETTINGS_JOINSCAN, 2, "JoinScanExcept", neonspam_cmd_setexcept, SPAMSETTINGS_JOINEXCINDEX, "channel_join_except", SET_HELP | SET_SCANEXCEPT},
111 {0, 0, "BotNetScan", neonspam_cmd_setflags, SPAMSETTINGS_BOTNETSCAN, NULL, SET_BOOL},
112 {SPAMSETTINGS_BOTNETSCAN, 4, "BotNetBanDuration", neonspam_cmd_set_reaction_time, 6, "channel_botnet_bantime", 0},
113 {SPAMSETTINGS_BOTNETSCAN, 2, "BotNetScanChanOps", neonspam_cmd_setflags, SPAMSETTINGS_BOTNETSCAN_OPS, NULL, SET_BOOL | SET_SCANOPS},
114 {SPAMSETTINGS_BOTNETSCAN, 2, "BotNetScanVoiced", neonspam_cmd_setflags, SPAMSETTINGS_BOTNETSCAN_VOICE, NULL, SET_BOOL | SET_SCANVOICE},
115 //{SPAMSETTINGS_BOTNETSCAN, 2, "BotNetScanExcept", neonspam_cmd_setexcept, SPAMSETTINGS_BOTNETEXCINDEX, "channel_botnet_except", SET_HELP},
117 {0, 0, "CapsScan", neonspam_cmd_setflags, SPAMSETTINGS_CAPSSCAN, NULL, SET_BOOL},
118 {SPAMSETTINGS_CAPSSCAN, 2, "CapsPercent", neonspam_cmd_setpercent, SPAMSETTINGS_CAPSPERCENTINDEX, "channel_caps_percent", SET_HELP},
119 {SPAMSETTINGS_CAPSSCAN | SPAMSETTINGS_SETTIMEBAN, 2, "CapsReaction", neonspam_cmd_set_reaction, 7, "channel_caps_reaction", SET_OPT | (3 << SET_OPT_SHIFT)},
120 {SPAMSETTINGS_CAPSSCAN | SPAMSETTINGS_ISTIMEBAN, 4, "CapsBanDuration", neonspam_cmd_set_reaction_time, 8, "channel_caps_reaction_duration", 0},
121 {SPAMSETTINGS_CAPSSCAN, 2, "CapsScanChanOps", neonspam_cmd_setflags, SPAMSETTINGS_CAPSSCAN_OPS, NULL, SET_BOOL | SET_SCANOPS},
122 {SPAMSETTINGS_CAPSSCAN, 2, "CapsScanVoiced", neonspam_cmd_setflags, SPAMSETTINGS_CAPSSCAN_VOICE, NULL, SET_BOOL | SET_SCANVOICE},
123 {SPAMSETTINGS_CAPSSCAN, 2, "CapsScanExcept", neonspam_cmd_setexcept, SPAMSETTINGS_CAPSEXCINDEX, "channel_caps_except", SET_HELP | SET_SCANEXCEPT},
125 {0, 0, "DigitScan", neonspam_cmd_setflags, SPAMSETTINGS_DIGITSCAN, NULL, SET_BOOL},
126 {SPAMSETTINGS_DIGITSCAN, 2, "DigitPercent", neonspam_cmd_setpercent, SPAMSETTINGS_DIGITPERCENTINDEX, "channel_digit_percent", SET_HELP},
127 {SPAMSETTINGS_DIGITSCAN | SPAMSETTINGS_SETTIMEBAN, 2, "DigitReaction", neonspam_cmd_set_reaction, 9, "channel_digit_reaction", SET_OPT | (3 << SET_OPT_SHIFT)},
128 {SPAMSETTINGS_DIGITSCAN | SPAMSETTINGS_ISTIMEBAN, 4, "DigitBanDuration", neonspam_cmd_set_reaction_time, 10, "channel_digit_reaction_duration", 0},
129 {SPAMSETTINGS_DIGITSCAN, 2, "DigitScanChanOps", neonspam_cmd_setflags, SPAMSETTINGS_DIGITSCAN_OPS, NULL, SET_BOOL | SET_SCANOPS},
130 {SPAMSETTINGS_DIGITSCAN, 2, "DigitScanVoiced", neonspam_cmd_setflags, SPAMSETTINGS_DIGITSCAN_VOICE, NULL, SET_BOOL | SET_SCANVOICE},
131 {SPAMSETTINGS_DIGITSCAN, 2, "DigitScanExcept", neonspam_cmd_setexcept, SPAMSETTINGS_DIGITEXCINDEX, "channel_digit_except", SET_HELP | SET_SCANEXCEPT},
133 {0, 0, "BadwordScan", neonspam_cmd_setflags, SPAMSETTINGS_BADWORDSCAN, NULL, SET_BOOL},
134 {SPAMSETTINGS_BADWORDSCAN | SPAMSETTINGS_SETTIMEBAN,2, "BadwordReaction", neonspam_cmd_set_reaction, 11, "channel_badword_reaction", SET_OPT | (3 << SET_OPT_SHIFT)},
135 {SPAMSETTINGS_BADWORDSCAN | SPAMSETTINGS_ISTIMEBAN,4, "BadwordBanDuration",neonspam_cmd_set_reaction_time, 12, "channel_badword_reaction_duration", 0},
136 {SPAMSETTINGS_BADWORDSCAN, 2, "BadwordScanChanOps",neonspam_cmd_setflags, SPAMSETTINGS_BADWORDSCAN_OPS, NULL, SET_BOOL | SET_SCANOPS},
137 {SPAMSETTINGS_BADWORDSCAN, 2, "BadwordScanVoiced", neonspam_cmd_setflags, SPAMSETTINGS_BADWORDSCAN_VOICE, NULL, SET_BOOL | SET_SCANVOICE},
138 {SPAMSETTINGS_BADWORDSCAN, 2, "BadwordScanExcept", neonspam_cmd_setexcept, SPAMSETTINGS_BADWORDEXCINDEX, "channel_badword_except", SET_HELP | SET_SCANEXCEPT},
140 {0, 0, "GlobalScanChanOps", neonspam_cmd_setscanops, 0, NULL, SET_BOOL},
141 {0, 0, "GlobalScanVoice", neonspam_cmd_setscanvoice, 0, NULL, SET_BOOL},
142 {0, 0, "GlobalScanExcept", neonspam_cmd_setscanexcept, 0, NULL, SET_HELP},
144 {0, 0, NULL, NULL, 0, NULL, 0}
147 #define MAX_QUERY_LEN 1024
148 CMD_BIND(neonspam_cmd_set) {
150 loadNeonSpamSettings(chan);
151 if(argc && !strcmp(argv[0], "defaults")) {
152 //reset channel settings
153 int uaccess = getChannelAccess(user, chan);
155 if(isGodMode(user)) {
156 event->flags |= CMDFLAG_OPLOG;
158 reply(textclient, user, "NS_SET_DEFAULTS_OWNER", chan->name);
164 static char defaultskey[16];
165 for(tmp = user->auth; *tmp; tmp++)
166 seed = (seed * 0xEECE66DL ^ ((*tmp << 24) | (*tmp << 16) | (*tmp << 8) | *tmp));
167 for(tmp = chan->name; *tmp; tmp++)
168 seed = (seed * 0xEECE66DL ^ ((*tmp << 24) | (*tmp << 16) | (*tmp << 8) | *tmp));
169 sprintf(defaultskey, "%08x", seed);
170 if(argc > 1 && !strcmp(argv[1], defaultskey)) {
171 printf_mysql_query("UPDATE `channels` SET " SPAMSERV_SETTINGS_RESET " WHERE `channel_id` = '%d'", chan->channel_id);
172 reply(textclient, user, "NS_SET_DEFAULTS_DONE", chan->name);
175 reply(textclient, user, "NS_SET_DEFAULTS_CODE", chan->name, defaultskey);
177 } else if(argc && strcmp(argv[0], "help")) {
178 //find the correct command
181 char *args = (argc > 1 ? merge_argv(argv, 1, argc) : NULL);
182 neonspam_settings_row = NULL;
183 neonspam_settings_defaults = NULL;
184 while(neonspam_settings[i].setting) {
185 if(!stricmp(neonspam_settings[i].setting, argv[0])) {
187 char valueBuf[MAXLEN], nameBuf[MAXLEN];
188 char *value, *optimized_value, *option_help;
189 neonspam_cmd_set_function *func = neonspam_settings[i].function;
190 value = func(client, textclient, user, chan, event, neonspam_settings[i].intparam, neonspam_settings[i].charparam, args, valueBuf);
192 optimized_value = value;
193 if(neonspam_settings[i].flags & SET_BOOL) {
194 if(!strcmp(value, "0"))
195 optimized_value = get_language_string(user, "NS_SET_OFF");
196 else if(!strcmp(value, "1"))
197 optimized_value = get_language_string(user, "NS_SET_ON");
199 if(neonspam_settings[i].flags & SET_OPT) {
200 sprintf(nameBuf, "SS_SET_OPTION_%s_%s", neonspam_settings[i].setting, value);
201 option_help = get_language_string(user, nameBuf);
204 reply(textclient, user, "\002%s\002 %s%s%s", neonspam_settings[i].setting, optimized_value, (option_help ? " - " : ""), (option_help ? option_help : ""));
205 if(neonspam_settings[i].flags & SET_OPT) {
206 int maxoption = (neonspam_settings[i].flags & SET_OPT_MAX) >> SET_OPT_SHIFT;
207 for(j = 0; j < maxoption; j++) {
208 sprintf(nameBuf, "SS_SET_OPTION_%s_%d", neonspam_settings[i].setting, j);
209 option_help = get_language_string(user, nameBuf);
210 reply(textclient, user, " \002%d\002 - %s", j, option_help);
213 if((neonspam_settings[i].flags & SET_HELP) && argc && !strcmp(argv[0], "help")) {
215 sprintf(nameBuf, "SS_SET_HELP_%s", neonspam_settings[i].setting);
216 tmp = get_language_string(user, nameBuf);
218 reply(textclient, user, " %s", tmp);
229 reply(textclient, user, "NS_SET_UNKNOWN_SETTING", argv[0]);
232 char valueBuf[MAXLEN], nameBuf[MAXLEN];
234 int namePos, boolflag = 0;
235 MYSQL_RES *res, *defaults_res;
239 while(neonspam_settings[i].setting)
241 table = table_init(2, i, 0);
242 table_set_bold(table, 0, 1);
243 printf_mysql_query("SELECT " SPAMSERV_SETTINGS_QUERY " FROM `channels` WHERE `channel_name` = 'defaults'");
244 defaults_res = mysql_use();
245 neonspam_settings_defaults = mysql_fetch_row(defaults_res);
246 printf_mysql_query("SELECT " SPAMSERV_SETTINGS_QUERY " FROM `channels` WHERE `channel_id` = '%d'", chan->channel_id);
248 neonspam_settings_row = mysql_fetch_row(res);
250 reply(textclient, user, "NS_SET_HEADER", chan->name);
251 while(neonspam_settings[++i].setting) {
252 if((chan->spam_settings->flags & (neonspam_settings[i].if_flag & SPAMSETTINGS_FLAGS)) != (neonspam_settings[i].if_flag & SPAMSETTINGS_FLAGS))
254 if((neonspam_settings[i].if_flag & SPAMSETTINGS_ISTIMEBAN) && !boolflag)
256 neonspam_cmd_set_function *func = neonspam_settings[i].function;
257 value = func(client, textclient, user, chan, event, neonspam_settings[i].intparam, neonspam_settings[i].charparam, NULL, valueBuf);
258 if(neonspam_settings[i].if_flag & SPAMSETTINGS_SETTIMEBAN)
259 boolflag = !strcmp(value, "2");
260 //TODO: append option or help info
261 strcpy(valueBuf, value);
262 if(neonspam_settings[i].flags & SET_BOOL) {
263 if(!strcmp(value, "0"))
264 strcpy(valueBuf, get_language_string(user, "NS_SET_OFF"));
265 else if(!strcmp(value, "1"))
266 strcpy(valueBuf, get_language_string(user, "NS_SET_ON"));
268 if(neonspam_settings[i].flags & SET_OPT) {
270 sprintf(nameBuf, "SS_SET_OPTION_%s_%s", neonspam_settings[i].setting, value);
271 tmp = get_language_string(user, nameBuf);
273 sprintf(valueBuf + strlen(valueBuf), " - %s", tmp);
276 if((neonspam_settings[i].flags & SET_HELP) && argc && !strcmp(argv[0], "help")) {
278 sprintf(nameBuf, "SS_SET_HELP_%s", neonspam_settings[i].setting);
279 tmp = get_language_string(user, nameBuf);
281 sprintf(valueBuf + strlen(valueBuf), " - %s", tmp);
285 for(j = 0; j < neonspam_settings[i].indent; j++) {
286 nameBuf[namePos++] = ' ';
288 sprintf(nameBuf + namePos, "%s", neonspam_settings[i].setting);
289 content[0] = nameBuf;
290 content[1] = valueBuf;
291 table_add(table, content);
293 char **table_lines = table_end(table);
294 for(i = 0; i < table->entrys; i++) {
295 reply(textclient, user, table_lines[i]);
301 static char* neonspam_cmd_set_trigger(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, int intparam, char *charparam, char *argument, char *retBuf) {
303 //get current trigger
306 printf_mysql_query("SELECT `trigger`, `defaulttrigger` FROM `bot_channels` LEFT JOIN `bots` ON `botid` = `bots`.`id` WHERE `chanid` = '%d' AND `botid` = '%d'", chan->channel_id, client->clientid);
308 row = mysql_fetch_row(res);
309 trigger = (row[0] ? row[0] : row[1]);
311 int uaccess = getChannelAccess(user, chan);
313 if(isGodMode(user)) {
314 event->flags |= CMDFLAG_OPLOG;
316 reply(textclient, user, "NS_SET_TRIGGER_OWNER", chan->name);
320 if(strlen(argument) > 15)
322 printf_mysql_query("UPDATE `bot_channels` SET `trigger` = '%s' WHERE `chanid` = '%d' AND `botid` = '%d'", escape_string(argument), chan->channel_id, client->clientid);
324 changeChannelTrigger(client->botid, chan, trigger);
330 static char* neonspam_cmd_setflags(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, int flag, char *charparam, char *argument, char *retBuf) {
331 char *value = ((chan->spam_settings->flags & flag) ? "1" : "0");
334 if(!strcmp(argument, "0") || !stricmp(argument, "off") || !stricmp(argument, get_language_string(user, "NS_SET_OFF"))) {
335 chan->spam_settings->flags &= ~flag;
336 } else if(!strcmp(argument, "1") || !stricmp(argument, "on") || !stricmp(argument, get_language_string(user, "NS_SET_ON"))) {
337 chan->spam_settings->flags |= flag;
339 reply(textclient, user, "NS_SET_INVALID_BOOLEAN", argument);
343 convertNeonSpamSettingsToString(chan->spam_settings->flags, str_flags);
344 printf_mysql_query("UPDATE `channels` SET `channel_scanner` = '%s' WHERE `channel_id` = '%d' ", str_flags, chan->channel_id);
350 static char* neonspam_cmd_setexcept(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, int exceptlvl_index, char *field, char *argument, char *retBuf) {
351 unsigned int value = chan->spam_settings->exceptlevel[exceptlvl_index];
353 //numeric argument... (access)
354 int caccess = atoi(argument);
355 if(caccess < 0 || caccess > 501) {
356 reply(textclient, user, "NS_INVALID_ACCESS", caccess);
359 int uaccess = getChannelAccess(user, chan);
360 if(uaccess == 500) uaccess++;
361 if(value > uaccess) {
362 if(isGodMode(user)) {
363 event->flags |= CMDFLAG_OPLOG;
365 reply(textclient, user, "NS_SET_CANNOT_SET");
369 if(caccess > uaccess) {
370 if(isGodMode(user)) {
371 event->flags |= CMDFLAG_OPLOG;
373 reply(textclient, user, "NS_SET_BADLEVEL");
378 chan->spam_settings->exceptlevel[exceptlvl_index] = value;
379 printf_mysql_query("UPDATE `channels` SET `%s` = '%u' WHERE `channel_id` = '%d' ", field, value, chan->channel_id);
381 sprintf(retBuf, "%u", value);
385 static char* neonspam_cmd_set_reaction(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, int mysqlindex, char *mysqlfield, char *argument, char *retBuf) {
389 * 1/kickban - kickban
392 if(!strcmp(argument, "0") || !stricmp(argument, "kick")) {
394 } else if(!strcmp(argument, "1") || !stricmp(argument, "kickban")) {
396 } else if(!strcmp(argument, "2") || !stricmp(argument, "ban")) {
399 reply(textclient, user, "NS_SET_INVALID_OPTION_STR", argument);
402 printf_mysql_query("UPDATE `channels` SET `%s` = '%s' WHERE `channel_id` = '%d' ", mysqlfield, argument, chan->channel_id);
405 if(neonspam_settings_row) {
406 return (neonspam_settings_row[mysqlindex] ? neonspam_settings_row[mysqlindex] : neonspam_settings_defaults[mysqlindex]);
410 printf_mysql_query("SELECT `%s` FROM `channels` WHERE `channel_id` = '%d'", mysqlfield, chan->channel_id);
412 row = mysql_fetch_row(res);
418 static char* neonspam_cmd_set_reaction_time(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, int mysqlindex, char *mysqlfield, char *argument, char *retBuf) {
421 duration = strToTime(user, argument);
423 reply(textclient, user, "NS_TIMEBAN_DURATION_TOO_SHORT", 30);
426 printf_mysql_query("UPDATE `channels` SET `%s` = '%d' WHERE `channel_id` = '%d' ", mysqlfield, duration, chan->channel_id);
428 if(neonspam_settings_row) {
429 duration = atoi(neonspam_settings_row[mysqlindex] ? neonspam_settings_row[mysqlindex] : neonspam_settings_defaults[mysqlindex]);
433 printf_mysql_query("SELECT `%s` FROM `channels` WHERE `channel_id` = '%d'", mysqlfield, chan->channel_id);
435 row = mysql_fetch_row(res);
436 duration = atoi(row[0]);
439 timeToStr(user, duration, 3, retBuf);
443 static char* neonspam_cmd_setpercent(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, int percent_index, char *mysqlfield, char *argument, char *retBuf) {
444 unsigned int value = chan->spam_settings->percent[percent_index];
446 //numeric argument... (access)
447 value = atoi(argument);
448 if(value < 0 || value > 100) {
449 //invalid percent value
450 reply(textclient, user, "SS_SET_PERCENT", value);
453 chan->spam_settings->percent[percent_index] = value;
454 printf_mysql_query("UPDATE `channels` SET `%s` = '%u' WHERE `channel_id` = '%d' ", mysqlfield, value, chan->channel_id);
456 sprintf(retBuf, "%u", value);
460 static char* neonspam_cmd_setsensibility(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, int sensibility_index, char *mysqlfield, char *argument, char *retBuf) {
463 char *delimiter = strstr(argument, ":");
466 reply(textclient, user, "SS_SET_SENSIBILITY", argument);
471 int amount = atoi(argument);
472 int timep = atoi(delimiter);
473 if(amount > MAX_FLOOD_AMOUNT || amount < MIN_FLOOD_AMOUNT) {
475 reply(textclient, user, "SS_SET_SENSIBILITY_AMOUNT", amount, MIN_FLOOD_AMOUNT, MAX_FLOOD_AMOUNT);
478 if(timep > MAX_FLOOD_TIME || timep < 0) {
479 //invalid time period
480 reply(textclient, user, "SS_SET_SENSIBILITY_TIME", timep, 0, MAX_FLOOD_TIME);
483 char amountfield[50], timefield[50];
484 sprintf(amountfield, "%s%s", mysqlfield, "limit");
485 sprintf(timefield, "%s%s", mysqlfield, "time");
486 printf_mysql_query("UPDATE `channels` SET `%s` = '%d', `%s` = '%d' WHERE `channel_id` = '%d' ", amountfield, amount, timefield, timep, chan->channel_id);
487 sprintf(retBuf, "%d:%d", amount, timep);
488 chan->spam_settings->sensibility_amount[sensibility_index] = amount;
489 chan->spam_settings->sensibility_time[sensibility_index] = timep;
491 sprintf(retBuf, "%d:%d", chan->spam_settings->sensibility_amount[sensibility_index], chan->spam_settings->sensibility_time[sensibility_index]);
496 static char* neonspam_cmd_set_spamlimit(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, int intparam, char *charparam, char *argument, char *retBuf) {
499 int amount = atoi(argument);
500 if(amount > 10 || amount < 2) {
502 reply(textclient, user, "SS_SET_SPAMLIMIT", amount, 2, 10);
505 printf_mysql_query("UPDATE `channels` SET `channel_spam_limit` = '%d' WHERE `channel_id` = '%d' ", amount, chan->channel_id);
506 sprintf(retBuf, "%d", amount);
507 chan->spam_settings->spam_amount = amount;
509 sprintf(retBuf, "%d", chan->spam_settings->spam_amount);
513 static char* neonspam_cmd_setscanops(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, int flag, char *charparam, char *argument, char *retBuf) {
517 while(neonspam_settings[i].setting) {
518 if(neonspam_settings[i].flags & SET_SCANOPS) {
520 value = ((chan->spam_settings->flags & neonspam_settings[i].intparam) ? 1 : 0);
522 if(((chan->spam_settings->flags & neonspam_settings[i].intparam) ? 1 : 0) != value) {
532 if(!strcmp(argument, "0") || !stricmp(argument, "off") || !stricmp(argument, get_language_string(user, "NS_SET_OFF"))) {
534 } else if(!strcmp(argument, "1") || !stricmp(argument, "on") || !stricmp(argument, get_language_string(user, "NS_SET_ON"))) {
537 reply(textclient, user, "NS_SET_INVALID_BOOLEAN", argument);
541 char valueBuf[MAXLEN];
542 while(neonspam_settings[i].setting) {
543 if(neonspam_settings[i].flags & SET_SCANOPS) {
544 neonspam_cmd_set_function *func = neonspam_settings[i].function;
545 func(client, textclient, user, chan, event, neonspam_settings[i].intparam, neonspam_settings[i].charparam, (value ? "1" : "0"), valueBuf);
551 if(identical && value)
553 if(identical && !value)
558 static char* neonspam_cmd_setscanvoice(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, int flag, char *charparam, char *argument, char *retBuf) {
562 while(neonspam_settings[i].setting) {
563 if(neonspam_settings[i].flags & SET_SCANVOICE) {
565 value = ((chan->spam_settings->flags & neonspam_settings[i].intparam) ? 1 : 0);
567 if(((chan->spam_settings->flags & neonspam_settings[i].intparam) ? 1 : 0) != value) {
577 if(!strcmp(argument, "0") || !stricmp(argument, "off") || !stricmp(argument, get_language_string(user, "NS_SET_OFF"))) {
579 } else if(!strcmp(argument, "1") || !stricmp(argument, "on") || !stricmp(argument, get_language_string(user, "NS_SET_ON"))) {
582 reply(textclient, user, "NS_SET_INVALID_BOOLEAN", argument);
586 char valueBuf[MAXLEN];
587 while(neonspam_settings[i].setting) {
588 if(neonspam_settings[i].flags & SET_SCANVOICE) {
589 neonspam_cmd_set_function *func = neonspam_settings[i].function;
590 func(client, textclient, user, chan, event, neonspam_settings[i].intparam, neonspam_settings[i].charparam, (value ? "1" : "0"), valueBuf);
596 if(identical && value)
598 if(identical && !value)
603 static char* neonspam_cmd_setscanexcept(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, int flag, char *charparam, char *argument, char *retBuf) {
607 while(neonspam_settings[i].setting) {
608 if(neonspam_settings[i].flags & SET_SCANEXCEPT) {
610 value = chan->spam_settings->exceptlevel[neonspam_settings[i].intparam];
612 if(chan->spam_settings->exceptlevel[neonspam_settings[i].intparam] != value) {
621 //numeric argument... (access)
622 int caccess = atoi(argument);
623 if(caccess < 0 || caccess > 501) {
624 reply(textclient, user, "NS_INVALID_ACCESS", caccess);
627 int uaccess = getChannelAccess(user, chan);
628 if(uaccess == 500) uaccess++;
629 if(identical && value > uaccess) {
630 if(isGodMode(user)) {
631 event->flags |= CMDFLAG_OPLOG;
633 reply(textclient, user, "NS_SET_CANNOT_SET");
637 if(caccess > uaccess) {
638 if(isGodMode(user)) {
639 event->flags |= CMDFLAG_OPLOG;
641 reply(textclient, user, "NS_SET_BADLEVEL");
646 char valueBuf[MAXLEN];
647 sprintf(retBuf, "%d", caccess);
648 while(neonspam_settings[i].setting) {
649 if(neonspam_settings[i].flags & SET_SCANEXCEPT) {
650 neonspam_cmd_set_function *func = neonspam_settings[i].function;
651 func(client, textclient, user, chan, event, neonspam_settings[i].intparam, neonspam_settings[i].charparam, retBuf, valueBuf);
659 sprintf(retBuf, "%d", value);