From be17e22b842b7b831694422b204777c93fd478bb Mon Sep 17 00:00:00 2001 From: pk910 Date: Sun, 25 Dec 2011 19:15:04 +0100 Subject: [PATCH] added cmd_modcmd --- Makefile.am | 1 + src/bot_NeonServ.c | 3 + src/cmd_global.h | 1 + src/cmd_global_modcmd.c | 141 ++++++++++++++++++++++++++++++++++++++++ src/commands.c | 1 + src/modcmd.c | 16 +++-- 6 files changed, 156 insertions(+), 7 deletions(-) create mode 100644 src/cmd_global_modcmd.c diff --git a/Makefile.am b/Makefile.am index 88f7c77..2b367d5 100644 --- a/Makefile.am +++ b/Makefile.am @@ -124,6 +124,7 @@ neonserv_SOURCES = src/version.c \ src/cmd_global_addbot.c \ src/cmd_global_delbot.c \ src/cmd_global_reconnect.c \ + src/cmd_global_modcmd.c \ src/cmd_funcmds.c \ src/ConfigParser.c diff --git a/src/bot_NeonServ.c b/src/bot_NeonServ.c index 881e6f1..9ec41e4 100644 --- a/src/bot_NeonServ.c +++ b/src/bot_NeonServ.c @@ -361,6 +361,9 @@ static const struct default_language_entry msgtab[] = { {"NS_DELBOT_NOT_FOUND", "Bot with BotID / nick $b%s$b not found."}, /* {ARGS: "NeonServ"} */ {"NS_DELBOT_DONE", "Bot deleted."}, {"NS_RECONNECT_DONE", "Reconnected bot."}, + {"NS_MODCMD_SETTING", "$b%s$b is an unknown modcmd setting."}, /* {ARGS: "strangeSetting"} */ + {"NS_MODCMD_HEADER", "$bSettings for command %s:$b"}, /* {ARGS: "access"} */ + {"NS_MODCMD_OUTRANKED", "$b%s$b outranks you. (required access: %d)"}, /* {ARGS: "die", 1000} */ {NULL, NULL} }; diff --git a/src/cmd_global.h b/src/cmd_global.h index 9134569..4e02810 100644 --- a/src/cmd_global.h +++ b/src/cmd_global.h @@ -46,6 +46,7 @@ CMD_BIND(global_cmd_delbot); CMD_BIND(global_cmd_die); CMD_BIND(global_cmd_emote); CMD_BIND(global_cmd_god); +CMD_BIND(global_cmd_modcmd); CMD_BIND(global_cmd_motd); CMD_BIND(global_cmd_netinfo); CMD_BIND(global_cmd_notice); diff --git a/src/cmd_global_modcmd.c b/src/cmd_global_modcmd.c new file mode 100644 index 0000000..7a3b80b --- /dev/null +++ b/src/cmd_global_modcmd.c @@ -0,0 +1,141 @@ +/* cmd_global_modcmd.c - NeonServ v5.3 + * 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 . + */ + +#include "cmd_global.h" + +/* +* argv[0] command +* argv[1] setting +* argv[2] value +*/ + +static int global_cmd_modcmd_params(struct UserNode *user, struct cmd_binding *cbind, char *value); +static int global_cmd_modcmd_caccess(struct UserNode *user, struct cmd_binding *cbind, char *value); +static int global_cmd_modcmd_oaccess(struct UserNode *user, struct cmd_binding *cbind, char *value); + +CMD_BIND(global_cmd_modcmd) { + MYSQL_RES *res; + MYSQL_ROW row; + struct cmd_binding *cbind = find_botwise_cmd_binding(client->botid, client->clientid, argv[0]); + if (!cbind) { + reply(getTextBot(), user, "NS_UNBIND_NOT_FOUND", argv[0]); + return; + } + int uaccess = 0; + printf_mysql_query("SELECT `user_access` FROM `users` WHERE `user_user` = '%s'", escape_string(user->auth)); + res = mysql_use(); + if ((row = mysql_fetch_row(res)) != NULL) { + uaccess = atoi(row[0]); + } + int gaccess = ((cbind->flags & CMDFLAG_OVERRIDE_GLOBAL_ACCESS) ? cbind->global_access : cbind->func->global_access); + if(gaccess > uaccess) { + reply(getTextBot(), user, "NS_MODCMD_OUTRANKED", cbind->cmd, gaccess); + return; + } + if(argc > 1) { + char *value; + if(argc > 2) { + value = merge_argv(argv, 2, argc); + } else + value = NULL; + int log_event = 0; + if(!stricmp(argv[1], "caccess")) log_event = global_cmd_modcmd_caccess(user, cbind, value); + else if(!stricmp(argv[1], "oaccess")) log_event = global_cmd_modcmd_oaccess(user, cbind, value); + else if(!stricmp(argv[1], "parameters")) log_event = global_cmd_modcmd_params(user, cbind, value); + else { + reply(getTextBot(), user, "NS_MODCMD_SETTING", argv[1]); + } + if(log_event) { + logEvent(event); + } + } else { + reply(getTextBot(), user, "NS_MODCMD_HEADER", cbind->cmd); + global_cmd_modcmd_params(user, cbind, NULL); + global_cmd_modcmd_caccess(user, cbind, NULL); + global_cmd_modcmd_oaccess(user, cbind, NULL); + } +} + +static int global_cmd_modcmd_params(struct UserNode *user, struct cmd_binding *cbind, char *value) { + char parameters[MAXLEN]; + int ret = 0; + if(cbind->paramcount) { + int i, parampos = 0; + for(i = 0; i < cbind->paramcount; i++) { + parampos += sprintf(parameters + parampos, (i ? " %s" : "%s"), cbind->parameters[i]); + } + } else + parameters[0] = '\0'; + if(value) { + if(!strcmp(value, "*")) + value = NULL; + bind_botwise_set_parameters(cbind->botid, cbind->clientid, cbind->cmd, value); + if(cbind->botid == 0) + printf_mysql_query("UPDATE `bot_binds` SET `parameters` = '%s' WHERE `botclass` = '0' AND `botid` = '%d' AND `command` = '%s'", (value ? escape_string(value) : ""), cbind->clientid, escape_string(cbind->cmd)); + else + printf_mysql_query("UPDATE `bot_binds` SET `parameters` = '%s' WHERE `botclass` = '%d' AND `command` = '%s'", (value ? escape_string(value) : ""), cbind->botid, escape_string(cbind->cmd)); + strcpy(parameters, (value ? value : "")); + ret = 1; + } + reply(getTextBot(), user, "\002PARAMETERS \002 %s", parameters); + return ret; +} + +static int global_cmd_modcmd_caccess(struct UserNode *user, struct cmd_binding *cbind, char *value) { + char caccess[MAXLEN]; + int ret = 0; + if(value) { + if(!strcmp(value, "*")) + value = NULL; + bind_botwise_set_channel_access(cbind->botid, cbind->clientid, cbind->cmd, value); + if(cbind->botid == 0) + printf_mysql_query("UPDATE `bot_binds` SET `chan_access` = %s%s%s WHERE `botclass` = '0' AND `botid` = '%d' AND `command` = '%s'", (value ? "'" : ""), (value ? escape_string(value) : "NULL"), (value ? "'" : ""), cbind->clientid, escape_string(cbind->cmd)); + else + printf_mysql_query("UPDATE `bot_binds` SET `chan_access` = %s%s%s WHERE `botclass` = '%d' AND `command` = '%s'", (value ? "'" : ""), (value ? escape_string(value) : "NULL"), (value ? "'" : ""), cbind->botid, escape_string(cbind->cmd)); + + ret = 1; + } + if(cbind->flags & CMDFLAG_OVERRIDE_CHANNEL_ACCESS) + sprintf(caccess, "%s", cbind->channel_access); + else + sprintf(caccess, "\00314%s\003", (cbind->func->channel_access ? cbind->func->channel_access : "0")); + reply(getTextBot(), user, "\002CACCESS \002 %s", caccess); + return ret; +} + +static int global_cmd_modcmd_oaccess(struct UserNode *user, struct cmd_binding *cbind, char *value) { + char oaccess[MAXLEN]; + int ret = 0; + if(value) { + if(!strcmp(value, "*")) + value = NULL; + bind_botwise_set_global_access(cbind->botid, cbind->clientid, cbind->cmd, atoi(value)); + if(cbind->botid == 0) + printf_mysql_query("UPDATE `bot_binds` SET `global_access` = %s%s%s WHERE `botclass` = '0' AND `botid` = '%d' AND `command` = '%s'", (value ? "'" : ""), (value ? escape_string(value) : "NULL"), (value ? "'" : ""), cbind->clientid, escape_string(cbind->cmd)); + else + printf_mysql_query("UPDATE `bot_binds` SET `global_access` = %s%s%s WHERE `botclass` = '%d' AND `command` = '%s'", (value ? "'" : ""), (value ? escape_string(value) : "NULL"), (value ? "'" : ""), cbind->botid, escape_string(cbind->cmd)); + + ret = 1; + } + if(cbind->flags & CMDFLAG_OVERRIDE_GLOBAL_ACCESS) + sprintf(oaccess, "%d", cbind->global_access); + else + sprintf(oaccess, "\00314%d\003", (cbind->func->global_access ? cbind->func->global_access : 0)); + reply(getTextBot(), user, "\002OACCESS \002 %s", oaccess); + return ret; +} + diff --git a/src/commands.c b/src/commands.c index b81728a..8e72f9c 100644 --- a/src/commands.c +++ b/src/commands.c @@ -55,6 +55,7 @@ void register_commands() { OPER_COMMAND("addbot", global_cmd_addbot, 2, 1000, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG | CMDFLAG_REQUIRED); OPER_COMMAND("delbot", global_cmd_delbot, 1, 1000, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG | CMDFLAG_REQUIRED); OPER_COMMAND("reconnect", global_cmd_reconnect, 0, 1000, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG); + OPER_COMMAND("modcmd", global_cmd_modcmd, 1, 900, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG | CMDFLAG_REQUIRED | CMDFLAG_ESCAPE_ARGS); #undef OPER_COMMAND //NeonServ Commands diff --git a/src/modcmd.c b/src/modcmd.c index 6401edf..9af1321 100644 --- a/src/modcmd.c +++ b/src/modcmd.c @@ -856,13 +856,15 @@ void bind_botwise_set_parameters(int botid, int clientid, char *cmd, char *param 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); + if(parameters) { + 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; } } -- 2.20.1