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)
`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,
-- --------------------------------------------------------
+--
+-- 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`
--
-- 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
+
{"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}
};
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();
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);
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);
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);
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);
*/
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;
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]);
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
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);
+}
--- /dev/null
+
+#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);
+}
--- /dev/null
+
+#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);
+}
--- /dev/null
+
+#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]);
+}
--- /dev/null
+
+#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]));
+}
--- /dev/null
+
+#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);
+}
#include "mysqlConn.h"
-#define DATABASE_VERSION "1"
+#define DATABASE_VERSION "2"
struct used_result {
MYSQL_RES *result;