From 29eabaf1a49a1accda939fbdef6dad9bd3356b94 Mon Sep 17 00:00:00 2001 From: pk910 Date: Mon, 3 Oct 2011 14:36:06 +0200 Subject: [PATCH] added support ranking system --- Makefile.am | 5 ++ database.sql | 15 ++++ database.upgrade.sql | 12 ++++ src/bot_NeonServ.c | 20 +++++- src/cmd_neonserv.h | 5 ++ src/cmd_neonserv_access.c | 45 +++++++++++- src/cmd_neonserv_addrank.c | 20 ++++++ src/cmd_neonserv_assignrank.c | 131 ++++++++++++++++++++++++++++++++++ src/cmd_neonserv_delrank.c | 21 ++++++ src/cmd_neonserv_listrank.c | 43 +++++++++++ src/cmd_neonserv_setrank.c | 96 +++++++++++++++++++++++++ src/mysqlConn.c | 2 +- 12 files changed, 412 insertions(+), 3 deletions(-) create mode 100644 src/cmd_neonserv_addrank.c create mode 100644 src/cmd_neonserv_assignrank.c create mode 100644 src/cmd_neonserv_delrank.c create mode 100644 src/cmd_neonserv_listrank.c create mode 100644 src/cmd_neonserv_setrank.c diff --git a/Makefile.am b/Makefile.am index 1cf6ac1..5f8df90 100644 --- a/Makefile.am +++ b/Makefile.am @@ -97,6 +97,11 @@ neonserv_SOURCES = src/version.c \ src/cmd_neonserv_voice.c \ src/cmd_neonserv_voiceall.c \ src/cmd_neonserv_wipeinfo.c \ + src/cmd_neonserv_addrank.c \ + src/cmd_neonserv_assignrank.c \ + src/cmd_neonserv_delrank.c \ + src/cmd_neonserv_listrank.c \ + src/cmd_neonserv_setrank.c \ src/lib/ini.c neonserv_LDADD = $(MYSQL_LIBS) $(WINSOCK_LIBS) diff --git a/database.sql b/database.sql index 94b3d75..01f3a1f 100644 --- a/database.sql +++ b/database.sql @@ -288,6 +288,7 @@ CREATE TABLE IF NOT EXISTS `users` ( `user_id` int(11) NOT NULL AUTO_INCREMENT, `user_user` varchar(250) NOT NULL, `user_access` int(4) NOT NULL, + `user_rank` int(11) NOT NULL, `user_god` tinyint(1) NOT NULL, `user_lang` varchar(6) NOT NULL, `user_reply_privmsg` tinyint(1) NOT NULL, @@ -297,6 +298,20 @@ CREATE TABLE IF NOT EXISTS `users` ( -- -------------------------------------------------------- +-- +-- Tabellenstruktur für Tabelle `support_ranks` +-- + +CREATE TABLE `support_ranks` ( +`rank_id` INT( 11 ) NOT NULL AUTO_INCREMENT PRIMARY KEY , +`rank_name` VARCHAR( 256 ) NOT NULL , +`rank_access` INT( 4 ) NOT NULL , +`rank_info` VARCHAR( 512 ) NOT NULL , +`rank_order` SMALLINT( 4 ) NOT NULL +) ENGINE = MYISAM ; + +-- -------------------------------------------------------- + -- -- Tabellenstruktur für Tabelle `version` -- diff --git a/database.upgrade.sql b/database.upgrade.sql index 23fe2fd..4d1dd2b 100644 --- a/database.upgrade.sql +++ b/database.upgrade.sql @@ -2,3 +2,15 @@ -- version: 1 +CREATE TABLE `support_ranks` ( +`rank_id` INT( 11 ) NOT NULL AUTO_INCREMENT PRIMARY KEY , +`rank_name` VARCHAR( 256 ) NOT NULL , +`rank_access` INT( 4 ) NOT NULL , +`rank_info` VARCHAR( 512 ) NOT NULL , +`rank_order` SMALLINT( 4 ) NOT NULL +) ENGINE = MYISAM ; + +ALTER TABLE `users` ADD `user_rank` INT( 11 ) NOT NULL AFTER `user_access`; + +-- version: 2 + diff --git a/src/bot_NeonServ.c b/src/bot_NeonServ.c index 71f5942..86ec9d8 100644 --- a/src/bot_NeonServ.c +++ b/src/bot_NeonServ.c @@ -265,7 +265,20 @@ static const struct default_language_entry msgtab[] = { {"NS_BOTWAR_REPORTED", "A supporter has been informed to help you preventing botwars in the future."}, {"NS_BOTWAR_ALERT", "$b$k4BOTWAR ALERT:$k$b Botwar in $b%s$b detected. (opponent: $b%s$b) Please join and help them preventing Botwars."}, /* {ARGS: "#TestChan", "OtherBot"} */ {"NS_INVITE_FAIL", "$b%s$b is not registered with %s or suspended."}, /* {ARGS: "#TestChan", "NeonServ"} */ - {"NS_SETACCESS_DONE", "$b%s$b has now %d global access."}, + {"NS_SETACCESS_DONE", "$b%s$b has now %d global access."}, /* {ARGS: "TestUser", 1000} */ + {"NS_ADDRANK_EXISTS", "Another support ranking called '$b%s$b' already exists."}, /* {ARGS: "Supporter"} */ + {"NS_ADDRANK_DONE", "Support ranking '$b%s$b' created."}, /* {ARGS: "Supporter"} */ + {"NS_DELRANK_NOT_FOUND", "There is no support ranking called '$b%s$b'."}, /* {ARGS: "Supporter"} */ + {"NS_DELRANK_DELETED", "Support ranking called '$b%s$b' removed."}, /* {ARGS: "Supporter"} */ + {"NS_LISTRANK_ID", "Id"}, + {"NS_LISTRANK_NAME", "Name"}, + {"NS_LISTRANK_ASSIGNED", "Assigned to"}, + {"NS_LISTRANK_UNRANKED", "There are also %d unranked users with global access."}, /* {ARGS: 10} */ + {"NS_SETRANK_NOT_FOUND", "There is no support ranking with ID '$b%s$b'."}, /* {ARGS: 42} */ + {"NS_SETRANK_HEAD", "Support ranking settings for Id %s:"}, /* {ARGS: 42} */ + {"NS_SETRANK_UNKNOWN_SETTING", "$b%s$b is an unknown support rank setting."}, /* {ARGS: "moep"} */ + {"NS_SETRANK_ORDER_INVALID", "%d is an invalid numeric value. (valid: 1-99)"}, /* {ARGS: 100} */ + {"NS_ASSIGNRANK_DONE", "$b%s$b is now ranked as '$b%s$b'."}, /* {ARGS: "TestUser", "Supporter"} */ {NULL, NULL} }; @@ -482,6 +495,11 @@ void init_NeonServ() { OPER_COMMAND("oplog", neonserv_cmd_oplog, 0, 1, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG); OPER_COMMAND("search", neonserv_cmd_search, 1, 400, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH); OPER_COMMAND("setaccess", neonserv_cmd_setaccess, 2, 1000, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG); + OPER_COMMAND("addrank", neonserv_cmd_addrank, 1, 1000, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG); + OPER_COMMAND("delrank", neonserv_cmd_delrank, 1, 1000, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG); + OPER_COMMAND("setrank", neonserv_cmd_setrank, 1, 1000, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG); + OPER_COMMAND("assignrank", neonserv_cmd_assignrank,2, 1000, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG); + OPER_COMMAND("listrank", neonserv_cmd_listrank, 0, 1000, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG); #undef OPER_COMMAND start_bots(); diff --git a/src/cmd_neonserv.h b/src/cmd_neonserv.h index 6b8fee1..ebee49a 100644 --- a/src/cmd_neonserv.h +++ b/src/cmd_neonserv.h @@ -23,8 +23,10 @@ CMD_BIND(neonserv_cmd_access); CMD_BIND(neonserv_cmd_addban); +CMD_BIND(neonserv_cmd_addrank); CMD_BIND(neonserv_cmd_addtimeban); CMD_BIND(neonserv_cmd_adduser); +CMD_BIND(neonserv_cmd_assignrank); CMD_BIND(neonserv_cmd_ban); CMD_BIND(neonserv_cmd_bans); CMD_BIND(neonserv_cmd_bind); @@ -35,6 +37,7 @@ CMD_BIND(neonserv_cmd_csuspend); CMD_BIND(neonserv_cmd_cunsuspend); CMD_BIND(neonserv_cmd_delban); CMD_BIND(neonserv_cmd_delme); +CMD_BIND(neonserv_cmd_delrank); CMD_BIND(neonserv_cmd_deluser); CMD_BIND(neonserv_cmd_deop); CMD_BIND(neonserv_cmd_deopall); @@ -51,6 +54,7 @@ CMD_BIND(neonserv_cmd_invite); CMD_BIND(neonserv_cmd_inviteme); CMD_BIND(neonserv_cmd_kick); CMD_BIND(neonserv_cmd_kickban); +CMD_BIND(neonserv_cmd_listrank); CMD_BIND(neonserv_cmd_mdeluser); CMD_BIND(neonserv_cmd_mode); CMD_BIND(neonserv_cmd_move); @@ -70,6 +74,7 @@ CMD_BIND(neonserv_cmd_say); CMD_BIND(neonserv_cmd_search); CMD_BIND(neonserv_cmd_set); CMD_BIND(neonserv_cmd_setaccess); +CMD_BIND(neonserv_cmd_setrank); CMD_BIND(neonserv_cmd_suspend); CMD_BIND(neonserv_cmd_topic); CMD_BIND(neonserv_cmd_trace); diff --git a/src/cmd_neonserv_access.c b/src/cmd_neonserv_access.c index aa11b00..fa69f44 100644 --- a/src/cmd_neonserv_access.c +++ b/src/cmd_neonserv_access.c @@ -6,6 +6,7 @@ */ static USERAUTH_CALLBACK(neonserv_cmd_access_nick_lookup); static void neonserv_cmd_access_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, char *nick, char *auth, struct UserNode *target); +static void neonserv_cmd_access_filter_ranking_info(char *info, char *buffer, char *nick, char *auth, char *rank_name); struct neonserv_cmd_access_cache { struct ClientSocket *client, *textclient; @@ -83,7 +84,7 @@ static void neonserv_cmd_access_async1(struct ClientSocket *client, struct Clien MYSQL_RES *res; MYSQL_ROW user_row, chanuser_row; int userid; - printf_mysql_query("SELECT `user_id`, `user_access`, `user_god` FROM `users` WHERE `user_user` = '%s'", escape_string(auth)); + printf_mysql_query("SELECT `user_id`, `user_access`, `user_god`, `user_rank`, `rank_info`, `rank_name` FROM `users` LEFT JOIN `support_ranks` ON `rank_id` = `user_rank` WHERE `user_user` = '%s'", escape_string(auth)); res = mysql_use(); if ((user_row = mysql_fetch_row(res)) != NULL) { userid = atoi(user_row[0]); @@ -101,11 +102,21 @@ static void neonserv_cmd_access_async1(struct ClientSocket *client, struct Clien reply(textclient, user, "NS_A_SUSPENDED", (nick ? nick : auth), chan->name); if(chanuser_row[2] && strcmp(chanuser_row[2], "")) reply(textclient, user, "[%s] %s", (nick ? nick : auth), chanuser_row[2]); + if(strcmp(user_row[3], "0") && strcmp(user_row[4], "")) { + char rank_info[MAXLEN]; + neonserv_cmd_access_filter_ranking_info(user_row[4], rank_info, nick, auth, user_row[5]); + reply(textclient, user, "%s", rank_info); + } } else if(!strcmp(user_row[2], "1")) { if(nick) reply(textclient, user, "NS_A_LACKS_ACCESS_BUT_GOD_AUTH", nick, auth, chan->name); else reply(textclient, user, "NS_A_LACKS_ACCESS_BUT_GOD_NICK", auth, chan->name); + if(strcmp(user_row[3], "0") && strcmp(user_row[4], "")) { + char rank_info[MAXLEN]; + neonserv_cmd_access_filter_ranking_info(user_row[4], rank_info, nick, auth, user_row[5]); + reply(textclient, user, "%s", rank_info); + } } else reply(textclient, user, "NS_NOT_ON_USERLIST", nick, chan->name); } else @@ -113,3 +124,35 @@ static void neonserv_cmd_access_async1(struct ClientSocket *client, struct Clien if(target && (target->flags & USERFLAG_ISIRCOP)) reply(textclient, user, "NS_A_IS_IRCOP", nick); } + +static void neonserv_cmd_access_filter_ranking_info(char *info, char *buffer, char *nick, char *auth, char *rank_name) { + int bufferPos = 0; + char *a, *b = info; + do { + if(!b) break; + a = strstr(b, "$"); + if(a) *a = '\0'; + bufferPos += sprintf(buffer + bufferPos, "%s", b); + if(!a) break; + switch(a[1]) { + case '\0': + a = NULL; + break; + case 'U': + bufferPos += sprintf(buffer + bufferPos, "%s", auth); + break; + case 'N': + bufferPos += sprintf(buffer + bufferPos, "%s", (nick ? nick : auth)); + break; + case 'R': + bufferPos += sprintf(buffer + bufferPos, "%s", rank_name); + break; + default: + buffer[bufferPos++] = '$'; + buffer[bufferPos++] = a[1]; + break; + } + if(a) + b = a+2; + } while(a); +} diff --git a/src/cmd_neonserv_addrank.c b/src/cmd_neonserv_addrank.c new file mode 100644 index 0000000..8df429a --- /dev/null +++ b/src/cmd_neonserv_addrank.c @@ -0,0 +1,20 @@ + +#include "cmd_neonserv.h" + +/* +* argv[0-*] rank name +*/ + +CMD_BIND(neonserv_cmd_addrank) { + char *name = merge_argv(argv, 0, argc); + MYSQL_RES *res; + MYSQL_ROW row; + printf_mysql_query("SELECT `rank_name` FROM `support_ranks` WHERE `rank_name` = '%s'", escape_string(name)); + res = mysql_use(); + if ((row = mysql_fetch_row(res)) != NULL) { + reply(getTextBot(), user, "NS_ADDRANK_EXISTS", row[0]); + return; + } + printf_mysql_query("INSERT INTO `support_ranks` (`rank_name`) VALUES ('%s')", escape_string(name)); + reply(getTextBot(), user, "NS_ADDRANK_EXISTS", name); +} diff --git a/src/cmd_neonserv_assignrank.c b/src/cmd_neonserv_assignrank.c new file mode 100644 index 0000000..c397483 --- /dev/null +++ b/src/cmd_neonserv_assignrank.c @@ -0,0 +1,131 @@ + +#include "cmd_neonserv.h" + +/* +* argv[0] - nick / *auth +* argv[1-*] - rank name +*/ +static AUTHLOOKUP_CALLBACK(neonserv_cmd_assignrank_auth_lookup); +static USERAUTH_CALLBACK(neonserv_cmd_assignrank_nick_lookup); +static void neonserv_cmd_assignrank_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct Event *event, char *nick, char *auth, int rank_id); + +struct neonserv_cmd_assignrank_cache { + struct ClientSocket *client, *textclient; + struct UserNode *user; + struct Event *event; + int rank_id; + char *nick; +}; + +CMD_BIND(neonserv_cmd_assignrank) { + MYSQL_RES *res; + MYSQL_ROW row; + char *name = merge_argv(argv, 0, argc); + int rank_id = 0; + if(stricmp(name, "*") && stricmp(name, "user") && stricmp(name, "none")) { + printf_mysql_query("SELECT `rank_id`, `rank_name` FROM `support_ranks` WHERE `rank_name` = '%s'", escape_string(name)); + res = mysql_use(); + if ((row = mysql_fetch_row(res)) == NULL) { + reply(getTextBot(), user, "NS_DELRANK_NOT_FOUND", name); + return; + } + rank_id = atoi(row[0]); + } + if(argv[0][0] == '*') { + //we've got an auth + argv[0]++; + printf_mysql_query("SELECT `user_user` FROM `users` WHERE `user_user` = '%s'", escape_string(argv[0])); + res = mysql_use(); + if ((row = mysql_fetch_row(res)) != NULL) { + neonserv_cmd_assignrank_async1(client, getTextBot(), user, event, argv[0], row[0], rank_id); + } else { + //we need to create a new user... + //but first lookup the auth to check if it really exists + struct neonserv_cmd_assignrank_cache *cache = malloc(sizeof(*cache)); + if (!cache) { + perror("malloc() failed"); + return; + } + cache->client = client; + cache->textclient = getTextBot(); + cache->user = user; + cache->event = event; + cache->rank_id = rank_id; + cache->nick = strdup(argv[0]); + lookup_authname(argv[0], neonserv_cmd_assignrank_auth_lookup, cache); + } + } else { + struct UserNode *cuser = getUserByNick(argv[0]); + if(!cuser) { + cuser = createTempUser(argv[0]); + cuser->flags |= USERFLAG_ISTMPUSER; + } + if(cuser->flags & USERFLAG_ISAUTHED) { + neonserv_cmd_assignrank_async1(client, getTextBot(), user, event, argv[0], cuser->auth, rank_id); + } else { + struct neonserv_cmd_assignrank_cache *cache = malloc(sizeof(*cache)); + if (!cache) { + perror("malloc() failed"); + return; + } + cache->client = client; + cache->textclient = getTextBot(); + cache->user = user; + cache->event = event; + cache->rank_id = rank_id; + cache->nick = strdup(argv[0]); + get_userauth(cuser, neonserv_cmd_assignrank_nick_lookup, cache); + } + } +} + +static AUTHLOOKUP_CALLBACK(neonserv_cmd_assignrank_auth_lookup) { + struct neonserv_cmd_assignrank_cache *cache = data; + if(!exists) { + //AUTH_DOES_NOT_EXIST + reply(cache->textclient, cache->user, "NS_AUTH_UNKNOWN", cache->nick); + } else + neonserv_cmd_assignrank_async1(cache->client, cache->textclient, cache->user, cache->event, cache->nick, auth, cache->rank_id); + free(cache->nick); + free(cache); +} + +static USERAUTH_CALLBACK(neonserv_cmd_assignrank_nick_lookup) { + struct neonserv_cmd_assignrank_cache *cache = data; + if(!user) { + //USER_DOES_NOT_EXIST + reply(cache->textclient, cache->user, "NS_USER_UNKNOWN", cache->nick); + } + else if(!(user->flags & USERFLAG_ISAUTHED)) { + //USER_NOT_AUTHED + reply(cache->textclient, cache->user, "NS_USER_NEED_AUTH", cache->nick); + } + else + neonserv_cmd_assignrank_async1(cache->client, cache->textclient, cache->user, cache->event, user->nick, user->auth, cache->rank_id); + free(cache->nick); + free(cache); +} + +static void neonserv_cmd_assignrank_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct Event *event, char *nick, char *auth, int rank_id) { + //we've got a valid auth now... + MYSQL_RES *res; + MYSQL_ROW row, rank = NULL; + int caccess = 0; + if(rank_id) { + printf_mysql_query("SELECT `rank_access`, `rank_name` FROM `support_ranks` WHERE `rank_id` = '%d'", rank_id); + res = mysql_use(); + rank = mysql_fetch_row(res); + caccess = atoi(rank[0]); + } + printf_mysql_query("SELECT `user_id`, `user_rank` FROM `users` WHERE `user_user` = '%s'", escape_string(auth)); + res = mysql_use(); + if ((row = mysql_fetch_row(res)) != NULL) { + if(atoi(row[1]) != rank_id) { + printf_mysql_query("UPDATE `users` SET `user_access` = '%d', `user_rank` = '%d' WHERE `user_id` = '%s'", caccess, rank_id, row[0]); + } + } else if(rank_id) { + printf_mysql_query("INSERT INTO `users` (`user_user`, `user_access`, `user_rank`) VALUES ('%s', '%d', '%d')", escape_string(auth), caccess, rank_id); + } + reply(textclient, user, "NS_ASSIGNRANK_DONE", auth, (rank_id ? rank[1] : "*")); + logEvent(event); +} diff --git a/src/cmd_neonserv_delrank.c b/src/cmd_neonserv_delrank.c new file mode 100644 index 0000000..bd92f00 --- /dev/null +++ b/src/cmd_neonserv_delrank.c @@ -0,0 +1,21 @@ + +#include "cmd_neonserv.h" + +/* +* argv[0-*] rank name +*/ + +CMD_BIND(neonserv_cmd_delrank) { + char *name = merge_argv(argv, 0, argc); + MYSQL_RES *res; + MYSQL_ROW row; + printf_mysql_query("SELECT `rank_id`, `rank_name` FROM `support_ranks` WHERE `rank_name` = '%s'", escape_string(name)); + res = mysql_use(); + if ((row = mysql_fetch_row(res)) == NULL) { + reply(getTextBot(), user, "NS_DELRANK_NOT_FOUND", name); + return; + } + printf_mysql_query("UPDATE `users` SET `user_rank` = '0', `user_access` = '0' WHERE `user_rank` = '%s'", row[0]); + printf_mysql_query("REMOVE FROM `support_ranks` WHERE `rank_id` = '%s'", row[0]); + reply(getTextBot(), user, "NS_DELRANK_DELETED", row[1]); +} diff --git a/src/cmd_neonserv_listrank.c b/src/cmd_neonserv_listrank.c new file mode 100644 index 0000000..b2cf904 --- /dev/null +++ b/src/cmd_neonserv_listrank.c @@ -0,0 +1,43 @@ + +#include "cmd_neonserv.h" + +/* +* no arguments +*/ + +CMD_BIND(neonserv_cmd_listrank) { + MYSQL_RES *res, *res2; + MYSQL_ROW row; + struct Table *table; + int ranks = 0; + printf_mysql_query("SELECT `rank_id`, `rank_name` FROM `support_ranks`"); + res = mysql_use(); + table = table_init(3, mysql_num_rows(res) + 1, 0); + char *content[3]; + content[0] = get_language_string(user, "NS_LISTRANK_ID"); + content[1] = get_language_string(user, "NS_LISTRANK_NAME"); + content[2] = get_language_string(user, "NS_LISTRANK_ASSIGNED"); + table_add(table, content); + while ((row = mysql_fetch_row(res)) != NULL) { + ranks++; + content[0] = row[0]; + content[1] = row[1]; + printf_mysql_query("SELECT COUNT(*) FROM `users` WHERE `user_rank` = '%s'", row[0]); + res2 = mysql_use(); + row = mysql_fetch_row(res2); + content[2] = row[0]; + } + //send the table + char **table_lines = table_end(table); + int i; + for(i = 0; i < table->entrys; i++) { + reply(getTextBot(), user, table_lines[i]); + } + if(!ranks) + reply(getTextBot(), user, "NS_TABLE_NONE"); + table_free(table); + printf_mysql_query("SELECT COUNT(*) FROM `users` WHERE `user_rank` = '0' AND `user_access` > 0"); + res2 = mysql_use(); + row = mysql_fetch_row(res2); + reply(getTextBot(), user, "NS_LISTRANK_UNRANKED", atoi(row[0])); +} diff --git a/src/cmd_neonserv_setrank.c b/src/cmd_neonserv_setrank.c new file mode 100644 index 0000000..7c86661 --- /dev/null +++ b/src/cmd_neonserv_setrank.c @@ -0,0 +1,96 @@ + +#include "cmd_neonserv.h" + +/* +* argv[0] rank id +* argv[1] setting +* argv[2-*] value +*/ + +static void neonserv_cmd_setrank_name(struct UserNode *user, int rank_id, char *current, char *value); +static void neonserv_cmd_setrank_info(struct UserNode *user, int rank_id, char *current, char *value); +static void neonserv_cmd_setrank_access(struct UserNode *user, int rank_id, char *current, char *value); +static void neonserv_cmd_setrank_order(struct UserNode *user, int rank_id, char *current, char *value); + +CMD_BIND(neonserv_cmd_setrank) { + MYSQL_RES *res; + MYSQL_ROW row; + printf_mysql_query("SELECT `rank_id`, `rank_name`, `rank_info`, `rank_access`, `rank_order` FROM `support_ranks` WHERE `rank_id` = '%s'", escape_string(argv[0])); + res = mysql_use(); + if ((row = mysql_fetch_row(res)) == NULL) { + reply(getTextBot(), user, "NS_SETRANK_NOT_FOUND", argv[0]); + return; + } + if(argc < 2) { + reply(getTextBot(), user, "NS_SETRANK_HEAD", row[0]); + reply(getTextBot(), user, "\002NAME \002 %s", row[1]); + reply(getTextBot(), user, "\002INFO \002 %s", row[2]); + reply(getTextBot(), user, "\002ACCESS \002 %s", row[3]); + reply(getTextBot(), user, "\002ORDER \002 %s", row[4]); + } else { + char *value = NULL; + if(argc > 2) { + value = merge_argv(argv, 2, argc); + } + if(!stricmp(argv[1], "name")) + neonserv_cmd_setrank_name(user, atoi(row[0]), row[1], value); + else if(!stricmp(argv[1], "info")) + neonserv_cmd_setrank_info(user, atoi(row[0]), row[2], value); + else if(!stricmp(argv[1], "access")) + neonserv_cmd_setrank_access(user, atoi(row[0]), row[3], value); + else if(!stricmp(argv[1], "order")) + neonserv_cmd_setrank_order(user, atoi(row[0]), row[4], value); + else + reply(getTextBot(), user, "NS_SETRANK_UNKNOWN_SETTING", row[1]); + } +} + +static void neonserv_cmd_setrank_name(struct UserNode *user, int rank_id, char *current, char *value) { + if(value && stricmp(value, current)) { + MYSQL_RES *res; + MYSQL_ROW row; + printf_mysql_query("SELECT `rank_id` FROM `support_ranks` WHERE `rank_name` = '%s'", escape_string(value)); + res = mysql_use(); + if ((row = mysql_fetch_row(res)) != NULL) { + reply(getTextBot(), user, "NS_ADDRANK_EXISTS", value); + return; + } + printf_mysql_query("UPDATE `support_ranks` SET `rank_name` = '%s' WHERE `rank_id` = '%d'", escape_string(value), rank_id); + current = value; + } + reply(getTextBot(), user, "\002NAME\002 %s", current); +} + +static void neonserv_cmd_setrank_info(struct UserNode *user, int rank_id, char *current, char *value) { + if(value && stricmp(value, current)) { + printf_mysql_query("UPDATE `support_ranks` SET `rank_info` = '%s' WHERE `rank_id` = '%d'", escape_string(value), rank_id); + current = value; + } + reply(getTextBot(), user, "\002INFO\002 %s", current); +} + +static void neonserv_cmd_setrank_access(struct UserNode *user, int rank_id, char *current, char *value) { + if(value && stricmp(value, current)) { + int new_access = atoi(value); + if(new_access <= 0 || new_access > 1000) { + reply(getTextBot(), user, "NS_INVALID_ACCESS", new_access); + return; + } + printf_mysql_query("UPDATE `support_ranks` SET `rank_access` = '%d' WHERE `rank_id` = '%d'", new_access, rank_id); + current = value; + } + reply(getTextBot(), user, "\002ACCESS\002 %s", current); +} + +static void neonserv_cmd_setrank_order(struct UserNode *user, int rank_id, char *current, char *value) { + if(value && stricmp(value, current)) { + int new_order = atoi(value); + if(new_order <= 0 || new_order > 99) { + reply(getTextBot(), user, "NS_SETRANK_ORDER_INVALID", new_order); + return; + } + printf_mysql_query("UPDATE `support_ranks` SET `rank_order` = '%d' WHERE `rank_id` = '%d'", new_order, rank_id); + current = value; + } + reply(getTextBot(), user, "\002ORDER\002 %s", current); +} diff --git a/src/mysqlConn.c b/src/mysqlConn.c index 7484059..1e1d8d5 100644 --- a/src/mysqlConn.c +++ b/src/mysqlConn.c @@ -1,6 +1,6 @@ #include "mysqlConn.h" -#define DATABASE_VERSION "1" +#define DATABASE_VERSION "2" struct used_result { MYSQL_RES *result; -- 2.20.1