fixed cmd_neonserv_set trigger mysql query
[NeonServV5.git] / src / modules / NeonServ.mod / cmd_neonserv_set.c
index ec21e44c6ef6113a06a08b3114be3b30793e1650..692823e09d1e5dc4ff3dc9a15c7b0e6591a151bb 100644 (file)
@@ -1,4 +1,4 @@
-/* cmd_neonserv_set.c - NeonServ v5.3
+/* 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
 
 #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;
@@ -451,10 +482,10 @@ static char* neonserv_cmd_set_nodelete(struct ClientSocket *client, struct UserN
         //change the channel setting
         if(!strcmp(argument, "0") || !strcmp(argument, "off") || !strcmp(argument, get_language_string(user, "NS_SET_OFF"))) {
             argument = "0";
-        } else if(!strcmp(argument, "0") || !strcmp(argument, "off") || !strcmp(argument, get_language_string(user, "NS_SET_OFF"))) {
+        } 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