added more debug output to cmd_nicklist
authorpk910 <philipp@zoelle1.de>
Mon, 20 Aug 2012 21:42:09 +0000 (23:42 +0200)
committerpk910 <philipp@zoelle1.de>
Mon, 20 Aug 2012 21:43:47 +0000 (23:43 +0200)
src/modules/NeonServ.mod/cmd_neonserv_nicklist.c

index c978247e8d30302deff963b81c9ab29f16d756f0..d8fe67a0bc3c52a1a08db348a55bf92867f53666 100644 (file)
 * argv[1]    (optional) nick mask
 */
 static USERLIST_CALLBACK(neonserv_cmd_nicklist_userlist_lookup);
-static void neonserv_cmd_nicklist_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, char *nickmask, int syncusers);
+static void neonserv_cmd_nicklist_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, char *nickmask, int flags);
 static void neonserv_cmd_nicklist_synchronize_user(struct ChanNode *chan, struct UserNode *user, int access);
 
+#define NEONSERV_CMD_NICKLIST_FLAG_SYNCUSERS  0x01
+#define NEONSERV_CMD_NICKLIST_FLAG_NOWHO      0x02
+#define NEONSERV_CMD_NICKLIST_FLAG_VISCOUNT   0x04
+
 struct neonserv_cmd_nicklist_cache {
     struct ClientSocket *client, *textclient;
     struct UserNode *user;
     struct Event *event;
     char *nickmask;
-    int syncusers;
+    int flags;
 };
 
 CMD_BIND(neonserv_cmd_nicklist) {
-    int syncusers = 0;
-    if(argc && !stricmp(argv[0], "sync")) {
-        if(!checkChannelAccess(user, chan, "channel_canadd", 0)) {
-            if(isGodMode(user)) {
-                event->flags |= CMDFLAG_OPLOG;
-            } else {
-                reply(textclient, user, "NS_ACCESS_DENIED");
-                return;
+    int flags = 0;
+    while(argc) {
+        if(!stricmp(argv[0], "sync")) {
+            if(!checkChannelAccess(user, chan, "channel_canadd", 0)) {
+                if(isGodMode(user)) {
+                    event->flags |= CMDFLAG_OPLOG;
+                } else {
+                    reply(textclient, user, "NS_ACCESS_DENIED");
+                    return;
+                }
             }
-        }
+            flags |= NEONSERV_CMD_NICKLIST_FLAG_SYNCUSERS;
+            event->flags |= CMDFLAG_LOG;
+        } else if(argc && !stricmp(argv[0], "nowho") && isGodMode(user)) {
+            flags |= NEONSERV_CMD_NICKLIST_FLAG_NOWHO;
+        } else if(argc && !stricmp(argv[0], "viscount") && isGodMode(user)) {
+            flags |= NEONSERV_CMD_NICKLIST_FLAG_VISCOUNT;
+        } else
+            break;
         argv++;
         argc--;
-        syncusers = 1;
-        event->flags |= CMDFLAG_LOG;
     }
-    if(argc && !stricmp(argv[0], "nowho") && isGodMode(user)) {
-        argv++;
-        argc--;
-        neonserv_cmd_nicklist_async1(client, textclient, user, chan, event, (argc ? argv[0] : NULL), syncusers);
+    if(flags & NEONSERV_CMD_NICKLIST_FLAG_NOWHO) {
+        neonserv_cmd_nicklist_async1(client, textclient, user, chan, event, (argc ? argv[0] : NULL), flags);
         return;
     }
     struct neonserv_cmd_nicklist_cache *cache = malloc(sizeof(*cache));
@@ -68,13 +77,13 @@ CMD_BIND(neonserv_cmd_nicklist) {
         cache->nickmask = strdup(argv[0]);
     } else
         cache->nickmask = NULL;
-    cache->syncusers = syncusers;
+    cache->flags = flags;
     get_userlist_with_invisible(chan, module_id, neonserv_cmd_nicklist_userlist_lookup, cache);
 }
 
 static USERLIST_CALLBACK(neonserv_cmd_nicklist_userlist_lookup) {
     struct neonserv_cmd_nicklist_cache *cache = data;
-    neonserv_cmd_nicklist_async1(cache->client, cache->textclient, cache->user, chan, cache->event, cache->nickmask, cache->syncusers);
+    neonserv_cmd_nicklist_async1(cache->client, cache->textclient, cache->user, chan, cache->event, cache->nickmask, cache->flags);
     if(cache->nickmask)
         free(cache->nickmask);
     free(cache);
@@ -106,11 +115,11 @@ static int neonserv_cmd_nicklist_sort(const void *a, const void *b) {
         return i_a - i_b;
 }
 
-static void neonserv_cmd_nicklist_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, char *nickmask, int syncusers) {
+static void neonserv_cmd_nicklist_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, char *nickmask, int flags) {
     MYSQL_RES *res;
     MYSQL_ROW row, defaults = NULL;
     struct Table *table;
-    char *content[3];
+    char *content[4];
     int userlistlen, i, j;
     int db_enfops, db_enfvoice;
     int caccess, synced_user;
@@ -119,9 +128,15 @@ static void neonserv_cmd_nicklist_async1(struct ClientSocket *client, struct Cli
     int chanuser_count;
     char statebuf[5];
     char accessbuf[9];
+    char viscountbuf[5];
     int uaccess;
     
-    table = table_init(3, chan->usercount + 1, 0);
+    i = 3;
+    if(flags & NEONSERV_CMD_NICKLIST_FLAG_VISCOUNT) {
+        i++;
+        content[3] = "VisCount";
+    }
+    table = table_init(i, chan->usercount + 1, 0);
     content[0] = get_language_string(user, "NS_NICKLIST_NICK");
     content[1] = get_language_string(user, "NS_NICKLIST_STATE");
     content[2] = get_language_string(user, "NS_NICKLIST_ACCESS");
@@ -173,7 +188,7 @@ static void neonserv_cmd_nicklist_async1(struct ClientSocket *client, struct Cli
                 if(!stricmp(chanuser->user->auth, userlist[j][1])) {
                     uaccess = atoi(userlist[j][0]);
                     if((((chanuser->flags & CHANUSERFLAG_OPPED) && uaccess < db_enfops) || ((chanuser->flags & CHANUSERFLAG_VOICED) && uaccess < db_enfvoice)) && !isNetworkService(chanuser->user)) {
-                        if(syncusers) {
+                        if(flags & NEONSERV_CMD_NICKLIST_FLAG_SYNCUSERS) {
                             if((chanuser->flags & CHANUSERFLAG_OPPED) && (db_enfops < caccess || isGodMode(user))) {
                                 if(db_enfops >= caccess)
                                     event->flags |= CMDFLAG_OPLOG;
@@ -203,7 +218,7 @@ static void neonserv_cmd_nicklist_async1(struct ClientSocket *client, struct Cli
             }
         }
         if(!uaccess && (chanuser->flags & CHANUSERFLAG_OPPED_OR_VOICED) && !isNetworkService(chanuser->user)) {
-            if(syncusers) {
+            if(flags & NEONSERV_CMD_NICKLIST_FLAG_SYNCUSERS) {
                 if((chanuser->flags & CHANUSERFLAG_OPPED) && (db_enfops < caccess || isGodMode(user))) {
                     if(db_enfops >= caccess)
                         event->flags |= CMDFLAG_OPLOG;
@@ -230,7 +245,10 @@ static void neonserv_cmd_nicklist_async1(struct ClientSocket *client, struct Cli
         } else if(!uaccess)
             sprintf(accessbuf, "0");
         content[2] = accessbuf;
-        
+        if(flags & NEONSERV_CMD_NICKLIST_FLAG_VISCOUNT) {
+            sprintf(viscountbuf, "%d", chanuser->visCount);
+            content[3] = viscountbuf;
+        }
         table_add(table, content);
     }
     
@@ -244,7 +262,7 @@ static void neonserv_cmd_nicklist_async1(struct ClientSocket *client, struct Cli
     reply(textclient, user, "NS_TABLE_COUNT", table->length - 1);
     table_free(table);
     if(synced_user) {
-        if(!syncusers)
+        if(!(flags & NEONSERV_CMD_NICKLIST_FLAG_SYNCUSERS))
             reply(textclient, user, "NS_NICKLIST_SYNC", db_enfops, db_enfvoice);
         else
             logEvent(event);