struct trigger_callback *next;
};
+struct cmd_bot_alias {
+ int botid;
+ char *alias;
+
+ struct cmd_bot_alias *next;
+};
+
struct command_check_user_cache {
struct ClientSocket *client, *textclient;
struct UserNode *user;
static struct cmd_binding **cmd_binds;
static struct cmd_function *cmd_functions = NULL;
static struct trigger_callback *trigger_callbacks = NULL;
+static struct cmd_bot_alias *bot_aliases = NULL;
static struct ClientSocket *tmp_text_client;
static const struct default_language_entry msgtab[] = {
struct cmd_binding *cbind;
for(cbind = cmd_binds[bind_index]; cbind; cbind = cbind->next) {
if(cbind->botid == client->botid && stricmp(cbind->cmd, message) == 0) {
+ if((cbind->flags & CMDFLAG_FUNCMD)) {
+ if(!sent_chan)
+ break;
+ chan = sent_chan;
+ }
//get a text bot
tmp_text_client = get_prefered_bot(client->botid);
//parse the arguments...
int register_command(int botid, char *name, 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 && strcmp(cmdfunc->name, name) == 0)
+ if((cmdfunc->botid == botid || cmdfunc->botid == 0) && strcmp(cmdfunc->name, name) == 0)
return 0;
}
cmdfunc = malloc(sizeof(*cmdfunc));
int bind_cmd_to_command(int botid, char *cmd, char *func) {
struct cmd_function *cmdfunc;
+ int fbotid = botid;
+ char *c;
+ if((c = strstr(func, "."))) {
+ *c = '\0';
+ struct cmd_bot_alias *botalias;
+ for(botalias = bot_aliases; botalias; botalias = botalias->next) {
+ if(!stricmp(botalias->alias, func)) {
+ fbotid = botalias->botid;
+ break;
+ }
+ }
+ *c = '.';
+ func = c+1;
+ }
for(cmdfunc = cmd_functions; cmdfunc; cmdfunc = cmdfunc->next) {
- if(cmdfunc->botid == botid && strcmp(cmdfunc->name, func) == 0)
+ if((cmdfunc->botid == fbotid || cmdfunc->botid == 0) && strcmp(cmdfunc->name, func) == 0)
break;
}
if(!cmdfunc) return 0;
struct cmd_function *find_cmd_function(int botid, char *name) {
struct cmd_function *cmdfunc;
+ char *c;
+ if((c = strstr(name, "."))) {
+ *c = '\0';
+ struct cmd_bot_alias *botalias;
+ for(botalias = bot_aliases; botalias; botalias = botalias->next) {
+ if(!stricmp(botalias->alias, name)) {
+ botid = botalias->botid;
+ break;
+ }
+ }
+ *c = '.';
+ name = c+1;
+ }
for(cmdfunc = cmd_functions; cmdfunc; cmdfunc = cmdfunc->next) {
- if(cmdfunc->botid == botid && stricmp(cmdfunc->name, name) == 0)
+ if((cmdfunc->botid == botid || cmdfunc->botid == 0) && stricmp(cmdfunc->name, name) == 0)
break;
}
return cmdfunc;
next_cb = cb->next;
free(next_cb);
}
+ struct cmd_bot_alias *botalias, *next_botalias;
+ for(botalias = bot_aliases; botalias; botalias = next_botalias) {
+ next_botalias = botalias->next;
+ free(botalias->alias);
+ free(botalias);
+ }
cmd_functions = NULL;
trigger_callbacks = NULL;
+ bot_aliases = NULL;
}
void bind_set_parameters(int botid, char *cmd, char *parameters) {
int i, found;
struct cmd_binding *cbind;
for(cmdfunc = cmd_functions; cmdfunc; cmdfunc = cmdfunc->next) {
- if(cmdfunc->botid == botid && (cmdfunc->flags & CMDFLAG_REQUIRED)) {
+ if((cmdfunc->flags & CMDFLAG_REQUIRED)) {
found = 0;
for(i = 0; i < 27; i++) {
for(cbind = cmd_binds[i]; cbind; cbind = cbind->next) {
}
}
+void register_command_alias(int botid, char *alias) {
+ struct cmd_bot_alias *botalias;
+ for(botalias = bot_aliases; botalias; botalias = botalias->next) {
+ if(!stricmp(botalias->alias, alias))
+ return;
+ }
+ botalias = malloc(sizeof(*botalias));
+ if (!botalias) {
+ perror("malloc() failed");
+ return;
+ }
+ botalias->botid = botid;
+ botalias->alias = strdup(alias);
+ botalias->next = bot_aliases;
+ bot_aliases = botalias;
+}
+
+struct cmd_binding *getAllBinds(struct cmd_binding *last) {
+ int bind_index;
+ if(last) {
+ if(last->next)
+ return last->next;
+ bind_index = get_binds_index(last->cmd[0]) + 1;
+ if(bind_index > 26)
+ return NULL;
+ } else
+ bind_index = 0;
+ do {
+ if(cmd_binds[bind_index])
+ return cmd_binds[bind_index];
+ bind_index++;
+ } while(bind_index < 27);
+ return NULL;
+}