/* 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
{"MODCMD_PUBCMD", "Public commands in $b%s$b are restricted."}, /* {ARGS: "#TestChan"} */
{"MODCMD_ACCESS_DENIED", "Access denied."},
{"MODCMD_SUBCOMMANDS", "Subcommands of %s: %s"}, /* {ARGS: "bot", "ADD, DEL, EDIT"} */
- {"MODCMD_CROSSCHAN", "You must be in %s (or on its userlist) to use this command."},
+ {"MODCMD_CROSSCHAN", "You must be in %s (or on its userlist) to use this command."}, /* {ARGS: "#TestChan"} */
{"MODCMD_UNKNOWN", "$b%s$b is an unknown command."}, /* {ARGS: "bla"} */
{NULL, NULL}
};
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;
}
return 1;
}
+int flush_trigger_cache(int botid, int clientid) {
+ struct ChanNode *chan;
+ struct trigger_cache *trigger, *last;
+ for(chan = getAllChans(NULL); chan; chan = getAllChans(chan)) {
+ last = NULL;
+ for(trigger = chan->trigger; trigger; trigger = trigger->next) {
+ if(trigger->botid == botid && (botid || trigger->clientid == clientid)) {
+ if(last)
+ last->next = trigger->next;
+ else
+ chan->trigger = trigger->next;
+ free(trigger->trigger);
+ free(trigger);
+ break;
+ } else
+ last = trigger;
+ }
+ }
+ return 1;
+}
+
int changeBotwiseChannelTrigger(int botid, int clientid, struct ChanNode *chan, char *new_trigger) {
struct trigger_cache *trigger;
for(trigger = chan->trigger; trigger; trigger = trigger->next) {
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;