fixed some missing includes
[NeonServV5.git] / src / modcmd.c
index 2edabf17968f1b29a4bac9268382db08a02d6d0a..0c1e92e67571f7184904813271b7a6561d30857c 100644 (file)
@@ -1,4 +1,4 @@
-/* modcmd.c - NeonServ v5.4
+/* modcmd.c - NeonServ v5.6
  * Copyright (C) 2011-2012  Philipp Kreil (pk910)
  * 
  * This program is free software: you can redistribute it and/or modify
@@ -27,6 +27,7 @@
 #include "mysqlConn.h"
 #include "DBHelper.h"
 #include "EventLogger.h"
+#include "tools.h"
 
 struct trigger_callback {
     int botid;
@@ -179,6 +180,32 @@ static struct cmd_binding *modcmd_linker_command(struct ClientSocket *client, st
     }
 }
 
+static struct cmd_binding *modcmd_sub_linker_command(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct cmd_binding *cbind, int bind_index, char **args_ptr) {
+    //links subcommands
+    char command[MAXLEN];
+    struct cmd_binding *parent_bind = cbind;
+    char *args = *args_ptr;
+    if(args) {
+        char *subcmd = args;
+        args = strchr(args, ' ');
+        if(args) {
+            *args = '\0';
+            args++;
+        }
+        sprintf(command, "%s %s", parent_bind->cmd, subcmd);
+        for(cbind = cmd_binds[bind_index]; cbind; cbind = cbind->next) {
+            if(cbind->botid == client->botid && (cbind->botid || cbind->clientid == client->clientid) && stricmp(cbind->cmd, command) == 0)
+                break;
+        }
+        *args_ptr = args;
+        if(cbind && cbind->func->func == modcmd_linker) {
+            return modcmd_linker_command(client, textclient, user, cbind, bind_index, args_ptr);
+        }
+        return (cbind ? cbind : parent_bind);
+    } else
+        return parent_bind;
+}
+
 static void handle_command(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, char *message) {
     struct ChanNode *sent_chan = chan;
     if(message[0] == '#') {
@@ -193,7 +220,7 @@ static void handle_command(struct ClientSocket *client, struct UserNode *user, s
     }
     message = strdup(message);
     int bind_index = get_binds_index(message[0]);
-    char *args = strstr(message, " ");
+    char *args = strchr(message, ' ');
     char *args_buffer = NULL; //we need this to save a possible pointer to a allocation we need to free
     if(args) {
         *args = '\0';
@@ -209,9 +236,9 @@ static void handle_command(struct ClientSocket *client, struct UserNode *user, s
             if(cbind->func->func == modcmd_linker) {
                 cbind = modcmd_linker_command(client, textclient, user, cbind, bind_index, &args);
                 if(cbind == NULL) break;
-            }
-            if(statistics_enabled)
-                statistics_commands++;
+            } else if(cbind->flags & CMDFLAG_SUB_LINKER)
+                cbind = modcmd_sub_linker_command(client, textclient, user, cbind, bind_index, &args);
+            statistics_commands++;
             total_triggered++;
             cbind->triggered++;
             if((BIND_FLAGS(cbind) & CMDFLAG_FUNCMD)) {
@@ -598,7 +625,7 @@ static void got_privmsg(struct UserNode *user, struct UserNode *target, char *me
 int register_command(int botid, char *name, int module_id, cmd_bind_t *func, int paramcount, char *channel_access, int global_access, unsigned int flags) {
     struct cmd_function *cmdfunc;
     for(cmdfunc = cmd_functions; cmdfunc; cmdfunc = cmdfunc->next) {
-        if((cmdfunc->botid == botid || cmdfunc->botid == 0) && strcmp(cmdfunc->name, name) == 0)
+        if((cmdfunc->botid == botid || cmdfunc->botid == 0) && !stricmp(cmdfunc->name, name))
             return 0;
     }
     cmdfunc = malloc(sizeof(*cmdfunc));
@@ -677,7 +704,7 @@ int bind_botwise_cmd_to_function(int botid, int clientid, char *cmd, struct cmd_
     int bind_index = get_binds_index(cmd[0]);
     struct cmd_binding *cbind;
     for(cbind = cmd_binds[bind_index]; cbind; cbind = cbind->next) {
-        if(((botid && cbind->botid == botid) || (botid == 0 && clientid == cbind->clientid)) && strcmp(cbind->cmd, cmd) == 0)
+        if(((botid && cbind->botid == botid) || (botid == 0 && clientid == cbind->clientid)) && !stricmp(cbind->cmd, cmd))
             return 0;
     }
     cbind = malloc(sizeof(*cbind));
@@ -716,14 +743,14 @@ int bind_botwise_cmd_to_command(int botid, int clientid, char *cmd, char *func)
         func = c+1;
     }
     for(cmdfunc = cmd_functions; cmdfunc; cmdfunc = cmdfunc->next) {
-        if((cmdfunc->botid == fbotid || cmdfunc->botid == 0) && strcmp(cmdfunc->name, func) == 0)
+        if((cmdfunc->botid == fbotid || cmdfunc->botid == 0) && !stricmp(cmdfunc->name, func))
             break;
     }
     if(!cmdfunc) return 0;
     int bind_index = get_binds_index(cmd[0]);
     struct cmd_binding *cbind;
     for(cbind = cmd_binds[bind_index]; cbind; cbind = cbind->next) {
-        if(((botid && cbind->botid == botid) || (botid == 0 && clientid == cbind->clientid)) && strcmp(cbind->cmd, cmd) == 0)
+        if(((botid && cbind->botid == botid) || (botid == 0 && clientid == cbind->clientid)) && !stricmp(cbind->cmd, cmd))
             return 0;
     }
     cbind = malloc(sizeof(*cbind));
@@ -749,7 +776,7 @@ int unbind_botwise_cmd(int botid, int clientid, char *cmd) {
     int bind_index = get_binds_index(cmd[0]);
     struct cmd_binding *cbind, *last = NULL;
     for(cbind = cmd_binds[bind_index]; cbind; cbind = cbind->next) {
-        if(cbind->botid == botid && (botid || clientid == cbind->clientid) && strcmp(cbind->cmd, cmd) == 0) {
+        if(cbind->botid == botid && (botid || clientid == cbind->clientid) && !stricmp(cbind->cmd, cmd)) {
             if(last)
                 last->next = cbind->next;
             else
@@ -871,7 +898,7 @@ void bind_botwise_set_parameters(int botid, int clientid, char *cmd, char *param
     int bind_index = get_binds_index(cmd[0]);
     struct cmd_binding *cbind;
     for(cbind = cmd_binds[bind_index]; cbind; cbind = cbind->next) {
-        if(cbind->botid == botid && (botid || clientid == cbind->clientid) && strcmp(cbind->cmd, cmd) == 0) {
+        if(cbind->botid == botid && (botid || clientid == cbind->clientid) && !stricmp(cbind->cmd, cmd)) {
             if(cbind->paramcount) {
                 int i;
                 for(i = 0; i < cbind->paramcount; i++)
@@ -896,7 +923,7 @@ void bind_botwise_set_global_access(int botid, int clientid, char *cmd, int gacc
     int bind_index = get_binds_index(cmd[0]);
     struct cmd_binding *cbind;
     for(cbind = cmd_binds[bind_index]; cbind; cbind = cbind->next) {
-        if(cbind->botid == botid && (botid || clientid == cbind->clientid) && strcmp(cbind->cmd, cmd) == 0) {
+        if(cbind->botid == botid && (botid || clientid == cbind->clientid) && !stricmp(cbind->cmd, cmd)) {
             if(gaccess > -1) {
                 cbind->global_access = gaccess;
                 cbind->flags |= CMDFLAG_OVERRIDE_GLOBAL_ACCESS;
@@ -912,7 +939,7 @@ void bind_botwise_set_channel_access(int botid, int clientid, char *cmd, char *c
     int bind_index = get_binds_index(cmd[0]);
     struct cmd_binding *cbind;
     for(cbind = cmd_binds[bind_index]; cbind; cbind = cbind->next) {
-        if(cbind->botid == botid && (botid || clientid == cbind->clientid) && strcmp(cbind->cmd, cmd) == 0) {
+        if(cbind->botid == botid && (botid || clientid == cbind->clientid) && !stricmp(cbind->cmd, cmd)) {
             if(cbind->channel_access)
                 free(cbind->channel_access);
             if(chanaccess) {
@@ -931,7 +958,7 @@ void bind_botwise_set_bind_flags(int botid, int clientid, char *cmd, unsigned in
     int bind_index = get_binds_index(cmd[0]);
     struct cmd_binding *cbind;
     for(cbind = cmd_binds[bind_index]; cbind; cbind = cbind->next) {
-        if(cbind->botid == botid && (botid || clientid == cbind->clientid) && strcmp(cbind->cmd, cmd) == 0) {
+        if(cbind->botid == botid && (botid || clientid == cbind->clientid) && !stricmp(cbind->cmd, cmd)) {
             cbind->flags |= flags;
             return;
         }
@@ -942,7 +969,7 @@ struct cmd_binding *find_botwise_cmd_binding(int botid, int clientid, char *cmd)
     int bind_index = get_binds_index(cmd[0]);
     struct cmd_binding *cbind;
     for(cbind = cmd_binds[bind_index]; cbind; cbind = cbind->next) {
-        if(cbind->botid == botid && (botid || clientid == cbind->clientid) && strcmp(cbind->cmd, cmd) == 0) {
+        if(cbind->botid == botid && (botid || clientid == cbind->clientid) && !stricmp(cbind->cmd, cmd)) {
             return cbind;
         }
     }