X-Git-Url: http://git.pk910.de/?a=blobdiff_plain;f=cmd_neonserv_set.c;h=2801be765045d28d4f21bb40f560b1f7c911b308;hb=795115bf680185ae01043bd1222b78bfed8c1d87;hp=7bba0d0cfa68ecb190adef7147df7840ad2b63e5;hpb=92458cdb1c936fbf64163178d6ea9c080c77c6da;p=NeonServV5.git diff --git a/cmd_neonserv_set.c b/cmd_neonserv_set.c index 7bba0d0..2801be7 100644 --- a/cmd_neonserv_set.c +++ b/cmd_neonserv_set.c @@ -1,10 +1,12 @@ -typedef char* neonserv_cmd_set_function(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, const char *setting, char *argument); -static void neonserv_cmd_set_setting(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, int setting, char *argument); -static char* neonserv_cmd_set_trigger(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, const char *setting, char *argument); -static char* neonserv_cmd_set_modes(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, const char *setting, char *argument); -static char* neonserv_cmd_set_dynlimit(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, const char *setting, char *argument); -static char* neonserv_cmd_set_nodelete(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, const char *setting, char *argument); +#include "cmd_neonserv.h" + +typedef char* neonserv_cmd_set_function(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *argument); +static void neonserv_cmd_set_setting(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, int setting, char *argument); +static char* neonserv_cmd_set_trigger(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *argument); +static char* neonserv_cmd_set_modes(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *argument); +static char* neonserv_cmd_set_dynlimit(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *argument); +static char* neonserv_cmd_set_nodelete(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *argument); #define NS_VALID_FUNCTION 0x01 #define NS_VALID_STRING 0x02 @@ -29,28 +31,28 @@ static const struct { {"ADVANCEDTOPIC", "channel_exttopic", NS_VALID_BOOLEAN | NS_HAS_OPT, NULL}, {"GREETING", "channel_greeting", NS_VALID_STRING, NULL}, {"USERGREETING", "channel_usergreeting", NS_VALID_STRING, NULL}, - {"USERINFO", "channel_userinfo", NS_VALID_ACCESS, NULL}, - {"WIPEINFO", "channel_wipeinfo", NS_VALID_ACCESS, NULL}, + {"USERINFO", "channel_userinfo", NS_VALID_ACCESS | NS_HAS_HELP, NULL}, + {"WIPEINFO", "channel_wipeinfo", NS_VALID_ACCESS | NS_HAS_HELP, NULL}, {"MODES", "channel_modes", NS_VALID_FUNCTION, neonserv_cmd_set_modes}, {"INVITEME", "channel_getinvite", NS_VALID_ACCESS, NULL}, - {"GIVEOPS", "channel_getop", NS_VALID_ACCESS, NULL}, - {"GIVEVOICE", "channel_getvoice", NS_VALID_ACCESS, NULL}, - {"ENFOPS", "channel_canop", NS_VALID_ACCESS, NULL}, - {"ENFVOICE", "channel_canvoice", NS_VALID_ACCESS, NULL}, - {"KICK", "channel_cankick", NS_VALID_ACCESS, NULL}, - {"BAN", "channel_canban", NS_VALID_ACCESS, NULL}, - {"STATICBAN", "channel_staticban", NS_VALID_ACCESS, NULL}, + {"GIVEOPS", "channel_getop", NS_VALID_ACCESS | NS_HAS_HELP, NULL}, + {"GIVEVOICE", "channel_getvoice", NS_VALID_ACCESS | NS_HAS_HELP, NULL}, + {"ENFOPS", "channel_canop", NS_VALID_ACCESS | NS_HAS_HELP, NULL}, + {"ENFVOICE", "channel_canvoice", NS_VALID_ACCESS | NS_HAS_HELP, NULL}, + {"KICK", "channel_cankick", NS_VALID_ACCESS | NS_HAS_HELP, NULL}, + {"BAN", "channel_canban", NS_VALID_ACCESS | NS_HAS_HELP, NULL}, + {"STATICBAN", "channel_staticban", NS_VALID_ACCESS | NS_HAS_HELP, NULL}, {"PUBCMD", "channel_pubcmd", NS_VALID_ACCESS, NULL}, {"ENFMODES", "channel_enfmodes", NS_VALID_ACCESS, NULL}, {"ENFTOPIC", "channel_enftopic", NS_VALID_ACCESS, NULL}, - {"TOPICSNARF", "channel_topicsnarf", NS_VALID_ACCESS, NULL}, - {"CHANGETOPIC", "channel_changetopic", NS_VALID_ACCESS, NULL}, - {"SETTERS", "channel_setters", NS_VALID_ACCESS | NS_VALID_NO501, NULL}, - {"ADDUSER", "channel_canadd", NS_VALID_ACCESS, NULL}, - {"DELUSER", "channel_candel", NS_VALID_ACCESS, NULL}, - {"CLVL", "channel_canclvl", NS_VALID_ACCESS, NULL}, - {"RESYNC", "channel_canresync", NS_VALID_ACCESS, NULL}, - {"SUSPEND", "channel_cansuspend", NS_VALID_ACCESS, NULL}, + {"TOPICSNARF", "channel_topicsnarf", NS_VALID_ACCESS | NS_HAS_HELP, NULL}, + {"CHANGETOPIC", "channel_changetopic", NS_VALID_ACCESS | NS_HAS_HELP, NULL}, + {"SETTERS", "channel_setters", NS_VALID_ACCESS | NS_VALID_NO501 | NS_HAS_HELP, NULL}, + {"ADDUSER", "channel_canadd", NS_VALID_ACCESS | NS_HAS_HELP, NULL}, + {"DELUSER", "channel_candel", NS_VALID_ACCESS | NS_HAS_HELP, NULL}, + {"CLVL", "channel_canclvl", NS_VALID_ACCESS | NS_HAS_HELP, NULL}, + {"RESYNC", "channel_canresync", NS_VALID_ACCESS | NS_HAS_HELP, NULL}, + {"SUSPEND", "channel_cansuspend", NS_VALID_ACCESS | NS_HAS_HELP, NULL}, {"NOTICEUSERS", "channel_notice", NS_VALID_ACCESS, NULL}, {"NOTICEREACTION", "channel_noticereaction", NS_VALID_OPTIONS | NS_HAS_OPT, "4"}, {"CTCPUSERS", "channel_ctcp", NS_VALID_ACCESS, NULL}, @@ -63,14 +65,18 @@ static const struct { }; #define MAX_QUERY_LEN 1024 -static CMD_BIND(neonserv_cmd_set) { +CMD_BIND(neonserv_cmd_set) { int i, j; if(argc && !strcmp(argv[0], "defaults")) { //reset channel settings - int uaccess = getChannelAccess(user, chan, 1); + int uaccess = getChannelAccess(user, chan, 0); if(uaccess < 500) { - reply(getTextBot(), user, "NS_SET_DEFAULTS_OWNER", chan->name); - return; + if(isGodMode(user)) { + event->flags |= CMDFLAG_OPLOG; + } else { + reply(getTextBot(), user, "NS_SET_DEFAULTS_OWNER", chan->name); + return; + } } int seed = 0; char *tmp; @@ -83,7 +89,6 @@ static CMD_BIND(neonserv_cmd_set) { if(argc > 1 && !strcmp(argv[1], defaultskey)) { char query[MAX_QUERY_LEN]; int querypos = 0; - check_mysql(); i = 0; while(channel_settings[i].setting) { if(channel_settings[i].chanfield) @@ -95,6 +100,7 @@ static CMD_BIND(neonserv_cmd_set) { } printf_mysql_query("UPDATE `channels` SET %s WHERE `channel_id` = '%d'", query, chan->channel_id); reply(getTextBot(), user, "NS_SET_DEFAULTS_DONE", chan->name); + logEvent(event); } else { reply(getTextBot(), user, "NS_SET_DEFAULTS_CODE", chan->name, defaultskey); } @@ -108,9 +114,9 @@ static CMD_BIND(neonserv_cmd_set) { //setting found if(channel_settings[i].valid & NS_VALID_FUNCTION) { neonserv_cmd_set_function *func = channel_settings[i].parameter; - func(client, user, chan, channel_settings[i].setting, args); + func(client, user, chan, event, channel_settings[i].setting, args); } else { - neonserv_cmd_set_setting(client, user, chan, i, args); + neonserv_cmd_set_setting(client, user, chan, event, i, args); } j = 1; break; @@ -122,7 +128,6 @@ static CMD_BIND(neonserv_cmd_set) { reply(getTextBot(), user, "NS_SET_UNKNOWN_SETTING", argv[0]); } } else { - check_mysql(); char query[MAX_QUERY_LEN], *value, *org_value, *tmp, nameBuf[64]; int querypos = 0; MYSQL_RES *res, *defaults_res; @@ -152,7 +157,7 @@ static CMD_BIND(neonserv_cmd_set) { org_value = (row[j] ? row[j] : defaults[j]); } else if(channel_settings[i].valid & NS_VALID_FUNCTION) { neonserv_cmd_set_function *func = channel_settings[i].parameter; - org_value = func(client, user, chan, NULL, NULL); + org_value = func(client, user, chan, event, NULL, NULL); } else org_value = "0"; value = org_value; @@ -191,13 +196,12 @@ static CMD_BIND(neonserv_cmd_set) { } } -static void neonserv_cmd_set_setting(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, int setting, char *args) { +static void neonserv_cmd_set_setting(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, int setting, char *args) { char *value; char nameBuf[64]; //get current value MYSQL_RES *res; MYSQL_ROW row; - check_mysql(); printf_mysql_query("SELECT `%s` FROM `channels` WHERE `channel_id` = '%d'", channel_settings[setting].chanfield, chan->channel_id); res = mysql_use(); row = mysql_fetch_row(res); @@ -223,15 +227,23 @@ static void neonserv_cmd_set_setting(struct ClientSocket *client, struct UserNod reply(getTextBot(), user, "NS_INVALID_ACCESS", caccess); return; } - int uaccess = getChannelAccess(user, chan, 1); + int uaccess = getChannelAccess(user, chan, 0); if(uaccess == 500) uaccess++; if(atoi(value) > uaccess) { - reply(getTextBot(), user, "NS_SET_CANNOT_SET"); - return; + if(isGodMode(user)) { + event->flags |= CMDFLAG_OPLOG; + } else { + reply(getTextBot(), user, "NS_SET_CANNOT_SET"); + return; + } } if(caccess > uaccess) { - reply(getTextBot(), user, "NS_SET_BADLEVEL"); - return; + if(isGodMode(user)) { + event->flags |= CMDFLAG_OPLOG; + } else { + reply(getTextBot(), user, "NS_SET_BADLEVEL"); + return; + } } sprintf(nameBuf, "%d", caccess); args = nameBuf; @@ -240,7 +252,7 @@ static void neonserv_cmd_set_setting(struct ClientSocket *client, struct UserNod int options = atoi((char *) channel_settings[setting].parameter); int coption = atoi(args); if(coption < 0 || coption >= options) { - reply(getTextBot(), user, "NS_SET_INVALID_OPTION", args); + reply(getTextBot(), user, "NS_SET_INVALID_OPTION", coption); int i; int nameBufPos = 0; if(valid & NS_HAS_OPT) { @@ -277,6 +289,7 @@ static void neonserv_cmd_set_setting(struct ClientSocket *client, struct UserNod //valid - set it value = args; printf_mysql_query("UPDATE `channels` SET `%s` = '%s' WHERE `channel_id` = '%d'", channel_settings[setting].chanfield, escape_string(value), chan->channel_id); + logEvent(event); } reply(getTextBot(), user, "\002%s\002 %s", channel_settings[setting].setting, value); if(channel_settings[setting].valid & NS_HAS_HELP) { @@ -285,27 +298,31 @@ static void neonserv_cmd_set_setting(struct ClientSocket *client, struct UserNod } } -static char* neonserv_cmd_set_trigger(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, const char *setting, char *argument) { +static char* neonserv_cmd_set_trigger(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *argument) { char *trigger; //get current trigger MYSQL_RES *res; MYSQL_ROW row; - check_mysql(); printf_mysql_query("SELECT `trigger` FROM `bot_channels` WHERE `chanid` = '%d' AND `botid` = '%d'", chan->channel_id, client->clientid); res = mysql_use(); row = mysql_fetch_row(res); trigger = row[0]; if(argument) { - int uaccess = getChannelAccess(user, chan, 1); + int uaccess = getChannelAccess(user, chan, 0); if(uaccess < 500) { - reply(getTextBot(), user, "NS_SET_TRIGGER_OWNER", chan->name); - return NULL; + if(isGodMode(user)) { + event->flags |= CMDFLAG_OPLOG; + } else { + reply(getTextBot(), user, "NS_SET_TRIGGER_OWNER", chan->name); + return NULL; + } } if(strlen(argument) > 15) argument[15] = '\0'; printf_mysql_query("UPDATE `bot_channels` SET `trigger` = '%s' WHERE `chanid` = '%d' AND `botid` = '%d'", escape_string(argument), chan->channel_id, client->clientid); trigger = argument; changeChannelTrigger(client->botid, chan, trigger); + logEvent(event); } if(setting) { reply(getTextBot(), user, "\002%s\002 %s", setting, trigger); @@ -313,12 +330,11 @@ static char* neonserv_cmd_set_trigger(struct ClientSocket *client, struct UserNo return trigger; } -static char* neonserv_cmd_set_modes(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, const char *setting, char *argument) { +static char* neonserv_cmd_set_modes(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *argument) { char *value; //get current value MYSQL_RES *res; MYSQL_ROW row; - check_mysql(); printf_mysql_query("SELECT `channel_modes` FROM `channels` WHERE `channel_id` = '%d'", chan->channel_id); res = mysql_use(); row = mysql_fetch_row(res); @@ -338,13 +354,12 @@ static char* neonserv_cmd_set_modes(struct ClientSocket *client, struct UserNode return value; } -static char* neonserv_cmd_set_dynlimit(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, const char *setting, char *argument) { +static char* neonserv_cmd_set_dynlimit(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *argument) { char *value; char tmp[64]; //get current value MYSQL_RES *res; MYSQL_ROW row; - check_mysql(); printf_mysql_query("SELECT `channel_dynlimit` FROM `channels` WHERE `channel_id` = '%d'", chan->channel_id); res = mysql_use(); row = mysql_fetch_row(res); @@ -361,8 +376,10 @@ static char* neonserv_cmd_set_dynlimit(struct ClientSocket *client, struct UserN printf_mysql_query("UPDATE `channels` SET `channel_dynlimit` = '%s' WHERE `channel_id` = '%d'", escape_string(argument), chan->channel_id); if(strcmp(argument, "0")) putsock(client, "MODE %s +l %d", chan->name, (chan->usercount + atoi(argument))); - else if(isModeSet(chan, 'l')) + else if(isModeSet(chan->modes, 'l')) putsock(client, "MODE %s -l", chan->name); + value = argument; + logEvent(event); } if(setting) { reply(getTextBot(), user, "\002%s\002 %s", setting, value); @@ -370,12 +387,11 @@ static char* neonserv_cmd_set_dynlimit(struct ClientSocket *client, struct UserN return value; } -static char* neonserv_cmd_set_nodelete(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, const char *setting, char *argument) { +static char* neonserv_cmd_set_nodelete(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *argument) { char *value; //get current value MYSQL_RES *res; MYSQL_ROW row; - check_mysql(); printf_mysql_query("SELECT `channel_nodelete` FROM `channels` WHERE `channel_id` = '%d'", chan->channel_id); res = mysql_use(); row = mysql_fetch_row(res); @@ -396,6 +412,9 @@ static char* neonserv_cmd_set_nodelete(struct ClientSocket *client, struct UserN return NULL; } printf_mysql_query("UPDATE `channels` SET `channel_nodelete` = '%s' WHERE `channel_id` = '%d'", escape_string(argument), chan->channel_id); + event->flags |= CMDFLAG_OPLOG; + value = argument; + logEvent(event); } if(setting) { reply(getTextBot(), user, "\002%s\002 %s", setting, value);