added cmd_modcmd
authorpk910 <philipp@zoelle1.de>
Sun, 25 Dec 2011 18:15:04 +0000 (19:15 +0100)
committerpk910 <philipp@zoelle1.de>
Sun, 25 Dec 2011 18:18:24 +0000 (19:18 +0100)
Makefile.am
src/bot_NeonServ.c
src/cmd_global.h
src/cmd_global_modcmd.c [new file with mode: 0644]
src/commands.c
src/modcmd.c

index 88f7c773a6c4f2314a447185feada43c8b0c2331..2b367d5d0cfe46fc936b3857b028f44d6659e12a 100644 (file)
@@ -124,6 +124,7 @@ neonserv_SOURCES = src/version.c \
       src/cmd_global_addbot.c \
       src/cmd_global_delbot.c \
       src/cmd_global_reconnect.c \
+      src/cmd_global_modcmd.c \
       src/cmd_funcmds.c \
       src/ConfigParser.c
 
index 881e6f1b87566d29147f00ccf592e4b685ef912b..9ec41e4445c9acab73606ca377c60e881fdd2a5a 100644 (file)
@@ -361,6 +361,9 @@ static const struct default_language_entry msgtab[] = {
     {"NS_DELBOT_NOT_FOUND", "Bot with BotID / nick $b%s$b not found."}, /* {ARGS: "NeonServ"} */
     {"NS_DELBOT_DONE", "Bot deleted."},
     {"NS_RECONNECT_DONE", "Reconnected bot."},
+    {"NS_MODCMD_SETTING", "$b%s$b is an unknown modcmd setting."}, /* {ARGS: "strangeSetting"} */
+    {"NS_MODCMD_HEADER", "$bSettings for command %s:$b"}, /* {ARGS: "access"} */
+    {"NS_MODCMD_OUTRANKED", "$b%s$b outranks you. (required access: %d)"}, /* {ARGS: "die", 1000} */
     {NULL, NULL}
 };
 
index 91345698a5d4dee64f5bfca33bd274c4476e108b..4e02810de75e5b82fbd4e25c5b096f10824d0e91 100644 (file)
@@ -46,6 +46,7 @@ CMD_BIND(global_cmd_delbot);
 CMD_BIND(global_cmd_die);
 CMD_BIND(global_cmd_emote);
 CMD_BIND(global_cmd_god);
+CMD_BIND(global_cmd_modcmd);
 CMD_BIND(global_cmd_motd);
 CMD_BIND(global_cmd_netinfo);
 CMD_BIND(global_cmd_notice);
