/* modcmd.c - NeonServ v5.3
- * Copyright (C) 2011 Philipp Kreil (pk910)
+ * Copyright (C) 2011-2012 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
statistics_commands++;
total_triggered++;
cbind->triggered++;
- if((cbind->func->flags & CMDFLAG_FUNCMD)) {
+ if((BIND_FLAGS(cbind) & CMDFLAG_FUNCMD)) {
if(!sent_chan)
break;
chan = sent_chan;
if (argc >= MAXNUMPARAMS)
break;
while ((escape || *args != ' ') && *args) {
- if((cbind->func->flags & CMDFLAG_ESCAPE_ARGS) && *args == '\\') {
+ if((BIND_FLAGS(cbind) & CMDFLAG_ESCAPE_ARGS) && *args == '\\') {
escape = 1;
offset++;
} else if(escape)
}
}
argv = arga;
- if(argc != 0 && argv[0][0] == '#' && !(cbind->func->flags & CMDFLAG_CHAN_PARAM)) {
+ if(argc != 0 && argv[0][0] == '#' && !(BIND_FLAGS(cbind) & CMDFLAG_CHAN_PARAM)) {
struct ChanNode *chan2 = getChanByName(argv[0]);
if(chan2) {
argv += 1;
}
args_pos++;
}
- } else if((cbind->func->flags & CMDFLAG_EMPTY_ARGS)) {
+ } else if((BIND_FLAGS(cbind) & CMDFLAG_EMPTY_ARGS)) {
uargs[uargc++] = args_buffer + args_pos;
args_buffer[args_pos++] = '\0';
} else if(c) {
reply(tmp_text_client, user, "MODCMD_LESS_PARAM_COUNT");
break;
}
- if((cbind->func->flags & CMDFLAG_REQUIRE_CHAN) && !chan) {
+ if((BIND_FLAGS(cbind) & CMDFLAG_REQUIRE_CHAN) && !chan) {
reply(tmp_text_client, user, "MODCMD_CHAN_REQUIRED");
break;
}
- if(((cbind->func->flags & CMDFLAG_CHECK_AUTH) || (chan && chan != sent_chan && !isUserOnChan(user, chan))) && !(user->flags & USERFLAG_ISAUTHED)) {
+ if(((BIND_FLAGS(cbind) & CMDFLAG_CHECK_AUTH) || (chan && chan != sent_chan && !isUserOnChan(user, chan))) && !(user->flags & USERFLAG_ISAUTHED)) {
//check auth...
struct command_check_user_cache *data = malloc(sizeof(*data));
char **temp_argv = malloc(argc*sizeof(*temp_argv));
MYSQL_ROW row;
int uaccess;
char requested_uaccess = 0;
- int eventflags = (cbind->func->flags & (CMDFLAG_LOG | CMDFLAG_OPLOG));
- if((cbind->func->flags & CMDFLAG_REQUIRE_AUTH) && !(user->flags & USERFLAG_ISAUTHED)) {
+ int eventflags = (BIND_FLAGS(cbind) & (CMDFLAG_LOG | CMDFLAG_OPLOG));
+ if((BIND_FLAGS(cbind) & CMDFLAG_REQUIRE_AUTH) && !(user->flags & USERFLAG_ISAUTHED)) {
reply(tmp_text_client, user, "MODCMD_AUTH_REQUIRED");
return;
}
requested_uaccess = 1;
uaccess = getChannelAccess(user, chan);
if(!uaccess) {
- reply(tmp_text_client, user, "MODCMD_CROSSCHAN", chan->name);
- return;
+ if(isGodMode(user)) {
+ eventflags |= CMDFLAG_OPLOG;
+ } else {
+ reply(tmp_text_client, user, "MODCMD_CROSSCHAN", chan->name);
+ return;
+ }
}
}
}
return;
}
}
- if((cbind->func->flags & CMDFLAG_REGISTERED_CHAN)) {
+ if((BIND_FLAGS(cbind) & CMDFLAG_REGISTERED_CHAN)) {
MYSQL_ROW defaults = NULL;
char access_list[256];
int access_pos = 0;
return;
}
}
- if((cbind->func->flags & CMDFLAG_REQUIRE_GOD) && !isGodMode(user)) {
+ if((BIND_FLAGS(cbind) & CMDFLAG_REQUIRE_GOD) && !isGodMode(user)) {
reply(tmp_text_client, user, "MODCMD_PRIVILEGED", cbind->cmd);
return;
}
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;
}
}
}
}
+void bind_botwise_set_bind_flags(int botid, int clientid, char *cmd, unsigned int flags) {
+ 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) {
+ cbind->flags |= flags;
+ return;
+ }
+ }
+}
+
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;