X-Git-Url: http://git.pk910.de/?a=blobdiff_plain;f=src%2Fmodcmd.c;h=5837d33983eeab109d08289330cd6ccccd30265b;hb=a40e0df080a82db2b1150492a8952cdfe3559185;hp=cbc30afc665e4a014c6e2dfecb5b1ca1dfb89520;hpb=b34ee05cff8d311f7f94d857cecec36b1728a338;p=NeonServV5.git diff --git a/src/modcmd.c b/src/modcmd.c index cbc30af..5837d33 100644 --- a/src/modcmd.c +++ b/src/modcmd.c @@ -1,4 +1,4 @@ -/* modcmd.c - NeonServ v5.5 +/* modcmd.c - NeonServ v5.6 * Copyright (C) 2011-2012 Philipp Kreil (pk910) * * This program is free software: you can redistribute it and/or modify @@ -179,6 +179,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 +219,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 +235,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)) {