changed Makefile; build all commands as an own file
[NeonServV5.git] / cmd_neonserv_set.c
index 2ab296fddd77d07e12ee1e36c69e720eb645f3a2..2801be765045d28d4f21bb40f560b1f7c911b308 100644 (file)
@@ -1,10 +1,12 @@
 
-typedef char* neonserv_cmd_set_function(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, char *setting, char *argument);
-static char* neonserv_cmd_set_setting(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, char *setting, char *argument);
-static char* neonserv_cmd_set_trigger(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, char *setting, char *argument);
-static char* neonserv_cmd_set_modes(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, char *setting, char *argument);
-static char* neonserv_cmd_set_dynlimit(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, char *setting, char *argument);
-static char* neonserv_cmd_set_nodelete(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, char *setting, char *argument);
+#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);
 
 #define NS_VALID_FUNCTION 0x01
 #define NS_VALID_STRING   0x02
@@ -26,30 +28,31 @@ static const struct {
     {"TRIGGER",         NULL,                   NS_VALID_FUNCTION,                  neonserv_cmd_set_trigger},
     {"DEFAULTTOPIC",    "channel_defaulttopic", NS_VALID_STRING,                    NULL},
     {"TOPICMASK",       "channel_topicmask",    NS_VALID_STRING,                    NULL},
+    {"ADVANCEDTOPIC",   "channel_exttopic",     NS_VALID_BOOLEAN | NS_HAS_OPT,      NULL},
     {"GREETING",        "channel_greeting",     NS_VALID_STRING,                    NULL},
     {"USERGREETING",    "channel_usergreeting", NS_VALID_STRING,                    NULL},
-    {"USERINFO",        "channel_userinfo",     NS_VALID_ACCESS,                    NULL},
-    {"WIPEINFO",        "channel_wipeinfo",     NS_VALID_ACCESS,                    NULL},
+    {"USERINFO",        "channel_userinfo",     NS_VALID_ACCESS | NS_HAS_HELP,      NULL},
+    {"WIPEINFO",        "channel_wipeinfo",     NS_VALID_ACCESS | NS_HAS_HELP,      NULL},
     {"MODES",           "channel_modes",        NS_VALID_FUNCTION,                  neonserv_cmd_set_modes},
     {"INVITEME",        "channel_getinvite",    NS_VALID_ACCESS,                    NULL},
-    {"GIVEOPS",         "channel_getop",        NS_VALID_ACCESS,                    NULL},
-    {"GIVEVOICE",       "channel_getvoice",     NS_VALID_ACCESS,                    NULL},
-    {"ENFOPS",          "channel_canop",        NS_VALID_ACCESS,                    NULL},
-    {"ENFVOICE",        "channel_canvoice",     NS_VALID_ACCESS,                    NULL},
-    {"KICK",            "channel_cankick",      NS_VALID_ACCESS,                    NULL},
-    {"BAN",             "channel_canban",       NS_VALID_ACCESS,                    NULL},
-    {"STATICBAN",       "channel_staticban",    NS_VALID_ACCESS,                    NULL},
+    {"GIVEOPS",         "channel_getop",        NS_VALID_ACCESS | NS_HAS_HELP,      NULL},
+    {"GIVEVOICE",       "channel_getvoice",     NS_VALID_ACCESS | NS_HAS_HELP,      NULL},
+    {"ENFOPS",          "channel_canop",        NS_VALID_ACCESS | NS_HAS_HELP,      NULL},
+    {"ENFVOICE",        "channel_canvoice",     NS_VALID_ACCESS | NS_HAS_HELP,      NULL},
+    {"KICK",            "channel_cankick",      NS_VALID_ACCESS | NS_HAS_HELP,      NULL},
+    {"BAN",             "channel_canban",       NS_VALID_ACCESS | NS_HAS_HELP,      NULL},
+    {"STATICBAN",       "channel_staticban",    NS_VALID_ACCESS | NS_HAS_HELP,      NULL},
     {"PUBCMD",          "channel_pubcmd",       NS_VALID_ACCESS,                    NULL},
     {"ENFMODES",        "channel_enfmodes",     NS_VALID_ACCESS,                    NULL},
     {"ENFTOPIC",        "channel_enftopic",     NS_VALID_ACCESS,                    NULL},
-    {"TOPICSNARF",      "channel_topicsnarf",   NS_VALID_ACCESS,                    NULL},
-    {"CHANGETOPIC",     "channel_changetopic",  NS_VALID_ACCESS,                    NULL},
-    {"SETTERS",         "channel_setters",      NS_VALID_ACCESS | NS_VALID_NO501,   NULL},
-    {"ADDUSER",         "channel_canadd",       NS_VALID_ACCESS,                    NULL},
-    {"DELUSER",         "channel_candel",       NS_VALID_ACCESS,                    NULL},
-    {"CLVL",            "channel_canclvl",      NS_VALID_ACCESS,                    NULL},
-    {"RESYNC",          "channel_canresync",    NS_VALID_ACCESS,                    NULL},
-    {"SUSPEND",         "channel_cansuspend",   NS_VALID_ACCESS,                    NULL},
+    {"TOPICSNARF",      "channel_topicsnarf",   NS_VALID_ACCESS | NS_HAS_HELP,      NULL},
+    {"CHANGETOPIC",     "channel_changetopic",  NS_VALID_ACCESS | NS_HAS_HELP,      NULL},
+    {"SETTERS",         "channel_setters",      NS_VALID_ACCESS | NS_VALID_NO501 | NS_HAS_HELP, NULL},
+    {"ADDUSER",         "channel_canadd",       NS_VALID_ACCESS | NS_HAS_HELP,      NULL},
+    {"DELUSER",         "channel_candel",       NS_VALID_ACCESS | NS_HAS_HELP,      NULL},
+    {"CLVL",            "channel_canclvl",      NS_VALID_ACCESS | NS_HAS_HELP,      NULL},
+    {"RESYNC",          "channel_canresync",    NS_VALID_ACCESS | NS_HAS_HELP,      NULL},
+    {"SUSPEND",         "channel_cansuspend",   NS_VALID_ACCESS | NS_HAS_HELP,      NULL},
     {"NOTICEUSERS",     "channel_notice",       NS_VALID_ACCESS,                    NULL},
     {"NOTICEREACTION",  "channel_noticereaction", NS_VALID_OPTIONS | NS_HAS_OPT,    "4"},
     {"CTCPUSERS",       "channel_ctcp",         NS_VALID_ACCESS,                    NULL},
@@ -62,16 +65,21 @@ static const struct {
 };
 
 #define MAX_QUERY_LEN 1024
-static CMD_BIND(neonserv_cmd_set) {
+CMD_BIND(neonserv_cmd_set) {
     int i, j;
     if(argc && !strcmp(argv[0], "defaults")) {
         //reset channel settings
-        int uaccess = getChannelAccess(user, chan, 1);
+        int uaccess = getChannelAccess(user, chan, 0);
         if(uaccess < 500) {
-            reply(getTextBot(), user, "NS_SET_DEFAULTS_OWNER", chan->name);
-            return;
+            if(isGodMode(user)) {
+                event->flags |= CMDFLAG_OPLOG;
+            } else {
+                reply(getTextBot(), user, "NS_SET_DEFAULTS_OWNER", chan->name);
+                return;
+            }
         }
         int seed = 0;
+        char *tmp;
         static char defaultskey[16];
         for(tmp = user->auth; *tmp; tmp++)
             seed = (seed * 0xEECE66DL ^ ((*tmp << 24) | (*tmp << 16) | (*tmp << 8) | *tmp));
@@ -81,7 +89,6 @@ static CMD_BIND(neonserv_cmd_set) {
         if(argc > 1 && !strcmp(argv[1], defaultskey)) {
             char query[MAX_QUERY_LEN];
             int querypos = 0;
-            check_mysql();
             i = 0;
             while(channel_settings[i].setting) {
                 if(channel_settings[i].chanfield)
@@ -93,6 +100,7 @@ static CMD_BIND(neonserv_cmd_set) {
             }
             printf_mysql_query("UPDATE `channels` SET %s WHERE `channel_id` = '%d'", query, chan->channel_id);
             reply(getTextBot(), user, "NS_SET_DEFAULTS_DONE", chan->name);
+            logEvent(event);
         } else {
             reply(getTextBot(), user, "NS_SET_DEFAULTS_CODE", chan->name, defaultskey);
         }
@@ -100,15 +108,15 @@ static CMD_BIND(neonserv_cmd_set) {
         //find the correct command
         i = 0;
         j = 0;
+        char *args = (argc > 1 ? merge_argv(argv, 1, argc) : NULL);
         while(channel_settings[i].setting) {
             if(!stricmp(channel_settings[i].setting, argv[0])) {
                 //setting found
-                char *args = (argc > 1 ? merge_argv(argv, 1, argc) : NULL);
                 if(channel_settings[i].valid & NS_VALID_FUNCTION) {
                     neonserv_cmd_set_function *func = channel_settings[i].parameter;
-                    func(client, user, chan, channel_settings[i].setting, args);
+                    func(client, user, chan, event, channel_settings[i].setting, args);
                 } else {
-                    neonserv_cmd_set_setting(client, user, chan, channel_settings[i].setting, args);
+                    neonserv_cmd_set_setting(client, user, chan, event, i, args);
                 }
                 j = 1;
                 break;
@@ -117,10 +125,9 @@ static CMD_BIND(neonserv_cmd_set) {
         }
         if(j == 0) {
             //unknown setting
-            reply(getTextBot(), "NS_SET_UNKNOWN_SETTING", argv[0]);
+            reply(getTextBot(), user, "NS_SET_UNKNOWN_SETTING", argv[0]);
         }
     } else {
-        check_mysql();
         char query[MAX_QUERY_LEN], *value, *org_value, *tmp, nameBuf[64];
         int querypos = 0;
         MYSQL_RES *res, *defaults_res;
@@ -150,7 +157,7 @@ static CMD_BIND(neonserv_cmd_set) {
                 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, NULL, NULL);
+                org_value = func(client, user, chan, event, NULL, NULL);
             } else
                 org_value = "0";
             value = org_value;
@@ -189,13 +196,12 @@ static CMD_BIND(neonserv_cmd_set) {
     }
 }
 
-static void neonserv_cmd_set_setting(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, int setting, char *argument) {
+static void neonserv_cmd_set_setting(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, int setting, char *args) {
     char *value;
     char nameBuf[64];
     //get current value
     MYSQL_RES *res;
     MYSQL_ROW row;
-    check_mysql();
     printf_mysql_query("SELECT `%s` FROM `channels` WHERE `channel_id` = '%d'", channel_settings[setting].chanfield, chan->channel_id);
     res = mysql_use();
     row = mysql_fetch_row(res);
@@ -205,43 +211,53 @@ static void neonserv_cmd_set_setting(struct ClientSocket *client, struct UserNod
         row = mysql_fetch_row(res);
     }
     value = row[0];
-    if(argument) {
+    if(args) {
         //change the channel setting
         //check the new argument
         int valid = channel_settings[setting].valid;
         if(valid & NS_VALID_STRING) {
-            if(!strcmp(argument, "*")) {
-                argument = "";
+            if(!strcmp(args, "*")) {
+                args = "";
             }
         }
         if(valid & NS_VALID_ACCESS) {
-            int caccess = atoi(argument);
+            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, 1);
+            int uaccess = getChannelAccess(user, chan, 0);
             if(uaccess == 500) uaccess++;
             if(atoi(value) > uaccess) {
-                reply(getTextBot(), user, "NS_SET_CANNOT_SET");
-                return;
+                if(isGodMode(user)) {
+                    event->flags |= CMDFLAG_OPLOG;
+                } else {
+                    reply(getTextBot(), user, "NS_SET_CANNOT_SET");
+                    return;
+                }
             }
             if(caccess > uaccess) {
-                reply(getTextBot(), user, "NS_SET_BADLEVEL");
-                return;
+                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 *) channel_settings[setting].parameter);
-            int coption = atoi(argument);
+            int coption = atoi(args);
             if(coption < 0 || coption >= options) {
-                reply(getTextBot(), user, "NS_SET_INVALID_OPTION", argument);
+                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_%s", channel_settings[setting].setting, 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));
                     }
                 } else {
@@ -257,51 +273,56 @@ static void neonserv_cmd_set_setting(struct ClientSocket *client, struct UserNod
             }
         }
         if(valid & NS_VALID_NUMERIC) {
-            sprintf(nameBuf, "%d", atoi(argument));
-            argument = nameBuf;
+            sprintf(nameBuf, "%d", atoi(args));
+            args = nameBuf;
         }
         if(valid & NS_VALID_BOOLEAN) {
-            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"))) {
-                argument = "1";
+            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", argument);
+                reply(getTextBot(), user, "NS_SET_INVALID_BOOLEAN", args);
                 return;
             }
         }
         //valid - set it
-        value = argument;
+        value = args;
         printf_mysql_query("UPDATE `channels` SET `%s` = '%s' WHERE `channel_id` = '%d'", channel_settings[setting].chanfield, escape_string(value), chan->channel_id);
+        logEvent(event);
     }
     reply(getTextBot(), 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[i].setting);
-         reply(getTextBot(), user, "  %s", get_language_string(user, nameBuf);
+         sprintf(nameBuf, "NS_SET_HELP_%s", channel_settings[setting].setting);
+         reply(getTextBot(), user, "  %s", get_language_string(user, nameBuf));
     }
 }
 
-static char* neonserv_cmd_set_trigger(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, char *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) {
     char *trigger;
     //get current trigger
     MYSQL_RES *res;
     MYSQL_ROW row;
-    check_mysql();
     printf_mysql_query("SELECT `trigger` FROM `bot_channels` WHERE `chanid` = '%d' AND `botid` = '%d'", chan->channel_id, client->clientid);
     res = mysql_use();
     row = mysql_fetch_row(res);
     trigger = row[0];
     if(argument) {
-        int uaccess = getChannelAccess(user, chan, 1);
+        int uaccess = getChannelAccess(user, chan, 0);
         if(uaccess < 500) {
-            reply(getTextBot(), user, "NS_SET_TRIGGER_OWNER", chan->name);
-            return NULL;
+            if(isGodMode(user)) {
+                event->flags |= CMDFLAG_OPLOG;
+            } else {
+                reply(getTextBot(), 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);
         trigger = argument;
         changeChannelTrigger(client->botid, chan, trigger);
+        logEvent(event);
     }
     if(setting) {
         reply(getTextBot(), user, "\002%s\002 %s", setting, trigger);
@@ -309,12 +330,11 @@ static char* neonserv_cmd_set_trigger(struct ClientSocket *client, struct UserNo
     return trigger;
 }
 
-static char* neonserv_cmd_set_modes(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, 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) {
     char *value;
     //get current value
     MYSQL_RES *res;
     MYSQL_ROW row;
-    check_mysql();
     printf_mysql_query("SELECT `channel_modes` FROM `channels` WHERE `channel_id` = '%d'", chan->channel_id);
     res = mysql_use();
     row = mysql_fetch_row(res);
@@ -334,13 +354,12 @@ static char* neonserv_cmd_set_modes(struct ClientSocket *client, struct UserNode
     return value;
 }
 
-static char* neonserv_cmd_set_dynlimit(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, 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) {
     char *value;
     char tmp[64];
     //get current value
     MYSQL_RES *res;
     MYSQL_ROW row;
-    check_mysql();
     printf_mysql_query("SELECT `channel_dynlimit` FROM `channels` WHERE `channel_id` = '%d'", chan->channel_id);
     res = mysql_use();
     row = mysql_fetch_row(res);
@@ -357,8 +376,10 @@ static char* neonserv_cmd_set_dynlimit(struct ClientSocket *client, struct UserN
         printf_mysql_query("UPDATE `channels` SET `channel_dynlimit` = '%s' WHERE `channel_id` = '%d'", escape_string(argument), chan->channel_id);
         if(strcmp(argument, "0"))
             putsock(client, "MODE %s +l %d", chan->name, (chan->usercount + atoi(argument)));
-        else if(isModeSet(chan, 'l'))
+        else if(isModeSet(chan->modes, 'l'))
             putsock(client, "MODE %s -l", chan->name);
+        value = argument;
+        logEvent(event);
     }
     if(setting) {
         reply(getTextBot(), user, "\002%s\002 %s", setting, value);
@@ -366,12 +387,11 @@ static char* neonserv_cmd_set_dynlimit(struct ClientSocket *client, struct UserN
     return value;
 }
 
-static char* neonserv_cmd_set_nodelete(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, 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) {
     char *value;
     //get current value
     MYSQL_RES *res;
     MYSQL_ROW row;
-    check_mysql();
     printf_mysql_query("SELECT `channel_nodelete` FROM `channels` WHERE `channel_id` = '%d'", chan->channel_id);
     res = mysql_use();
     row = mysql_fetch_row(res);
@@ -392,6 +412,9 @@ static char* neonserv_cmd_set_nodelete(struct ClientSocket *client, struct UserN
             return NULL;
         }
         printf_mysql_query("UPDATE `channels` SET `channel_nodelete` = '%s' WHERE `channel_id` = '%d'", escape_string(argument), chan->channel_id);
+        event->flags |= CMDFLAG_OPLOG;
+        value = argument;
+        logEvent(event);
     }
     if(setting) {
         reply(getTextBot(), user, "\002%s\002 %s", setting, value);