diff --git a/src/cmd_global_modcmd.c b/src/cmd_global_modcmd.c
new file mode 100644 (file)
index 0000000..7a3b80b
--- /dev/null
@@ -0,0 +1,141 @@
+/* cmd_global_modcmd.c - NeonServ v5.3
+ * Copyright (C) 2011  Philipp Kreil (pk910)
+ * 
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License 
+ * along with this program. If not, see <http://www.gnu.org/licenses/>. 
+ */
+
+#include "cmd_global.h"
+
+/*
+* argv[0]     command
+* argv[1]     setting
+* argv[2]     value
+*/
+
+static int global_cmd_modcmd_params(struct UserNode *user, struct cmd_binding *cbind, char *value);
+static int global_cmd_modcmd_caccess(struct UserNode *user, struct cmd_binding *cbind, char *value);
+static int global_cmd_modcmd_oaccess(struct UserNode *user, struct cmd_binding *cbind, char *value);
+
+CMD_BIND(global_cmd_modcmd) {
+    MYSQL_RES *res;
+    MYSQL_ROW row;
+    struct cmd_binding *cbind = find_botwise_cmd_binding(client->botid, client->clientid, argv[0]);
+    if (!cbind) {
+        reply(getTextBot(), user, "NS_UNBIND_NOT_FOUND", argv[0]);
+        return;
+    }
+    int uaccess = 0;
+    printf_mysql_query("SELECT `user_access` FROM `users` WHERE `user_user` = '%s'", escape_string(user->auth));
+    res = mysql_use();
+    if ((row = mysql_fetch_row(res)) != NULL) {
+        uaccess = atoi(row[0]);
+    }
+    int gaccess = ((cbind->flags & CMDFLAG_OVERRIDE_GLOBAL_ACCESS) ? cbind->global_access : cbind->func->global_access);
+    if(gaccess > uaccess) {
+        reply(getTextBot(), user, "NS_MODCMD_OUTRANKED", cbind->cmd, gaccess);
+        return;
+    }
+    if(argc > 1) {
+        char *value;
+        if(argc > 2) {
+            value = merge_argv(argv, 2, argc);
+        } else
+            value = NULL;
+        int log_event = 0;
+        if(!stricmp(argv[1], "caccess")) log_event = global_cmd_modcmd_caccess(user, cbind, value);
+        else if(!stricmp(argv[1], "oaccess")) log_event = global_cmd_modcmd_oaccess(user, cbind, value);
+        else if(!stricmp(argv[1], "parameters")) log_event = global_cmd_modcmd_params(user, cbind, value);
+        else {
+            reply(getTextBot(), user, "NS_MODCMD_SETTING", argv[1]);
+        }
+        if(log_event) {
+            logEvent(event);
+        }
+    } else {
+        reply(getTextBot(), user, "NS_MODCMD_HEADER", cbind->cmd);
+        global_cmd_modcmd_params(user, cbind, NULL);
+        global_cmd_modcmd_caccess(user, cbind, NULL);
+        global_cmd_modcmd_oaccess(user, cbind, NULL);
+    }
+}
+
+static int global_cmd_modcmd_params(struct UserNode *user, struct cmd_binding *cbind, char *value) {
+    char parameters[MAXLEN];
+    int ret = 0;
+    if(cbind->paramcount) {
+        int i, parampos = 0;
+        for(i = 0; i < cbind->paramcount; i++) {
+            parampos += sprintf(parameters + parampos, (i ? " %s" : "%s"), cbind->parameters[i]);
+        }
+    } else
+        parameters[0] = '\0';
+    if(value) {
+        if(!strcmp(value, "*")) 
+            value = NULL;
+        bind_botwise_set_parameters(cbind->botid, cbind->clientid, cbind->cmd, value);
+        if(cbind->botid == 0)
+            printf_mysql_query("UPDATE `bot_binds` SET `parameters` = '%s' WHERE `botclass` = '0' AND `botid` = '%d' AND `command` = '%s'", (value ? escape_string(value) : ""), cbind->clientid, escape_string(cbind->cmd));
+        else
+            printf_mysql_query("UPDATE `bot_binds` SET `parameters` = '%s' WHERE `botclass` = '%d' AND `command` = '%s'", (value ? escape_string(value) : ""), cbind->botid, escape_string(cbind->cmd));
+        strcpy(parameters, (value ? value : ""));
+        ret = 1;
+    }
+    reply(getTextBot(), user, "\002PARAMETERS \002 %s", parameters);
+    return ret;
+}
+
+static int global_cmd_modcmd_caccess(struct UserNode *user, struct cmd_binding *cbind, char *value) {
+    char caccess[MAXLEN];
+    int ret = 0;
+    if(value) {
+        if(!strcmp(value, "*")) 
+            value = NULL;
+        bind_botwise_set_channel_access(cbind->botid, cbind->clientid, cbind->cmd, value);
+        if(cbind->botid == 0)
+            printf_mysql_query("UPDATE `bot_binds` SET `chan_access` = %s%s%s WHERE `botclass` = '0' AND `botid` = '%d' AND `command` = '%s'", (value ? "'" : ""), (value ? escape_string(value) : "NULL"), (value ? "'" : ""), cbind->clientid, escape_string(cbind->cmd));
+        else
+            printf_mysql_query("UPDATE `bot_binds` SET `chan_access` = %s%s%s WHERE `botclass` = '%d' AND `command` = '%s'", (value ? "'" : ""), (value ? escape_string(value) : "NULL"), (value ? "'" : ""), cbind->botid, escape_string(cbind->cmd));
+        
+        ret = 1;
+    }
+    if(cbind->flags & CMDFLAG_OVERRIDE_CHANNEL_ACCESS)
+        sprintf(caccess, "%s", cbind->channel_access);
+    else
+        sprintf(caccess, "\00314%s\003", (cbind->func->channel_access ? cbind->func->channel_access : "0"));
+    reply(getTextBot(), user, "\002CACCESS    \002 %s", caccess);
+    return ret;
+}
+
+static int global_cmd_modcmd_oaccess(struct UserNode *user, struct cmd_binding *cbind, char *value) {
+    char oaccess[MAXLEN];
+    int ret = 0;
+    if(value) {
+        if(!strcmp(value, "*")) 
+            value = NULL;
+        bind_botwise_set_global_access(cbind->botid, cbind->clientid, cbind->cmd, atoi(value));
+        if(cbind->botid == 0)
+            printf_mysql_query("UPDATE `bot_binds` SET `global_access` = %s%s%s WHERE `botclass` = '0' AND `botid` = '%d' AND `command` = '%s'", (value ? "'" : ""), (value ? escape_string(value) : "NULL"), (value ? "'" : ""), cbind->clientid, escape_string(cbind->cmd));
+        else
+            printf_mysql_query("UPDATE `bot_binds` SET `global_access` = %s%s%s WHERE `botclass` = '%d' AND `command` = '%s'", (value ? "'" : ""), (value ? escape_string(value) : "NULL"), (value ? "'" : ""), cbind->botid, escape_string(cbind->cmd));
+        
+        ret = 1;
+    }
+    if(cbind->flags & CMDFLAG_OVERRIDE_GLOBAL_ACCESS)
+        sprintf(oaccess, "%d", cbind->global_access);
+    else
+        sprintf(oaccess, "\00314%d\003", (cbind->func->global_access ? cbind->func->global_access : 0));
+    reply(getTextBot(), user, "\002OACCESS    \002 %s", oaccess);
+    return ret;
+}
+
index b81728abb53ff6b76a215deafebe0dc0dd478cee..8e72f9cefba487ff9e9a08cfadbef1295c34a8ac 100644 (file)
@@ -55,6 +55,7 @@ void register_commands() {
     OPER_COMMAND("addbot",       global_cmd_addbot,    2,     1000, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG | CMDFLAG_REQUIRED);
     OPER_COMMAND("delbot",       global_cmd_delbot,    1,     1000, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG | CMDFLAG_REQUIRED);
     OPER_COMMAND("reconnect",    global_cmd_reconnect, 0,     1000, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG);
+    OPER_COMMAND("modcmd",       global_cmd_modcmd,    1,     900,  CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG | CMDFLAG_REQUIRED | CMDFLAG_ESCAPE_ARGS);
     #undef OPER_COMMAND
     
     //NeonServ Commands
index 6401edf63157572918897f0b7bad148c3fe6dbe1..9af13218fc32a47f7a12efe713d5b83fadce5763 100644 (file)
@@ -856,13 +856,15 @@ void bind_botwise_set_parameters(int botid, int clientid, char *cmd, char *param
                     free(cbind->parameters[i]);
                 cbind->paramcount = 0;
             }
-            char *a, *b = parameters;
-            do {
-                a = strstr(b, " ");
-                if(a) *a = '\0';
-                cbind->parameters[cbind->paramcount++] = strdup(b);
-                if(a) b = a+1;
-            } while(a);
+            if(parameters) {
+                char *a, *b = parameters;
+                do {
+                    a = strstr(b, " ");
+                    if(a) *a = '\0';
+                    cbind->parameters[cbind->paramcount++] = strdup(b);
+                    if(a) b = a+1;
+                } while(a);
+            }
             return;
         }
     }