-/* 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
#include "mysqlConn.h"
#include "DBHelper.h"
#include "EventLogger.h"
+#include "tools.h"
struct trigger_callback {
int botid;
}
}
+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] == '#') {
}
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';
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)) {
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));
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));
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));
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
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++)
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;
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) {
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;
}
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;
}
}