X-Git-Url: http://git.pk910.de/?a=blobdiff_plain;f=src%2Fmodcmd.c;h=5837d33983eeab109d08289330cd6ccccd30265b;hb=a40e0df080a82db2b1150492a8952cdfe3559185;hp=53d65fd0e8f3770868a63b43ecaecb842f182b0a;hpb=4d078d69cd2308cc835d7d8f1117e9b18ec37b61;p=NeonServV5.git diff --git a/src/modcmd.c b/src/modcmd.c index 53d65fd..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)) { @@ -598,7 +624,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 +703,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 +742,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 +775,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 +897,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 +922,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 +938,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 +957,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 +968,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; } }