*** VERSION 5.2.0 ***
[NeonServV5.git] / src / cmd_neonserv_access.c
index aa11b00c2a9b1d244316d0cd3c0b217ae9377fbb..7d253993602cff9ebbec29ea7e5122a52c98c64c 100644 (file)
@@ -1,3 +1,19 @@
+/* cmd_neonserv_access.c - NeonServ v5.2
+ * Copyright (C) 2011  Philipp Kreil (pk910)
+ * 
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License 
+ * along with this program. If not, see <http://www.gnu.org/licenses/>. 
+ */
 
 #include "cmd_neonserv.h"
 
@@ -6,6 +22,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,13 +100,18 @@ 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]);
         //check if the user is already added
         printf_mysql_query("SELECT `chanuser_access`, `chanuser_flags`, `chanuser_infoline` FROM `chanusers` WHERE `chanuser_cid` = '%d' AND `chanuser_uid` = '%d'", chan->channel_id, userid);
         res = mysql_use();
+        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);
+        }
         if ((chanuser_row = mysql_fetch_row(res)) != NULL) {
             //access output
             if(nick)
@@ -113,3 +135,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);
+}