From f079e885c28482c8b0160a797442f2adbed940ea Mon Sep 17 00:00:00 2001 From: pk910 Date: Fri, 24 Feb 2012 04:12:52 +0100 Subject: [PATCH] tidied up cmd_uset --- src/modules/NeonServ.mod/cmd_neonserv_uset.c | 352 +++++++++++-------- 1 file changed, 207 insertions(+), 145 deletions(-) diff --git a/src/modules/NeonServ.mod/cmd_neonserv_uset.c b/src/modules/NeonServ.mod/cmd_neonserv_uset.c index cfcfe32..c9c7b5f 100644 --- a/src/modules/NeonServ.mod/cmd_neonserv_uset.c +++ b/src/modules/NeonServ.mod/cmd_neonserv_uset.c @@ -17,168 +17,230 @@ #include "cmd_neonserv.h" +typedef void neonserv_cmd_uset_function(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *argument, MYSQL_ROW defaults); +static void neonserv_cmd_uset_language(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *argument, MYSQL_ROW defaults); +static void neonserv_cmd_uset_noinvite(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *argument, MYSQL_ROW defaults); +static void neonserv_cmd_uset_autoinvite(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *argument, MYSQL_ROW defaults); +static void neonserv_cmd_uset_noautoop(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *argument, MYSQL_ROW defaults); +static void neonserv_cmd_uset_info(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *argument, MYSQL_ROW defaults); + +#define USET_FLAG_GLOBAL 0x01 +#define USET_FLAG_CHANNEL 0x02 +#define USET_FLAG_STAFF 0x04 +#define USET_FLAG_INVISIBLE 0x08 +#define USET_FLAG_DEFAULTS 0x10 + +#define USET_DEFAULTS_QUERY \ + printf_mysql_query("SELECT `chanuser_flags`, `chanuser_infoline`, `chanuser_access`, `channel_getinvite`, `chanuser_id` FROM `chanusers` LEFT JOIN `users` ON `chanuser_uid` = `user_id` LEFT JOIN `channels` ON `channel_id` = `chanuser_cid` WHERE `chanuser_cid` = '%d' AND `user_user` = '%s'", chan->channel_id, escape_string(user->auth)) + +static const struct { + const char *setting; + neonserv_cmd_uset_function *function; + int flags; +} uset_settings[] = { + {"Language", neonserv_cmd_uset_language, USET_FLAG_GLOBAL}, + {"NoInvite", neonserv_cmd_uset_noinvite, USET_FLAG_CHANNEL}, + {"AutoInvite", neonserv_cmd_uset_autoinvite, USET_FLAG_CHANNEL | USET_FLAG_DEFAULTS}, + {"NoAutoOp", neonserv_cmd_uset_noautoop, USET_FLAG_CHANNEL | USET_FLAG_DEFAULTS}, + {"NoAutoVoice", neonserv_cmd_uset_noautoop, USET_FLAG_CHANNEL | USET_FLAG_DEFAULTS | USET_FLAG_INVISIBLE}, //alias of NoAutoOp + {"Info", neonserv_cmd_uset_info, USET_FLAG_CHANNEL | USET_FLAG_DEFAULTS}, + {NULL, NULL, 0} +}; + CMD_BIND(neonserv_cmd_uset) { MYSQL_RES *res; - MYSQL_ROW row; + MYSQL_ROW row = NULL; + int i = 0, j = 0; loadUserSettings(user); if(argc > 0) { - if(!stricmp(argv[0], "language")) { - struct language* lang; - if(argc > 1) { - if((lang = get_language_by_tag(argv[1])) == NULL && (lang = get_language_by_name(argv[1])) == NULL) { - lang = user->language; - } else { - printf_mysql_query("SELECT `user_id` FROM `users` WHERE `user_user` = '%s'", escape_string(user->auth)); - res = mysql_use(); - if ((row = mysql_fetch_row(res)) != NULL) { - printf_mysql_query("UPDATE `users` SET `user_lang` = '%s' WHERE `user_id` = '%s'", escape_string(lang->langtag), row[0]); - } else { - printf_mysql_query("INSERT INTO `users` (`user_user`, `user_lang`) VALUES ('%s', '%s')", escape_string(user->auth), escape_string(lang->langtag)); - } - struct UserNode *cuser; - for(cuser = getAllUsers(NULL); cuser; cuser = getAllUsers(cuser)) { - if((cuser->flags & USERFLAG_ISAUTHED) && !stricmp(user->auth, cuser->auth)) - cuser->language = lang; + char *args = (argc > 1 ? merge_argv(argv, 1, argc) : NULL); + while(uset_settings[i].setting) { + if(!stricmp(uset_settings[i].setting, argv[0])) { + //setting found + if(uset_settings[i].flags & USET_FLAG_CHANNEL) { + if(!chan) + goto neonserv_cmd_uset_err_chan_required; + loadChannelSettings(chan); + if(!(chan->flags & CHANFLAG_CHAN_REGISTERED)) { + neonserv_cmd_uset_err_chan_required: + reply(getTextBot(), user, "MODCMD_CHAN_REQUIRED"); + return; } - } - } else - lang = user->language; - reply(getTextBot(), user, "\002Language \002%s", lang->langname); - char tmp[MAXLEN]; - int tmppos = 0; - lang = get_default_language(); - tmppos = sprintf(tmp, "%s (%s)", lang->langname, lang->langtag); - printf_mysql_query("SELECT `lang`,`text` FROM `language` WHERE `ident` = 'name'"); - res = mysql_use(); - while((row = mysql_fetch_row(res)) != NULL) { - tmppos += sprintf(tmp + tmppos, ", %s (%s)", row[1], row[0]); - } - reply(getTextBot(), user, " %s", tmp); - } else if(!stricmp(argv[0], "noinvite") && chan) { - loadChannelSettings(chan); - if(!(chan->flags & CHANFLAG_CHAN_REGISTERED)) { - reply(getTextBot(), user, "MODCMD_CHAN_REQUIRED"); - return; - } - printf_mysql_query("SELECT `id` FROM `noinvite` LEFT JOIN `users` ON `uid` = `user_id` WHERE `cid` = '%d' AND `user_user` = '%s'", chan->channel_id, escape_string(user->auth)); - res = mysql_use(); - row = mysql_fetch_row(res); - int noinvite = (row ? 1 : 0); - if(argc > 1) { - if(!strcmp(argv[1], "0") || !stricmp(argv[1], "off") || !stricmp(argv[1], get_language_string(user, "NS_SET_OFF"))) { - if(noinvite) { - printf_mysql_query("DELETE FROM `noinvite` WHERE `id` = '%s'", row[0]); - noinvite = 0; - } - } else if(!strcmp(argv[1], "1") || !stricmp(argv[1], "on") || !stricmp(argv[1], get_language_string(user, "NS_SET_ON"))) { - if(!noinvite) { - int userid; - printf_mysql_query("SELECT `user_id` FROM `users` WHERE `user_user` = '%s'", escape_string(user->auth)); + if((uset_settings[i].flags & USET_FLAG_DEFAULTS) && !row) { + USET_DEFAULTS_QUERY; res = mysql_use(); - if ((row = mysql_fetch_row(res)) != NULL) { - userid = atoi(row[0]); - } else { - printf_mysql_query("INSERT INTO `users` (`user_user`) VALUES ('%s')", escape_string(user->auth)); - userid = (int) mysql_insert_id(get_mysql_conn()); + row = mysql_fetch_row(res); + if(!row) { + reply(getTextBot(), user, "NS_NOT_ON_USERLIST_YOU", chan->name); + return; } - printf_mysql_query("INSERT INTO `noinvite` (`uid`, `cid`) VALUES ('%d', '%d')", userid, chan->channel_id); - noinvite = 1; } } + neonserv_cmd_uset_function *func = uset_settings[i].function; + func(client, user, chan, event, uset_settings[i].setting, args, row); + j = 1; + break; } - reply(getTextBot(), user, "\002NoInvite \002%s", (noinvite ? get_language_string(user, "NS_SET_ON") : get_language_string(user, "NS_SET_OFF"))); - } else if((!stricmp(argv[0], "autoinvite") || !stricmp(argv[0], "noautoop") || !stricmp(argv[0], "info")) && chan) { - loadChannelSettings(chan); - if(!(chan->flags & CHANFLAG_CHAN_REGISTERED)) { - reply(getTextBot(), user, "MODCMD_CHAN_REQUIRED"); - return; - } - printf_mysql_query("SELECT `chanuser_flags`, `chanuser_infoline`, `chanuser_access`, `channel_getinvite`, `chanuser_id` FROM `chanusers` LEFT JOIN `users` ON `chanuser_uid` = `user_id` LEFT JOIN `channels` ON `channel_id` = `chanuser_cid` WHERE `chanuser_cid` = '%d' AND `user_user` = '%s'", chan->channel_id, escape_string(user->auth)); - res = mysql_use(); - row = mysql_fetch_row(res); - if(row) { - int flags = atoi(row[0]); - if(!stricmp(argv[0], "autoinvite")) { - int getInvite = 0; - if(!row[3] && atoi(row[2]) >= atoi(getChanDefault("channel_getinvite"))) - getInvite = 1; - else if(row[3] && atoi(row[2]) >= atoi(row[3])) - getInvite = 1; - if(getInvite && argc > 1) { - if(!strcmp(argv[1], "0") || !stricmp(argv[1], "off") || !stricmp(argv[1], get_language_string(user, "NS_SET_OFF"))) { - if(flags & DB_CHANUSER_AUTOINVITE) { - flags &= ~DB_CHANUSER_AUTOINVITE; - printf_mysql_query("UPDATE `chanusers` SET `chanuser_flags` = '%d' WHERE `chanuser_id` = '%s'", flags, row[4]); - } - } else if(!strcmp(argv[1], "1") || !stricmp(argv[1], "on") || !stricmp(argv[1], get_language_string(user, "NS_SET_ON"))) { - if(!(flags & DB_CHANUSER_AUTOINVITE)) { - flags |= DB_CHANUSER_AUTOINVITE; - printf_mysql_query("UPDATE `chanusers` SET `chanuser_flags` = '%d' WHERE `chanuser_id` = '%s'", flags, row[4]); - } - } - } - if(getInvite) - reply(getTextBot(), user, "\002AutoInvite \002%s", ((flags & DB_CHANUSER_AUTOINVITE) ? get_language_string(user, "NS_SET_ON") : get_language_string(user, "NS_SET_OFF"))); - else - reply(getTextBot(), user, "\002AutoInvite \002%s", get_language_string(user, "NS_USET_NO_ACCESS")); - } else if(!stricmp(argv[0], "noautoop")) { - if(argc > 1) { - if(!strcmp(argv[1], "0") || !stricmp(argv[1], "off") || !stricmp(argv[1], get_language_string(user, "NS_SET_OFF"))) { - if(flags & DB_CHANUSER_NOAUTOOP) { - flags &= ~DB_CHANUSER_NOAUTOOP; - printf_mysql_query("UPDATE `chanusers` SET `chanuser_flags` = '%d' WHERE `chanuser_id` = '%s'", flags, row[4]); - } - } else if(!strcmp(argv[1], "1") || !stricmp(argv[1], "on") || !stricmp(argv[1], get_language_string(user, "NS_SET_ON"))) { - if(!(flags & DB_CHANUSER_NOAUTOOP)) { - flags |= DB_CHANUSER_NOAUTOOP; - printf_mysql_query("UPDATE `chanusers` SET `chanuser_flags` = '%d' WHERE `chanuser_id` = '%s'", flags, row[4]); - } - } - } - reply(getTextBot(), user, "\002NoAutoOp \002%s", ((flags & DB_CHANUSER_NOAUTOOP) ? get_language_string(user, "NS_SET_ON") : get_language_string(user, "NS_SET_OFF"))); - } else if(!stricmp(argv[0], "info")) { - char *infoline; - if(argc > 1) { - infoline = merge_argv(argv, 1, argc); - if(!strcmp(infoline, "*")) - infoline = ""; - printf_mysql_query("UPDATE `chanusers` SET `chanuser_infoline` = '%s' WHERE `chanuser_id` = '%s'", escape_string(infoline), row[4]); - } else - infoline = row[1]; - reply(getTextBot(), user, "\002Info \002%s", infoline); - } - } else - reply(getTextBot(), user, "NS_NOT_ON_USERLIST_YOU", chan); - } else + i++; + } + if(j == 0) { + //unknown setting reply(getTextBot(), user, "NS_USET_UNKNOWN_SETTING", argv[0]); + } } else { //view all options reply(getTextBot(), user, "NS_USET_GLOBAL"); - reply(getTextBot(), user, "\002Language \002%s", user->language->langname); + while(uset_settings[i].setting) { + if((uset_settings[i].flags & (USET_FLAG_INVISIBLE | USET_FLAG_GLOBAL)) == USET_FLAG_GLOBAL) { + neonserv_cmd_uset_function *func = uset_settings[i].function; + func(client, user, chan, event, uset_settings[i].setting, NULL, row); + } + i++; + } if(!chan) return; loadChannelSettings(chan); if(!(chan->flags & CHANFLAG_CHAN_REGISTERED)) return; reply(getTextBot(), user, "NS_USET_CHANNEL"); - printf_mysql_query("SELECT `id` FROM `noinvite` LEFT JOIN `users` ON `uid` = `user_id` WHERE `cid` = '%d' AND `user_user` = '%s'", chan->channel_id, escape_string(user->auth)); - res = mysql_use(); - row = mysql_fetch_row(res); - reply(getTextBot(), user, "\002NoInvite \002%s", (row ? get_language_string(user, "NS_SET_ON") : get_language_string(user, "NS_SET_OFF"))); - printf_mysql_query("SELECT `chanuser_flags`, `chanuser_infoline`, `chanuser_access`, `channel_getinvite` FROM `chanusers` LEFT JOIN `users` ON `chanuser_uid` = `user_id` LEFT JOIN `channels` ON `channel_id` = `chanuser_cid` WHERE `chanuser_cid` = '%d' AND `user_user` = '%s'", chan->channel_id, escape_string(user->auth)); - res = mysql_use(); - row = mysql_fetch_row(res); - if(row) { - int flags = atoi(row[0]); - int getInvite = 0; - if(!row[3] && atoi(row[2]) >= atoi(getChanDefault("channel_getinvite"))) - getInvite = 1; - else if(row[3] && atoi(row[2]) >= atoi(row[3])) - getInvite = 1; - if(getInvite) - reply(getTextBot(), user, "\002AutoInvite \002%s", ((flags & DB_CHANUSER_AUTOINVITE) ? get_language_string(user, "NS_SET_ON") : get_language_string(user, "NS_SET_OFF"))); - else - reply(getTextBot(), user, "\002AutoInvite \002%s", get_language_string(user, "NS_USET_NO_ACCESS")); - reply(getTextBot(), user, "\002NoAutoOp \002%s", ((flags & DB_CHANUSER_NOAUTOOP) ? get_language_string(user, "NS_SET_ON") : get_language_string(user, "NS_SET_OFF"))); - reply(getTextBot(), user, "\002Info \002%s", row[1]); + i = 0; + while(uset_settings[i].setting) { + if((uset_settings[i].flags & (USET_FLAG_INVISIBLE | USET_FLAG_CHANNEL)) == USET_FLAG_CHANNEL) { + if((uset_settings[i].flags & USET_FLAG_DEFAULTS) && !row) { + USET_DEFAULTS_QUERY; + res = mysql_use(); + row = mysql_fetch_row(res); + if(!row) { + i++; + continue; + } + } + neonserv_cmd_uset_function *func = uset_settings[i].function; + func(client, user, chan, event, uset_settings[i].setting, NULL, row); + } + i++; } } -} \ No newline at end of file +} + +static void neonserv_cmd_uset_language(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *argument, MYSQL_ROW defaults) { + MYSQL_RES *res; + MYSQL_ROW row; + struct language* lang; + if(argument) { + if((lang = get_language_by_tag(argument)) == NULL && (lang = get_language_by_name(argument)) == NULL) { + lang = user->language; + } else { + printf_mysql_query("SELECT `user_id` FROM `users` WHERE `user_user` = '%s'", escape_string(user->auth)); + res = mysql_use(); + if ((row = mysql_fetch_row(res)) != NULL) { + printf_mysql_query("UPDATE `users` SET `user_lang` = '%s' WHERE `user_id` = '%s'", escape_string(lang->langtag), row[0]); + } else { + printf_mysql_query("INSERT INTO `users` (`user_user`, `user_lang`) VALUES ('%s', '%s')", escape_string(user->auth), escape_string(lang->langtag)); + } + struct UserNode *cuser; + for(cuser = getAllUsers(NULL); cuser; cuser = getAllUsers(cuser)) { + if((cuser->flags & USERFLAG_ISAUTHED) && !stricmp(user->auth, cuser->auth)) + cuser->language = lang; + } + } + } else + lang = user->language; + reply(getTextBot(), user, "\002Language \002%s", lang->langname); + char tmp[MAXLEN]; + int tmppos = 0; + lang = get_default_language(); + tmppos = sprintf(tmp, "%s (%s)", lang->langname, lang->langtag); + printf_mysql_query("SELECT `lang`,`text` FROM `language` WHERE `ident` = 'name'"); + res = mysql_use(); + while((row = mysql_fetch_row(res)) != NULL) { + tmppos += sprintf(tmp + tmppos, ", %s (%s)", row[1], row[0]); + } + reply(getTextBot(), user, " %s", tmp); +} + +static void neonserv_cmd_uset_noinvite(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *argument, MYSQL_ROW defaults) { + MYSQL_RES *res; + MYSQL_ROW row; + printf_mysql_query("SELECT `id` FROM `noinvite` LEFT JOIN `users` ON `uid` = `user_id` WHERE `cid` = '%d' AND `user_user` = '%s'", chan->channel_id, escape_string(user->auth)); + res = mysql_use(); + row = mysql_fetch_row(res); + int noinvite = (row ? 1 : 0); + if(argument) { + if(!strcmp(argument, "0") || !stricmp(argument, "off") || !stricmp(argument, get_language_string(user, "NS_SET_OFF"))) { + if(noinvite) { + printf_mysql_query("DELETE FROM `noinvite` WHERE `id` = '%s'", row[0]); + noinvite = 0; + } + } else if(!strcmp(argument, "1") || !stricmp(argument, "on") || !stricmp(argument, get_language_string(user, "NS_SET_ON"))) { + if(!noinvite) { + int userid; + printf_mysql_query("SELECT `user_id` FROM `users` WHERE `user_user` = '%s'", escape_string(user->auth)); + res = mysql_use(); + if ((row = mysql_fetch_row(res)) != NULL) { + userid = atoi(row[0]); + } else { + printf_mysql_query("INSERT INTO `users` (`user_user`) VALUES ('%s')", escape_string(user->auth)); + userid = (int) mysql_insert_id(get_mysql_conn()); + } + printf_mysql_query("INSERT INTO `noinvite` (`uid`, `cid`) VALUES ('%d', '%d')", userid, chan->channel_id); + noinvite = 1; + } + } + } + reply(getTextBot(), user, "\002NoInvite \002%s", (noinvite ? get_language_string(user, "NS_SET_ON") : get_language_string(user, "NS_SET_OFF"))); +} + +static void neonserv_cmd_uset_autoinvite(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *argument, MYSQL_ROW defaults) { + int flags = atoi(defaults[0]); + int getInvite = 0; + if(!defaults[3] && atoi(defaults[2]) >= atoi(getChanDefault("channel_getinvite"))) + getInvite = 1; + else if(defaults[3] && atoi(defaults[2]) >= atoi(defaults[3])) + getInvite = 1; + if(getInvite && argument) { + if(!strcmp(argument, "0") || !stricmp(argument, "off") || !stricmp(argument, get_language_string(user, "NS_SET_OFF"))) { + if(flags & DB_CHANUSER_AUTOINVITE) { + flags &= ~DB_CHANUSER_AUTOINVITE; + printf_mysql_query("UPDATE `chanusers` SET `chanuser_flags` = '%d' WHERE `chanuser_id` = '%s'", flags, defaults[4]); + } + } else if(!strcmp(argument, "1") || !stricmp(argument, "on") || !stricmp(argument, get_language_string(user, "NS_SET_ON"))) { + if(!(flags & DB_CHANUSER_AUTOINVITE)) { + flags |= DB_CHANUSER_AUTOINVITE; + printf_mysql_query("UPDATE `chanusers` SET `chanuser_flags` = '%d' WHERE `chanuser_id` = '%s'", flags, defaults[4]); + } + } + } + if(getInvite) + reply(getTextBot(), user, "\002AutoInvite \002%s", ((flags & DB_CHANUSER_AUTOINVITE) ? get_language_string(user, "NS_SET_ON") : get_language_string(user, "NS_SET_OFF"))); + else + reply(getTextBot(), user, "\002AutoInvite \002%s", get_language_string(user, "NS_USET_NO_ACCESS")); +} + +static void neonserv_cmd_uset_noautoop(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *argument, MYSQL_ROW defaults) { + int flags = atoi(defaults[0]); + if(argument) { + if(!strcmp(argument, "0") || !stricmp(argument, "off") || !stricmp(argument, get_language_string(user, "NS_SET_OFF"))) { + if(flags & DB_CHANUSER_NOAUTOOP) { + flags &= ~DB_CHANUSER_NOAUTOOP; + printf_mysql_query("UPDATE `chanusers` SET `chanuser_flags` = '%d' WHERE `chanuser_id` = '%s'", flags, defaults[4]); + } + } else if(!strcmp(argument, "1") || !stricmp(argument, "on") || !stricmp(argument, get_language_string(user, "NS_SET_ON"))) { + if(!(flags & DB_CHANUSER_NOAUTOOP)) { + flags |= DB_CHANUSER_NOAUTOOP; + printf_mysql_query("UPDATE `chanusers` SET `chanuser_flags` = '%d' WHERE `chanuser_id` = '%s'", flags, defaults[4]); + } + } + } + reply(getTextBot(), user, "\002NoAutoOp \002%s", ((flags & DB_CHANUSER_NOAUTOOP) ? get_language_string(user, "NS_SET_ON") : get_language_string(user, "NS_SET_OFF"))); +} + +static void neonserv_cmd_uset_info(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *argument, MYSQL_ROW defaults) { + char *infoline; + if(argument) { + infoline = argument; + if(!strcmp(infoline, "*")) + infoline = ""; + printf_mysql_query("UPDATE `chanusers` SET `chanuser_infoline` = '%s' WHERE `chanuser_id` = '%s'", escape_string(infoline), defaults[4]); + } else + infoline = defaults[1]; + reply(getTextBot(), user, "\002Info \002%s", infoline); +} -- 2.20.1