1 /* cmd_neonspam_set.c - NeonServ v5.1
2 * Copyright (C) 2011 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 UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *cvalue, char *argument);
21 static void neonspam_cmd_set_setting(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, int setting, char *argument);
22 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);
23 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);
24 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);
25 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);
26 static char* neonspam_cmd_setjoinfloodreaction(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *cvalue, char *argument);
27 static char* neonspam_cmd_setspamscan(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *cvalue, char *argument);
28 static char* neonspam_cmd_setfloodscan(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *cvalue, char *argument);
29 static char* neonspam_cmd_setjoinfloodscan(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *cvalue, char *argument);
30 static char* neonspam_cmd_setscanchanops(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *cvalue, char *argument);
31 static char* neonspam_cmd_setscanvoiced(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *cvalue, char *argument);
32 static char* neonspam_cmd_setexceptlevel(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *cvalue, char *argument);
33 static char* neonspam_cmd_setfloodsensibility(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *cvalue, char *argument);
34 static char* neonspam_cmd_setjoinsensibility(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *cvalue, char *argument);
36 #define NS_VALID_FUNCTION 0x01
37 #define NS_VALID_STRING 0x02
38 #define NS_VALID_ACCESS 0x04
39 #define NS_VALID_NO501 0x08
40 #define NS_VALID_OPTIONS 0x10
41 #define NS_VALID_NUMERIC 0x20
42 #define NS_VALID_BOOLEAN 0x40
44 #define NS_HAS_OPT 0x100 /* options (SET_OPTION_{NAME}_{VALUE}) */
45 #define NS_HAS_HELP 0x200 /* help (SET_HELP_{NAME}) - only shown if help is requested */
47 static MYSQL_ROW neonspam_settings_row, neonspam_settings_defaults;
48 #define SPAMSERV_SETTINGS_QUERY "`channel_scanstate`, `channel_scanexcept`, `channel_maxrepeat`, `channel_repeatreaction`, `channel_maxflood`, `channel_floodtime`, `channel_floodreaction`, `channel_maxjoin`, `channel_jointime`, `channel_joinreaction`"
49 #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"
53 const char *chanfield;
57 } neonspam_settings[] = {
58 {"Trigger", NULL, NS_VALID_FUNCTION, NULL, neonspam_cmd_set_trigger},
59 {"SpamLimit", NULL, NS_VALID_OPTIONS | NS_VALID_FUNCTION | NS_HAS_OPT, "5", neonspam_cmd_set_spamlimit},
60 {"SpamReaction", NULL, NS_VALID_OPTIONS | NS_VALID_FUNCTION | NS_HAS_OPT, "3", neonspam_cmd_set_spamreaction},
61 {"FloodReaction", NULL, NS_VALID_OPTIONS | NS_VALID_FUNCTION | NS_HAS_OPT, "3", neonspam_cmd_set_floodreaction},
62 {"JoinFloodReaction", NULL, NS_VALID_OPTIONS | NS_VALID_FUNCTION | NS_HAS_OPT, "3", neonspam_cmd_setjoinfloodreaction},
63 {"SpamScan", NULL, NS_VALID_BOOLEAN | NS_VALID_FUNCTION, NULL, neonspam_cmd_setspamscan},
64 {"FloodScan", NULL, NS_VALID_BOOLEAN | NS_VALID_FUNCTION, NULL, neonspam_cmd_setfloodscan},
65 {"JoinFloodScan", NULL, NS_VALID_BOOLEAN | NS_VALID_FUNCTION, NULL, neonspam_cmd_setjoinfloodscan},
66 {"ScanChanOps", NULL, NS_VALID_BOOLEAN | NS_VALID_FUNCTION, NULL, neonspam_cmd_setscanchanops},
67 {"ScanVoiced", NULL, NS_VALID_BOOLEAN | NS_VALID_FUNCTION, NULL, neonspam_cmd_setscanvoiced},
68 {"ExceptLevel", NULL, NS_VALID_ACCESS | NS_VALID_FUNCTION, NULL, neonspam_cmd_setexceptlevel},
69 {"FloodSensibility", NULL, NS_VALID_FUNCTION, NULL, neonspam_cmd_setfloodsensibility},
70 {"JoinSensibility", NULL, NS_VALID_FUNCTION, NULL, neonspam_cmd_setjoinsensibility},
74 #define MAX_QUERY_LEN 1024
75 CMD_BIND(neonspam_cmd_set) {
77 if(argc && !strcmp(argv[0], "defaults")) {
78 //reset channel settings
79 int uaccess = getChannelAccess(user, chan, 0);
82 event->flags |= CMDFLAG_OPLOG;
84 reply(getTextBot(), user, "NS_SET_DEFAULTS_OWNER", chan->name);
90 static char defaultskey[16];
91 for(tmp = user->auth; *tmp; tmp++)
92 seed = (seed * 0xEECE66DL ^ ((*tmp << 24) | (*tmp << 16) | (*tmp << 8) | *tmp));
93 for(tmp = chan->name; *tmp; tmp++)
94 seed = (seed * 0xEECE66DL ^ ((*tmp << 24) | (*tmp << 16) | (*tmp << 8) | *tmp));
95 sprintf(defaultskey, "%08x", seed);
96 if(argc > 1 && !strcmp(argv[1], defaultskey)) {
97 printf_mysql_query("UPDATE `channels` SET " SPAMSERV_SETTINGS_RESET " WHERE `channel_id` = '%d'", chan->channel_id);
98 reply(getTextBot(), user, "NS_SET_DEFAULTS_DONE", chan->name);
101 reply(getTextBot(), user, "NS_SET_DEFAULTS_CODE", chan->name, defaultskey);
103 } else if(argc && strcmp(argv[0], "help")) {
104 //find the correct command
107 char *args = (argc > 1 ? merge_argv(argv, 1, argc) : NULL);
108 while(neonspam_settings[i].setting) {
109 if(!stricmp(neonspam_settings[i].setting, argv[0])) {
111 neonspam_cmd_set_setting(client, user, chan, event, i, args);
119 reply(getTextBot(), user, "NS_SET_UNKNOWN_SETTING", argv[0]);
122 char *value, *org_value, *tmp, nameBuf[64];
123 MYSQL_RES *res, *defaults_res;
129 while(neonspam_settings[i].setting)
131 table = table_init(2, i, 0);
132 table_set_bold(table, 0, 1);
133 printf_mysql_query("SELECT " SPAMSERV_SETTINGS_QUERY " FROM `channels` WHERE `channel_name` = 'defaults'");
134 defaults_res = mysql_use();
135 neonspam_settings_defaults = mysql_fetch_row(defaults_res);
136 printf_mysql_query("SELECT " SPAMSERV_SETTINGS_QUERY " FROM `channels` WHERE `channel_id` = '%d'", chan->channel_id);
138 neonspam_settings_row = mysql_fetch_row(res);
141 reply(getTextBot(), user, "NS_SET_HEADER", chan->name);
142 while(neonspam_settings[i].setting) {
143 char valueBuf[MAXLEN];
144 if(neonspam_settings[i].valid & NS_VALID_FUNCTION) {
145 neonspam_cmd_set_function *func = neonspam_settings[i].function;
146 org_value = func(client, user, chan, event, NULL, NULL, valueBuf);
150 if(neonspam_settings[i].valid & NS_VALID_BOOLEAN) {
151 if(!strcmp(value, "0"))
152 value = get_language_string(user, "NS_SET_OFF");
154 value = get_language_string(user, "NS_SET_ON");
156 strcpy(query, value);
157 querypos = strlen(query);
158 if(neonspam_settings[i].valid & NS_HAS_OPT) {
159 sprintf(nameBuf, "NS_SET_OPTION_%s_%s", neonspam_settings[i].setting, org_value);
160 tmp = get_language_string(user, nameBuf);
162 querypos += sprintf(query+querypos, " - %s", tmp);
165 if(argc && neonspam_settings[i].valid & NS_HAS_HELP) {
166 sprintf(nameBuf, "NS_SET_HELP_%s", neonspam_settings[i].setting);
167 tmp = get_language_string(user, nameBuf);
169 querypos += sprintf(query+querypos, " - %s", tmp);
172 content[0] = (char*)neonspam_settings[i].setting;
174 table_add(table, content);
177 char **table_lines = table_end(table);
178 for(i = 0; i < table->entrys; i++) {
179 reply(getTextBot(), user, table_lines[i]);
185 static void neonspam_cmd_set_setting(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, int setting, char *args) {
187 char valueBuf[MAXLEN];
191 printf_mysql_query("SELECT " SPAMSERV_SETTINGS_QUERY " FROM `channels` WHERE `channel_id` = '%d'", chan->channel_id);
193 neonspam_settings_row = mysql_fetch_row(res);
194 printf_mysql_query("SELECT " SPAMSERV_SETTINGS_QUERY " FROM `channels` WHERE `channel_name` = 'defaults'");
196 neonspam_settings_defaults = mysql_fetch_row(res);
197 if(neonspam_settings[setting].valid & NS_VALID_FUNCTION) {
198 neonspam_cmd_set_function *func = neonspam_settings[setting].function;
199 if(!(value = func(client, user, chan, event, NULL, NULL, valueBuf)))
204 //change the channel setting
205 //check the new argument
206 int valid = neonspam_settings[setting].valid;
207 if(valid & NS_VALID_STRING) {
208 if(!strcmp(args, "*")) {
212 if(valid & NS_VALID_ACCESS) {
213 int caccess = atoi(args);
214 int max = ((valid & NS_VALID_NO501) ? 500 : 501);
215 if(caccess < 0 || caccess > max) {
216 reply(getTextBot(), user, "NS_INVALID_ACCESS", caccess);
219 int uaccess = getChannelAccess(user, chan, 0);
220 if(uaccess == 500) uaccess++;
221 if(atoi(value) > uaccess) {
222 if(isGodMode(user)) {
223 event->flags |= CMDFLAG_OPLOG;
225 reply(getTextBot(), user, "NS_SET_CANNOT_SET");
229 if(caccess > uaccess) {
230 if(isGodMode(user)) {
231 event->flags |= CMDFLAG_OPLOG;
233 reply(getTextBot(), user, "NS_SET_BADLEVEL");
237 sprintf(nameBuf, "%d", caccess);
240 if(valid & NS_VALID_OPTIONS) {
241 int options = atoi((char *) neonspam_settings[setting].parameter);
242 int coption = atoi(args);
243 if(coption < 0 || coption >= options) {
244 reply(getTextBot(), user, "NS_SET_INVALID_OPTION", coption);
247 if(valid & NS_HAS_OPT) {
248 for(i = 0; i < options; i++) {
249 sprintf(nameBuf, "NS_SET_OPTION_%s_%d", neonspam_settings[setting].setting, i);
250 reply(getTextBot(), user, "\002%d\002 - %s", i, get_language_string(user, nameBuf));
253 for(i = 0; i < options; i++) {
254 nameBufPos += sprintf(nameBuf + nameBufPos, "\002%d\002, ", i);
257 nameBuf[nameBufPos-2] = '\0';
258 reply(getTextBot(), user, nameBuf);
264 if(valid & NS_VALID_NUMERIC) {
265 sprintf(nameBuf, "%d", atoi(args));
268 if(valid & NS_VALID_BOOLEAN) {
269 if(!strcmp(args, "0") || !stricmp(args, "off") || !stricmp(args, get_language_string(user, "NS_SET_OFF"))) {
271 } else if(!strcmp(args, "1") || !stricmp(args, "on") || !stricmp(args, get_language_string(user, "NS_SET_ON"))) {
274 reply(getTextBot(), user, "NS_SET_INVALID_BOOLEAN", args);
279 if(valid & NS_VALID_FUNCTION) {
280 neonspam_cmd_set_function *func = neonspam_settings[setting].function;
281 strcpy(valueBuf, value);
282 if(!(value = func(client, user, chan, event, neonspam_settings[setting].setting, valueBuf, args)))
286 reply(getTextBot(), user, "\002%s\002 %s", neonspam_settings[setting].setting, value);
287 if(neonspam_settings[setting].valid & NS_HAS_HELP) {
288 sprintf(nameBuf, "NS_SET_HELP_%s", neonspam_settings[setting].setting);
289 reply(getTextBot(), user, " %s", get_language_string(user, nameBuf));
293 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) {
295 //get current trigger
298 printf_mysql_query("SELECT `trigger` FROM `bot_channels` WHERE `chanid` = '%d' AND `botid` = '%d'", chan->channel_id, client->clientid);
300 row = mysql_fetch_row(res);
302 if(cvalue && argument) {
303 int uaccess = getChannelAccess(user, chan, 0);
305 if(isGodMode(user)) {
306 event->flags |= CMDFLAG_OPLOG;
308 reply(getTextBot(), user, "NS_SET_TRIGGER_OWNER", chan->name);
312 if(strlen(argument) > 15)
314 printf_mysql_query("UPDATE `bot_channels` SET `trigger` = '%s' WHERE `chanid` = '%d' AND `botid` = '%d'", escape_string(argument), chan->channel_id, client->clientid);
316 changeChannelTrigger(client->botid, chan, trigger);
322 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) {
325 cvalue = (neonspam_settings_row[2] ? neonspam_settings_row[2] : neonspam_settings_defaults[2]);
329 printf_mysql_query("UPDATE `channels` SET `channel_maxrepeat` = '%d' WHERE `channel_id` = '%d' ", atoi(argument), chan->channel_id);
330 sprintf(cvalue, "%d", atoi(argument));
335 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) {
338 cvalue = (neonspam_settings_row[3] ? neonspam_settings_row[3] : neonspam_settings_defaults[3]);
342 printf_mysql_query("UPDATE `channels` SET `channel_repeatreaction` = '%d' WHERE `channel_id` = '%d' ", atoi(argument), chan->channel_id);
343 sprintf(cvalue, "%d", atoi(argument));
348 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) {
351 cvalue = (neonspam_settings_row[6] ? neonspam_settings_row[6] : neonspam_settings_defaults[6]);
355 printf_mysql_query("UPDATE `channels` SET `channel_floodreaction` = '%d' WHERE `channel_id` = '%d' ", atoi(argument), chan->channel_id);
356 sprintf(cvalue, "%d", atoi(argument));
361 static char* neonspam_cmd_setjoinfloodreaction(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *cvalue, char *argument) {
364 cvalue = (neonspam_settings_row[9] ? neonspam_settings_row[9] : neonspam_settings_defaults[9]);
368 printf_mysql_query("UPDATE `channels` SET `channel_joinreaction` = '%d' WHERE `channel_id` = '%d' ", atoi(argument), chan->channel_id);
369 sprintf(cvalue, "%d", atoi(argument));
374 static char* neonspam_cmd_setspamscan(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *cvalue, char *argument) {
377 cvalue = ((atoi(neonspam_settings_row[0] ? neonspam_settings_row[0] : neonspam_settings_defaults[0]) & SPAMSETTINGS_SPAMSCAN) ? "1" : "0");
381 int cflags = atoi((neonspam_settings_row[0] ? neonspam_settings_row[0] : neonspam_settings_defaults[0]));
382 if(!strcmp(argument, "0"))
383 cflags &= ~SPAMSETTINGS_SPAMSCAN;
385 cflags |= SPAMSETTINGS_SPAMSCAN;
386 printf_mysql_query("UPDATE `channels` SET `channel_scanstate` = '%d' WHERE `channel_id` = '%d' ", cflags, chan->channel_id);
392 static char* neonspam_cmd_setfloodscan(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *cvalue, char *argument) {
395 cvalue = ((atoi(neonspam_settings_row[0] ? neonspam_settings_row[0] : neonspam_settings_defaults[0]) & SPAMSETTINGS_FLOODSCAN) ? "1" : "0");
399 int cflags = atoi((neonspam_settings_row[0] ? neonspam_settings_row[0] : neonspam_settings_defaults[0]));
400 if(!strcmp(argument, "0"))
401 cflags &= ~SPAMSETTINGS_FLOODSCAN;
403 cflags |= SPAMSETTINGS_FLOODSCAN;
404 printf_mysql_query("UPDATE `channels` SET `channel_scanstate` = '%d' WHERE `channel_id` = '%d' ", cflags, chan->channel_id);
410 static char* neonspam_cmd_setjoinfloodscan(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *cvalue, char *argument) {
413 cvalue = ((atoi(neonspam_settings_row[0] ? neonspam_settings_row[0] : neonspam_settings_defaults[0]) & SPAMSETTINGS_JOINSCAN) ? "1" : "0");
417 int cflags = atoi((neonspam_settings_row[0] ? neonspam_settings_row[0] : neonspam_settings_defaults[0]));
418 if(!strcmp(argument, "0"))
419 cflags &= ~SPAMSETTINGS_JOINSCAN;
421 cflags |= SPAMSETTINGS_JOINSCAN;
422 printf_mysql_query("UPDATE `channels` SET `channel_scanstate` = '%d' WHERE `channel_id` = '%d' ", cflags, chan->channel_id);
428 static char* neonspam_cmd_setscanchanops(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *cvalue, char *argument) {
431 cvalue = ((atoi(neonspam_settings_row[0] ? neonspam_settings_row[0] : neonspam_settings_defaults[0]) & SPAMSETTINGS_SCANOPS) ? "1" : "0");
435 int cflags = atoi((neonspam_settings_row[0] ? neonspam_settings_row[0] : neonspam_settings_defaults[0]));
436 if(!strcmp(argument, "0"))
437 cflags &= ~SPAMSETTINGS_SCANOPS;
439 cflags |= SPAMSETTINGS_SCANOPS;
440 printf_mysql_query("UPDATE `channels` SET `channel_scanstate` = '%d' WHERE `channel_id` = '%d' ", cflags, chan->channel_id);
446 static char* neonspam_cmd_setscanvoiced(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *cvalue, char *argument) {
449 cvalue = ((atoi(neonspam_settings_row[0] ? neonspam_settings_row[0] : neonspam_settings_defaults[0]) & SPAMSETTINGS_SCANVOICE) ? "1" : "0");
453 int cflags = atoi((neonspam_settings_row[0] ? neonspam_settings_row[0] : neonspam_settings_defaults[0]));
454 if(!strcmp(argument, "0"))
455 cflags &= ~SPAMSETTINGS_SCANVOICE;
457 cflags |= SPAMSETTINGS_SCANVOICE;
458 printf_mysql_query("UPDATE `channels` SET `channel_scanstate` = '%d' WHERE `channel_id` = '%d' ", cflags, chan->channel_id);
464 static char* neonspam_cmd_setexceptlevel(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *cvalue, char *argument) {
467 cvalue = (neonspam_settings_row[1] ? neonspam_settings_row[1] : neonspam_settings_defaults[1]);
471 printf_mysql_query("UPDATE `channels` SET `channel_scanexcept` = '%d' WHERE `channel_id` = '%d' ", atoi(argument), chan->channel_id);
472 sprintf(cvalue, "%d", atoi(argument));
477 static char* neonspam_cmd_setfloodsensibility(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *cvalue, char *argument) {
480 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]));
485 char *delimiter = strstr(argument, ":");
492 int amount = atoi(argument);
493 int timep = atoi(delimiter);
494 if(amount > MAX_FLOOD_AMOUNT || amount < MIN_FLOOD_AMOUNT) {
498 if(timep > MAX_FLOOD_TIME || timep < 0) {
499 //invalid time period
502 printf_mysql_query("UPDATE `channels` SET `channel_maxflood` = '%d', `channel_floodtime` = '%d' WHERE `channel_id` = '%d' ", amount, timep, chan->channel_id);
503 sprintf(cvalue, "%d:%d", amount, timep);
508 static char* neonspam_cmd_setjoinsensibility(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *cvalue, char *argument) {
511 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]));
516 char *delimiter = strstr(argument, ":");
523 int amount = atoi(argument);
524 int timep = atoi(delimiter);
525 if(amount > MAX_JOIN_AMOUNT || amount < MIN_JOIN_AMOUNT) {
529 if(timep > MAX_JOIN_TIME || timep < 0) {
530 //invalid time period
533 printf_mysql_query("UPDATE `channels` SET `channel_maxjoin` = '%d', `channel_jointime` = '%d' WHERE `channel_id` = '%d' ", amount, timep, chan->channel_id);
534 sprintf(cvalue, "%d:%d", amount, timep);