added support ranking system
authorpk910 <philipp@zoelle1.de>
Mon, 3 Oct 2011 12:36:06 +0000 (14:36 +0200)
committerpk910 <philipp@zoelle1.de>
Mon, 3 Oct 2011 12:42:23 +0000 (14:42 +0200)
12 files changed:
Makefile.am
database.sql
database.upgrade.sql
src/bot_NeonServ.c
src/cmd_neonserv.h
src/cmd_neonserv_access.c
src/cmd_neonserv_addrank.c [new file with mode: 0644]
src/cmd_neonserv_assignrank.c [new file with mode: 0644]
src/cmd_neonserv_delrank.c [new file with mode: 0644]
src/cmd_neonserv_listrank.c [new file with mode: 0644]
src/cmd_neonserv_setrank.c [new file with mode: 0644]
src/mysqlConn.c

index 1cf6ac18ff09cd029a4c843bc4461d6a2b47efb3..5f8df90ff3541f9c100033ec8aa31d6ade215080 100644 (file)
@@ -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)
index 94b3d757a21afd2dcd293cf3346574afb40f7180..01f3a1f8c0db5c9a5eb3ef9155f0654305036963 100644 (file)
@@ -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`
 --
index 23fe2fd2d7d85c2c212727f50a2bb249c132f8b5..4d1dd2bc26108532b229f8c894c843cdefc79323 100644 (file)
@@ -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
+
index 71f5942d20fd5376fbf9a5db4f8e5604b5b9859a..86ec9d8d1397fc4cdc6122a43bc77864530a9cd2 100644 (file)
@@ -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();
index 6b8fee1b69e2350828d08d3228032e65b46d0d13..ebee49a03897e7c1b14cc8a5013f273a137ef621 100644 (file)
 
 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);
index aa11b00c2a9b1d244316d0cd3c0b217ae9377fbb..fa69f44f05378180e1f5f48259e2e574f720ffbd 100644 (file)
@@ -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 (file)
index 0000000..8df429a
--- /dev/null
@@ -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 (file)
index 0000000..c397483
--- /dev/null
@@ -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 (file)
index 0000000..bd92f00
--- /dev/null
@@ -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 (file)
index 0000000..b2cf904
--- /dev/null
@@ -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 (file)
index 0000000..7c86661
--- /dev/null
@@ -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);
+}
index 7484059af85131488672869a05a6f1c057de967e..1e1d8d5e767f14411d3d09600a869017a9a9a642 100644 (file)
@@ -1,6 +1,6 @@
 
 #include "mysqlConn.h"
-#define DATABASE_VERSION "1"
+#define DATABASE_VERSION "2"
 
 struct used_result {
     MYSQL_RES *result;