X-Git-Url: http://git.pk910.de/?a=blobdiff_plain;f=src%2Fmodcmd.c;h=d4ed08b1ace4809a3a9794c2fc699a6887905e82;hb=bb5692b9cbff069abbf9573c81e86c3cd2061ceb;hp=9af13218fc32a47f7a12efe713d5b83fadce5763;hpb=be17e22b842b7b831694422b204777c93fd478bb;p=NeonServV5.git diff --git a/src/modcmd.c b/src/modcmd.c index 9af1321..d4ed08b 100644 --- a/src/modcmd.c +++ b/src/modcmd.c @@ -1,5 +1,5 @@ /* 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 @@ -204,7 +204,7 @@ static void handle_command(struct ClientSocket *client, struct UserNode *user, s 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; @@ -224,7 +224,7 @@ static void handle_command(struct ClientSocket *client, struct UserNode *user, s 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) @@ -242,7 +242,7 @@ static void handle_command(struct ClientSocket *client, struct UserNode *user, s } } 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; @@ -307,7 +307,7 @@ static void handle_command(struct ClientSocket *client, struct UserNode *user, s } 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) { @@ -334,11 +334,11 @@ static void handle_command(struct ClientSocket *client, struct UserNode *user, s 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)); @@ -376,8 +376,8 @@ static void handle_command_async(struct ClientSocket *client, struct UserNode *u 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; } @@ -398,8 +398,12 @@ static void handle_command_async(struct ClientSocket *client, struct UserNode *u 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; + } } } } @@ -431,7 +435,7 @@ static void handle_command_async(struct ClientSocket *client, struct UserNode *u 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; @@ -522,7 +526,7 @@ static void handle_command_async(struct ClientSocket *client, struct UserNode *u 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; } @@ -905,6 +909,17 @@ void bind_botwise_set_channel_access(int botid, int clientid, char *cmd, char *c } } +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;