+ if(cbind->parameters) {
+ //userdefined parameters...
+ char *uargs[MAXNUMPARAMS];
+ int uargc = 0;
+ char *a,*b = cbind->parameters;
+ int allargs, argi;
+ do {
+ a = strstr(b, " ");
+ if(a) *a = '\0';
+ if(b[0] == '%') {
+ b++;
+ if(b[strlen(b)-1] == '-') {
+ allargs = 1;
+ b[strlen(b)-1] = '\0';
+ argi = atoi(b);
+ b[strlen(b)-1] = '-';
+ } else {
+ allargs = 0;
+ argi = atoi(b);
+ }
+ if(argi > 0) {
+ if(argi <= argc) {
+ uargs[uargc++] = argv[argi-1];
+ if(allargs) {
+ for(argi++; argi <= argc; argi++)
+ uargs[uargc++] = argv[argi-1];
+ }
+ }
+ } else if(!strcmp(b, "c")) {
+ uargs[uargc++] = (chan ? chan->name : NULL);
+ } else if(!strcmp(b, "n")) {
+ uargs[uargc++] = user->nick;
+ }
+ } else {
+ uargs[uargc++] = b;
+ }
+ if(a) {
+ *a = ' ';
+ b = a+1;
+ }
+ } while(a);
+ argv = uargs;
+ argc = uargc;
+ }
+ if(argc < cbind->func->paramcount) {
+ reply(tmp_text_client, user, "MODCMD_LESS_PARAM_COUNT");
+ break;
+ }
+ if((cbind->func->flags & CMDFLAG_REQUIRE_CHAN) && !chan) {
+ reply(tmp_text_client, user, "MODCMD_CHAN_REQUIRED");
+ break;
+ }
+ if((cbind->func->flags & CMDFLAG_CHECK_AUTH) && !(user->flags & USERFLAG_ISAUTHED)) {
+ //check auth...
+ struct command_check_user_cache *data = malloc(sizeof(*data));
+ char **temp_argv = malloc(argc*sizeof(*temp_argv));
+ if (!data || !temp_argv) {
+ perror("malloc() failed");
+ break;
+ }
+ memcpy(temp_argv, argv, argc*sizeof(*temp_argv));
+ data->argv = temp_argv;
+ data->argc = argc;
+ data->client = client;
+ data->user = user;
+ data->chan = chan;
+ data->sent_chan = sent_chan;
+ data->message = message;
+ data->cbind = cbind;
+ data->textclient = tmp_text_client;
+ get_userauth(user, command_checked_auth, data);
+ return;
+ } else
+ handle_command_async(client, user, chan, sent_chan, cbind, argv, argc);
+ break;
+ }
+ }
+ free(message);
+}
+
+static void handle_command_async(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct ChanNode *sent_chan, struct cmd_binding *cbind, char **argv, int argc) {
+ MYSQL_RES *res;
+ MYSQL_ROW row;
+ int uaccess;
+ int eventflags = (cbind->func->flags & (CMDFLAG_LOG | CMDFLAG_OPLOG));
+ if((cbind->func->flags & CMDFLAG_REQUIRE_AUTH) && !(user->flags & USERFLAG_ISAUTHED)) {
+ reply(tmp_text_client, user, "MODCMD_AUTH_REQUIRED");
+ return;
+ }
+ if(sent_chan && sent_chan != chan) {
+ //check pubcmd of this channel
+ printf_mysql_query("SELECT `channel_pubcmd` FROM `channels` WHERE `channel_name` = '%s'", escape_string(sent_chan->name));
+ res = mysql_use();
+ if ((row = mysql_fetch_row(res)) != NULL) {
+ uaccess = getChannelAccess(user, sent_chan, 1);
+ if(row[0] && uaccess < atoi(row[0])) { //NOTE: HARDCODED DEFAULT: pubcmd = 0
+ reply(tmp_text_client, user, "MODCMD_PUBCMD", sent_chan->name);
+ return;
+ }
+ }
+ }
+ int global_access = ((cbind->flags & CMDFLAG_OVERRIDE_GLOBAL_ACCESS) ? cbind->global_access : cbind->func->global_access);
+ if(global_access > 0) {
+ int user_global_access = 0;
+ printf_mysql_query("SELECT `user_access` FROM `users` WHERE `user_user` = '%s'", escape_string(user->auth));
+ res = mysql_use();
+ if ((row = mysql_fetch_row(res)) != NULL) {
+ user_global_access = atoi(row[0]);
+ }
+ if(user_global_access < global_access) {
+ if(!user_global_access)
+ reply(tmp_text_client, user, "MODCMD_PRIVILEGED", cbind->cmd);
+ else
+ reply(tmp_text_client, user, "MODCMD_ACCESS_DENIED");