{"MODCMD_PRIVILEGED", "$b%s$b is a privileged command."}, /* {ARGS: "god"} */
{"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"} */
{NULL, NULL}
};
free(cache);
}
+static CMD_BIND(modcmd_linker) {
+ //fake command for subcommands
+ //just empty
+}
+
static void handle_command(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, char *message) {
struct ChanNode *sent_chan = chan;
if(message[0] == '#') {
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->func->func == modcmd_linker) {
+ //links subcommands
+ char command[MAXLEN];
+ struct cmd_binding *parent_bind = cbind;
+ if(args) {
+ char *subcmd = args;
+ args = strstr(args, " ");
+ if(args) {
+ *args = '\0';
+ args++;
+ }
+ sprintf(command, "%s %s", parent_bind->cmd, subcmd);
+ for(cbind = cmd_binds[bind_index]; cbind; cbind = cbind->next) {
+ if(cbind->botid == client->botid && stricmp(cbind->cmd, command) == 0)
+ break;
+ }
+ if(!cbind)
+ break;
+ } else {
+ //list all sub commands
+ int commandlen = sprintf(command, "%s ", parent_bind->cmd);
+ char subcommands[MAXLEN];
+ int subcompos = 0;
+ for(cbind = cmd_binds[bind_index]; cbind; cbind = cbind->next) {
+ if(cbind->botid == client->botid && stricmplen(cbind->cmd, command, commandlen) == 0) {
+ subcompos += sprintf(subcommands + subcompos, (subcompos ? ", %s" : "%s"), cbind->cmd + commandlen);
+ }
+ }
+ reply(tmp_text_client, user, "MODCMD_SUBCOMMANDS", parent_bind->cmd, subcommands);
+ break;
+ }
+ }
if(statistics_enabled)
statistics_commands++;
total_triggered++;
char *arga[MAXNUMPARAMS];
char **argv;
int argc = 0;
+ int escape = 0;
+ int offset = 0;
if(args) {
while(*args) {
//skip leading spaces
arga[argc++] = args;
if (argc >= MAXNUMPARAMS)
break;
- while (*args != ' ' && *args)
+ while ((escape || *args != ' ') && *args) {
+ if((cbind->func->flags & CMDFLAG_ESCAPE_ARGS) && *args == '\\') {
+ escape = 1;
+ offset++;
+ } else if(escape)
+ escape = 0;
+ if(!escape && offset) {
+ args[0 - offset] = args[0];
+ }
args++;
+
+ }
+ if(offset) {
+ args[0-offset] = '\0';
+ offset = 0;
+ }
}
}
argv = arga;
reply(tmp_text_client, user, "MODCMD_PRIVILEGED", cbind->cmd);
return;
}
- struct Event *event = createEvent(client, user, chan, cbind->func->name, argv, argc, eventflags);
+ struct Event *event = createEvent(client, user, chan, cbind, argv, argc, eventflags);
cbind->func->func(client, user, chan, argv, argc, event);
}
bind_chanmsg(got_chanmsg);
bind_privmsg(got_privmsg);
register_default_language_table(msgtab);
+ register_command(0, "linker", modcmd_linker, 0, 0, 0, 0); //fake command for subcommands
}
void free_modcmd() {