#include "modcmd.h"
#include "IRCEvents.h"
+#include "IRCParser.h"
#include "ClientSocket.h"
#include "UserNode.h"
#include "ChanNode.h"
#include "ChanUser.h"
+#include "WHOHandler.h"
+#include "lang.h"
struct trigger_callback {
int botid;
};
struct command_check_user_cache {
- struct ClientSocket *client;
+ struct ClientSocket *client, *textclient;
struct UserNode *user;
struct ChanNode *chan;
char **argv;
static struct cmd_binding **cmd_binds;
static struct cmd_function *cmd_functions = NULL;
static struct trigger_callback *trigger_callbacks = NULL;
+static struct ClientSocket *tmp_text_client;
+
+static const struct default_language_entry msgtab[] = {
+ {"MODCMD_LESS_PARAM_COUNT", "This command requires more parameters."},
+ {"MODCMD_CHAN_REQUIRED", "You must provide the name of a channel that exists."},
+ {"MODCMD_AUTH_REQUIRED", "You need to be authenticated with AuthServ to use this command."},
+ {"MODCMD_PRIVILEGED", "§b%s§b is a privileged command."},
+
+
+ {NULL, NULL}
+};
static int get_binds_index(char first_char) {
if(tolower(first_char) >= 'a' && tolower(first_char) <= 'z') {
static USERAUTH_CALLBACK(command_checked_auth) {
struct command_check_user_cache *cache = data;
int execute_cmd = 1;
- if((cbind->func->flags & CMDFLAG_REQUIRE_AUTH) && !(user->flags & USERFLAG_ISAUTHED)) {
- //AUTH_REQUIRED
+ tmp_text_client = cache->textclient;
+ if((cache->cbind->func->flags & CMDFLAG_REQUIRE_AUTH) && !(user->flags & USERFLAG_ISAUTHED)) {
+ reply(tmp_text_client, user, "MODCMD_AUTH_REQUIRED");
+ execute_cmd = 0;
+ }
+ else if((cache->cbind->func->flags & CMDFLAG_REQUIRE_GOD) && !isGodMode(user)) {
+ reply(tmp_text_client, user, "MODCMD_PRIVILEGED", cache->cbind->cmd);
execute_cmd = 0;
}
if(execute_cmd) {
- cbind->func->func(cache->client, user, cache->chan, cache->argv, cache->argc);
+ cache->cbind->func->func(cache->client, user, cache->chan, cache->argv, cache->argc);
}
free(cache->message);
free(cache);
struct cmd_binding *cbind;
for(cbind = cmd_binds[bind_index]; cbind; cbind = cbind->next) {
if(cbind->botid == client->botid && strcmp(cbind->cmd, message) == 0) {
+ //get a text bot
+ tmp_text_client = get_prefered_bot(client->botid);
//parse the arguments...
char *arga[MAXNUMPARAMS];
char **argv;
chan = chan2;
}
}
- if(cbind->func->parameters) {
+ if(cbind->parameters) {
//userdefined parameters...
char *uarga[MAXNUMPARAMS];
- char params[strlen(cbind->func->parameters)+1];
- strcpy(params, cbind->func->parameters);
+ char params[strlen(cbind->parameters)+1];
+ strcpy(params, cbind->parameters);
int uargpos = 0, argi, allargs = 0;
- char *ppos = params, *prev_ppos = params;
- while(ppos = strstr(ppos, " ")) {
- ppos = '\0';
+ char *ppos = params;
+ char *prev_ppos = params;
+ while((ppos = strstr(ppos, " "))) {
+ *ppos = '\0';
if(prev_ppos[0] == '%') {
prev_ppos++;
if(prev_ppos[strlen(prev_ppos)-1] == '-') {
prev_ppos[strlen(prev_ppos)-1] = '\0';
} else
allargs = 0;
- if((argi = atoi(prev_ppos)) > 0) {
+ argi = atoi(prev_ppos);
+ if(argi > 0) {
if(argi <= argc) continue;
- uarga[uargpos++] = argv[argi-1]
+ uarga[uargpos++] = argv[argi-1];
if(allargs) {
for(;argi < argc; argi++)
- uarga[uargpos++] = argv[argi-1]
+ uarga[uargpos++] = argv[argi-1];
}
} else if(!strcmp(prev_ppos, "c"))
uarga[uargpos++] = (chan ? chan->name : NULL);
} else {
uarga[uargpos++] = prev_ppos;
}
- ppos = ' ';
ppos++;
prev_ppos = ppos;
}
argc = uargpos;
}
if(argc < cbind->func->paramcount) {
- //LESS_PARAM_COUNT
+ reply(tmp_text_client, user, "MODCMD_LESS_PARAM_COUNT");
break;
}
if((cbind->func->flags & CMDFLAG_REQUIRE_CHAN) && !chan) {
- //CHAN_REQUIRED
+ 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));
data->chan = chan;
data->message = message;
data->cbind = cbind;
- get_userauth(user, command_checked_auth, data)
+ data->textclient = tmp_text_client;
+ get_userauth(user, command_checked_auth, data);
return;
}
if((cbind->func->flags & CMDFLAG_REQUIRE_AUTH) && !(user->flags & USERFLAG_ISAUTHED)) {
- //AUTH_REQUIRED
+ reply(tmp_text_client, user, "MODCMD_AUTH_REQUIRED");
+ break;
+ }
+ if((cbind->func->flags & CMDFLAG_REQUIRE_GOD) && !isGodMode(user)) {
+ reply(tmp_text_client, user, "MODCMD_PRIVILEGED", cbind->cmd);
break;
}
cbind->func->func(client, user, chan, argv, argc);
return 0;
}
+struct ClientSocket *getTextBot() {
+ return tmp_text_client;
+}
+
void init_modcmd() {
cmd_binds = calloc(27, sizeof(*cmd_binds));
bind_chanmsg(got_chanmsg);
bind_privmsg(got_privmsg);
+ register_default_language_table(msgtab);
}
void free_modcmd() {