+/* modcmd.c - NeonServ v5.0
+ * Copyright (C) 2011 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
#include "modcmd.h"
#include "IRCEvents.h"
}
struct ClientSocket* get_prefered_bot(int botid) {
- struct ClientSocket *client;
+ struct ClientSocket *client, *lowbot = NULL;
for(client = getBots(SOCKET_FLAG_READY, NULL); client; client = getBots(SOCKET_FLAG_READY, client)) {
- if(client->botid == botid && (client->flags & SOCKET_FLAG_PREFERRED))
- return client;
+ if(client->botid == botid) {
+ if((client->flags & SOCKET_FLAG_PREFERRED))
+ return client;
+ else
+ lowbot = client;
+ }
}
- return NULL;
+ return lowbot;
}
static char* get_channel_trigger(int botid, struct ChanNode *chan) {
chan = chan2;
}
}
- if(cbind->parameters) {
+ if(cbind->paramcount) {
//userdefined parameters...
char *uargs[MAXNUMPARAMS];
int uargc = 0;
- char *a,*b = cbind->parameters;
+ char *b;
+ int i;
int allargs, argi;
- do {
- a = strstr(b, " ");
- if(a) *a = '\0';
+ for(i = 0; i < cbind->paramcount; i++) {
+ b = cbind->parameters[i];
if(b[0] == '%') {
b++;
if(b[strlen(b)-1] == '-') {
} else {
uargs[uargc++] = b;
}
- if(a) {
- *a = ' ';
- b = a+1;
- }
- } while(a);
+ }
argv = uargs;
argc = uargc;
}
cbind->botid = botid;
cbind->cmd = strdup(cmd);
cbind->func = func;
- cbind->parameters = NULL;
+ cbind->paramcount = 0;
cbind->global_access = 0;
cbind->channel_access = NULL;
cbind->flags = 0;
cbind->cmd = strdup(cmd);
cbind->func = cmdfunc;
cbind->next = cmd_binds[bind_index];
- cbind->parameters = NULL;
+ cbind->paramcount = 0;
cbind->global_access = 0;
cbind->channel_access = NULL;
cbind->flags = 0;
else
cmd_binds[bind_index] = cbind->next;
free(cbind->cmd);
- if(cbind->parameters)
- free(cbind->parameters);
+ if(cbind->paramcount) {
+ int i;
+ for(i = 0; i < cbind->paramcount; i++)
+ free(cbind->parameters[i]);
+ }
free(cbind);
return 1;
} else
for(cbind = cmd_binds[i]; cbind; cbind = next) {
next = cbind->next;
free(cbind->cmd);
- if(cbind->parameters)
- free(cbind->parameters);
+ if(cbind->paramcount) {
+ int j;
+ for(j = 0; j < cbind->paramcount; j++)
+ free(cbind->parameters[j]);
+ }
if(cbind->channel_access)
free(cbind->channel_access);
free(cbind);
struct cmd_binding *cbind;
for(cbind = cmd_binds[bind_index]; cbind; cbind = cbind->next) {
if(cbind->botid == botid && strcmp(cbind->cmd, cmd) == 0) {
- if(cbind->parameters)
- free(cbind->parameters);
- cbind->parameters = strdup(parameters);
+ if(cbind->paramcount) {
+ int i;
+ for(i = 0; i < cbind->paramcount; i++)
+ 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);
return;
}
}