added support ranking system
[NeonServV5.git] / src / cmd_neonserv_access.c
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);
+}