X-Git-Url: http://git.pk910.de/?a=blobdiff_plain;f=src%2Fmodules%2FNeonServ.mod%2Fcmd_neonserv_set.c;h=692823e09d1e5dc4ff3dc9a15c7b0e6591a151bb;hb=95bd28ec51fedaf57a7a9d65475c021569cef755;hp=2ebb96828dac0eac072e9b28359b17967d30d422;hpb=2e12c97bb38cb3d59e7dc38c958a981d8242e28a;p=NeonServV5.git diff --git a/src/modules/NeonServ.mod/cmd_neonserv_set.c b/src/modules/NeonServ.mod/cmd_neonserv_set.c index 2ebb968..692823e 100644 --- a/src/modules/NeonServ.mod/cmd_neonserv_set.c +++ b/src/modules/NeonServ.mod/cmd_neonserv_set.c @@ -1,4 +1,4 @@ -/* cmd_neonserv_set.c - NeonServ v5.4 +/* cmd_neonserv_set.c - NeonServ v5.6 * Copyright (C) 2011-2012 Philipp Kreil (pk910) * * This program is free software: you can redistribute it and/or modify @@ -17,12 +17,13 @@ #include "cmd_neonserv.h" -typedef char* neonserv_cmd_set_function(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *argument); -static void neonserv_cmd_set_setting(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, int setting, char *argument); -static char* neonserv_cmd_set_trigger(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *argument); -static char* neonserv_cmd_set_modes(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *argument); -static char* neonserv_cmd_set_dynlimit(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *argument); -static char* neonserv_cmd_set_nodelete(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *argument); +typedef char* neonserv_cmd_set_function(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *argument); +static void neonserv_cmd_set_setting(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, int setting, char *argument); +static char* neonserv_cmd_set_trigger(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *argument); +static char* neonserv_cmd_set_modes(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *argument); +static char* neonserv_cmd_set_dynlimit(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *argument); +static char* neonserv_cmd_set_nodelete(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *argument); +static char* neonserv_cmd_set_backupbot(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *argument); #define NS_VALID_FUNCTION 0x01 #define NS_VALID_STRING 0x02 @@ -80,6 +81,7 @@ static const struct { {"TOYS", "channel_toys", NS_VALID_OPTIONS | NS_HAS_OPT, "3"}, {"DYNLIMIT", "channel_dynlimit", NS_VALID_NUMERIC | NS_VALID_FUNCTION | NS_HAS_OPT, neonserv_cmd_set_dynlimit}, {"NODELETE", "channel_nodelete", NS_VALID_BOOLEAN | NS_VALID_FUNCTION, neonserv_cmd_set_nodelete}, + {"BACKUPBOT", NULL, NS_VALID_BOOLEAN | NS_VALID_FUNCTION, neonserv_cmd_set_backupbot}, {NULL, NULL, 0, NULL} }; @@ -93,7 +95,7 @@ CMD_BIND(neonserv_cmd_set) { if(isGodMode(user)) { event->flags |= CMDFLAG_OPLOG; } else { - reply(getTextBot(), user, "NS_SET_DEFAULTS_OWNER", chan->name); + reply(textclient, user, "NS_SET_DEFAULTS_OWNER", chan->name); return; } } @@ -118,10 +120,10 @@ CMD_BIND(neonserv_cmd_set) { query[querypos-2] = '\0'; } printf_mysql_query("UPDATE `channels` SET %s WHERE `channel_id` = '%d'", query, chan->channel_id); - reply(getTextBot(), user, "NS_SET_DEFAULTS_DONE", chan->name); + reply(textclient, user, "NS_SET_DEFAULTS_DONE", chan->name); logEvent(event); } else { - reply(getTextBot(), user, "NS_SET_DEFAULTS_CODE", chan->name, defaultskey); + reply(textclient, user, "NS_SET_DEFAULTS_CODE", chan->name, defaultskey); } } else if(argc && strcmp(argv[0], "help")) { //find the correct command @@ -132,11 +134,19 @@ CMD_BIND(neonserv_cmd_set) { while(channel_settings[i].setting) { if(!stricmp(channel_settings[i].setting, argv[0]) && (!(channel_settings[i].valid & NS_VALID_IF_HALFOP) || with_halfops)) { //setting found + if(!stricmp(channel_settings[i].setting, "BACKUPBOT")) { + char setting[128]; + sprintf(setting, "modules.%s.channel_backup_setting", get_module_name(module_id)); + if(!get_int_field(setting)) { + i++; + continue; + } + } if(channel_settings[i].valid & NS_VALID_FUNCTION) { neonserv_cmd_set_function *func = channel_settings[i].parameter; - func(client, user, chan, event, channel_settings[i].setting, args); + func(client, textclient, user, chan, event, channel_settings[i].setting, args); } else { - neonserv_cmd_set_setting(client, user, chan, event, i, args); + neonserv_cmd_set_setting(client, textclient, user, chan, event, i, args); } j = 1; break; @@ -145,7 +155,7 @@ CMD_BIND(neonserv_cmd_set) { } if(j == 0) { //unknown setting - reply(getTextBot(), user, "NS_SET_UNKNOWN_SETTING", argv[0]); + reply(textclient, user, "NS_SET_UNKNOWN_SETTING", argv[0]); } } else { char query[MAX_QUERY_LEN], *value, *org_value, *tmp, nameBuf[64]; @@ -155,6 +165,7 @@ CMD_BIND(neonserv_cmd_set) { struct Table *table; char *content[2]; int with_halfops = get_int_field("General.have_halfop"); + int channel_backup_setting; i = 0; j = 0; while(channel_settings[i].setting) { @@ -163,6 +174,16 @@ CMD_BIND(neonserv_cmd_set) { i++; continue; } + if(!stricmp(channel_settings[i].setting, "BACKUPBOT")) { + char setting[128]; + sprintf(setting, "modules.%s.channel_backup_setting", get_module_name(module_id)); + channel_backup_setting = get_int_field(setting); + if(!channel_backup_setting) { + i++; + j++; + continue; + } + } if(channel_settings[i].chanfield) querypos += sprintf(query + querypos, ", `%s`", channel_settings[i].chanfield); i++; @@ -177,18 +198,22 @@ CMD_BIND(neonserv_cmd_set) { row = mysql_fetch_row(res); i = 0; j = 0; - reply(getTextBot(), user, "NS_SET_HEADER", chan->name); + reply(textclient, user, "NS_SET_HEADER", chan->name); while(channel_settings[i].setting) { if((channel_settings[i].valid & NS_VALID_IF_HALFOP) && !with_halfops) { i++; continue; } + if(!stricmp(channel_settings[i].setting, "BACKUPBOT") && !channel_backup_setting) { + i++; + continue; + } if(channel_settings[i].chanfield) { j++; org_value = (row[j] ? row[j] : defaults[j]); } else if(channel_settings[i].valid & NS_VALID_FUNCTION) { neonserv_cmd_set_function *func = channel_settings[i].parameter; - org_value = func(client, user, chan, event, NULL, NULL); + org_value = func(client, textclient, user, chan, event, NULL, NULL); } else org_value = "0"; value = org_value; @@ -221,13 +246,13 @@ CMD_BIND(neonserv_cmd_set) { } char **table_lines = table_end(table); for(i = 0; i < table->entrys; i++) { - reply(getTextBot(), user, table_lines[i]); + reply(textclient, user, table_lines[i]); } table_free(table); } } -static void neonserv_cmd_set_setting(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, int setting, char *args) { +static void neonserv_cmd_set_setting(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, int setting, char *args) { char *value; char nameBuf[64]; //get current value @@ -255,7 +280,7 @@ static void neonserv_cmd_set_setting(struct ClientSocket *client, struct UserNod int caccess = atoi(args); int max = ((valid & NS_VALID_NO501) ? 500 : 501); if(caccess < 0 || caccess > max) { - reply(getTextBot(), user, "NS_INVALID_ACCESS", caccess); + reply(textclient, user, "NS_INVALID_ACCESS", caccess); return; } int uaccess = getChannelAccess(user, chan); @@ -264,7 +289,7 @@ static void neonserv_cmd_set_setting(struct ClientSocket *client, struct UserNod if(isGodMode(user)) { event->flags |= CMDFLAG_OPLOG; } else { - reply(getTextBot(), user, "NS_SET_CANNOT_SET"); + reply(textclient, user, "NS_SET_CANNOT_SET"); return; } } @@ -272,7 +297,7 @@ static void neonserv_cmd_set_setting(struct ClientSocket *client, struct UserNod if(isGodMode(user)) { event->flags |= CMDFLAG_OPLOG; } else { - reply(getTextBot(), user, "NS_SET_BADLEVEL"); + reply(textclient, user, "NS_SET_BADLEVEL"); return; } } @@ -283,13 +308,13 @@ static void neonserv_cmd_set_setting(struct ClientSocket *client, struct UserNod int options = atoi((char *) channel_settings[setting].parameter); int coption = atoi(args); if(coption < 0 || coption >= options) { - reply(getTextBot(), user, "NS_SET_INVALID_OPTION", coption); + reply(textclient, 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", channel_settings[setting].setting, i); - reply(getTextBot(), user, "\002%d\002 - %s", i, get_language_string(user, nameBuf)); + reply(textclient, user, "\002%d\002 - %s", i, get_language_string(user, nameBuf)); } } else { for(i = 0; i < options; i++) { @@ -297,7 +322,7 @@ static void neonserv_cmd_set_setting(struct ClientSocket *client, struct UserNod } if(nameBufPos) { nameBuf[nameBufPos-2] = '\0'; - reply(getTextBot(), user, nameBuf); + reply(textclient, user, nameBuf); } } return; @@ -313,7 +338,7 @@ static void neonserv_cmd_set_setting(struct ClientSocket *client, struct UserNod } 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); + reply(textclient, user, "NS_SET_INVALID_BOOLEAN", args); return; } } @@ -326,23 +351,26 @@ static void neonserv_cmd_set_setting(struct ClientSocket *client, struct UserNod sprintf(nameBuf, "NS_SET_OPTION_%s_%s", channel_settings[setting].setting, value); char *tmp = get_language_string(user, nameBuf); if(tmp) - reply(getTextBot(), user, "\002%s\002 %s - %s", channel_settings[setting].setting, value, tmp); + reply(textclient, user, "\002%s\002 %s - %s", channel_settings[setting].setting, value, tmp); else - reply(getTextBot(), user, "\002%s\002 %s", channel_settings[setting].setting, value); + reply(textclient, user, "\002%s\002 %s", channel_settings[setting].setting, value); } else - reply(getTextBot(), user, "\002%s\002 %s", channel_settings[setting].setting, value); + reply(textclient, user, "\002%s\002 %s", channel_settings[setting].setting, value); if(channel_settings[setting].valid & NS_HAS_HELP) { sprintf(nameBuf, "NS_SET_HELP_%s", channel_settings[setting].setting); - reply(getTextBot(), user, " %s", get_language_string(user, nameBuf)); + reply(textclient, user, " %s", get_language_string(user, nameBuf)); } } -static char* neonserv_cmd_set_trigger(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *argument) { +static char* neonserv_cmd_set_trigger(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *argument) { char *trigger; //get current trigger MYSQL_RES *res; MYSQL_ROW row; - 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); + if(client->botid) + printf_mysql_query("SELECT `trigger`, `defaulttrigger`, `bot_channels`.`id` FROM `bot_channels` LEFT JOIN `bots` ON `botid` = `bots`.`id` WHERE `chanid` = '%d' AND `botclass` = '%d'", chan->channel_id, client->botid); + else + printf_mysql_query("SELECT `trigger`, `defaulttrigger`, `bot_channels`.`id` FROM `bot_channels` LEFT JOIN `bots` ON `botid` = `bots`.`id` WHERE `chanid` = '%d' AND `botid` = '%d'", chan->channel_id, client->clientid); res = mysql_use(); row = mysql_fetch_row(res); trigger = (row[0] ? row[0] : row[1]); @@ -352,24 +380,27 @@ static char* neonserv_cmd_set_trigger(struct ClientSocket *client, struct UserNo if(isGodMode(user)) { event->flags |= CMDFLAG_OPLOG; } else { - reply(getTextBot(), user, "NS_SET_TRIGGER_OWNER", chan->name); + reply(textclient, user, "NS_SET_TRIGGER_OWNER", chan->name); return NULL; } } if(strlen(argument) > 15) argument[15] = '\0'; - printf_mysql_query("UPDATE `bot_channels` SET `trigger` = '%s' WHERE `chanid` = '%d' AND `botid` = '%d'", escape_string(argument), chan->channel_id, client->clientid); + printf_mysql_query("UPDATE `bot_channels` SET `trigger` = '%s' WHERE `id` = '%d'", escape_string(argument), row[2]); trigger = argument; - changeChannelTrigger(client->botid, chan, trigger); + if(client->botid) + changeChannelTrigger(client->botid, chan, trigger); + else + changeBotwiseChannelTrigger(client->botid, client->clientid, chan, trigger); logEvent(event); } if(setting) { - reply(getTextBot(), user, "\002%s\002 %s", setting, trigger); + reply(textclient, user, "\002%s\002 %s", setting, trigger); } return trigger; } -static char* neonserv_cmd_set_modes(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *argument) { +static char* neonserv_cmd_set_modes(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *argument) { char *value; char valueBuf[MAXLEN]; //get current value @@ -395,12 +426,12 @@ static char* neonserv_cmd_set_modes(struct ClientSocket *client, struct UserNode freeModeNode(modenode); } if(setting) { - reply(getTextBot(), user, "\002%s\002 %s", setting, value); + reply(textclient, user, "\002%s\002 %s", setting, value); } return value; } -static char* neonserv_cmd_set_dynlimit(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *argument) { +static char* neonserv_cmd_set_dynlimit(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *argument) { char *value; char tmp[64]; //get current value @@ -428,12 +459,12 @@ static char* neonserv_cmd_set_dynlimit(struct ClientSocket *client, struct UserN logEvent(event); } if(setting) { - reply(getTextBot(), user, "\002%s\002 %s", setting, value); + reply(textclient, user, "\002%s\002 %s", setting, value); } return value; } -static char* neonserv_cmd_set_nodelete(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *argument) { +static char* neonserv_cmd_set_nodelete(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *argument) { char *value; //get current value MYSQL_RES *res; @@ -454,7 +485,7 @@ static char* neonserv_cmd_set_nodelete(struct ClientSocket *client, struct UserN } else if(!strcmp(argument, "1") || !strcmp(argument, "on") || !strcmp(argument, get_language_string(user, "NS_SET_ON"))) { argument = "1"; } else { - reply(getTextBot(), user, "NS_SET_INVALID_BOOLEAN", argument); + reply(textclient, user, "NS_SET_INVALID_BOOLEAN", argument); return NULL; } printf_mysql_query("UPDATE `channels` SET `channel_nodelete` = '%s' WHERE `channel_id` = '%d'", escape_string(argument), chan->channel_id); @@ -463,9 +494,43 @@ static char* neonserv_cmd_set_nodelete(struct ClientSocket *client, struct UserN logEvent(event); } if(setting) { - reply(getTextBot(), user, "\002%s\002 %s", setting, value); + reply(textclient, user, "\002%s\002 %s", setting, value); } return value; } +static char* neonserv_cmd_set_backupbot(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *argument) { + int backupbot; + //get current trigger + MYSQL_RES *res; + printf_mysql_query("SELECT `botid` FROM `bot_channels` LEFT JOIN `bots` ON `botid` = `bots`.`id` WHERE `chanid` = '%d' AND `botclass` = '%d'", chan->channel_id, NEONBACKUP_BOTID); + res = mysql_use(); + if(mysql_fetch_row(res)) + backupbot = 1; + else + backupbot = 0; + if(argument) { + //change the channel setting + if(!strcmp(argument, "0") || !strcmp(argument, "off") || !strcmp(argument, get_language_string(user, "NS_SET_OFF"))) { + if(backupbot) { + module_global_cmd_unregister_neonbackup(chan->name); + backupbot = 0; + } + } else if(!strcmp(argument, "1") || !strcmp(argument, "on") || !strcmp(argument, get_language_string(user, "NS_SET_ON"))) { + if(!backupbot) { + module_global_cmd_register_neonbackup(chan->name); + backupbot = 1; + } + } else { + reply(textclient, user, "NS_SET_INVALID_BOOLEAN", argument); + return NULL; + } + logEvent(event); + } + if(setting) { + reply(textclient, user, "\002%s\002 %s", setting, (backupbot ? "1" : "0")); + } + return (backupbot ? "1" : "0"); +} + #undef MAX_QUERY_LEN