add more information when deleting a user; added zombie channel search
[NeonServV5.git] / src / modules / NeonServ.mod / cmd_neonserv_search.c
index 8f864a18a00059f84231084b02cfce1878604459..12c1b75b3a23013739a0b4b0b87639616798a361 100644 (file)
 #define CMD_SEARCH_FLAG_NOT_NODELETE 0x002
 #define CMD_SEARCH_FLAG_HAS_SUSPENDED 0x004
 #define CMD_SEARCH_FLAG_NOT_SUSPENDED 0x008
-#define CMD_SEARCH_FLAG_IS_JOINED  0x010
-#define CMD_SEARCH_FLAG_NOT_JOINED 0x020
-#define CMD_SEARCH_FLAG_IS_OPPED   0x040
-#define CMD_SEARCH_FLAG_NOT_OPPED  0x080
-#define CMD_SEARCH_FLAG_IS_VOICED  0x100
-#define CMD_SEARCH_FLAG_NOT_VOICED 0x200
+#define CMD_SEARCH_FLAG_IS_JOINED  0x010 /* state */
+#define CMD_SEARCH_FLAG_NOT_JOINED 0x020 /* state */
+#define CMD_SEARCH_FLAG_IS_OPPED   0x040 /* state */
+#define CMD_SEARCH_FLAG_NOT_OPPED  0x080 /* state */
+#define CMD_SEARCH_FLAG_IS_VOICED  0x100 /* state */
+#define CMD_SEARCH_FLAG_NOT_VOICED 0x200 /* state */
+#define CMD_SEARCH_FLAG_IS_ZOMBIE  0x400
+#define CMD_SEARCH_FLAG_NOT_ZOMBIE 0x800
+
 #define CMD_SEARCH_FLAG_STATES     0x3f0
 
 struct neonserv_cmd_search_criteria {
@@ -39,6 +42,8 @@ struct neonserv_cmd_search_criteria {
     unsigned int limit : 16;
 };
 
+static char neonserv_cmd_search_zombie = 0;
+
 CMD_BIND(neonserv_cmd_search) {
     //ok parse the criterias
     struct neonserv_cmd_search_criteria criteria;
@@ -77,6 +82,11 @@ CMD_BIND(neonserv_cmd_search) {
                     criteria.flags |= CMD_SEARCH_FLAG_HAS_SUSPENDED;
                 else
                     criteria.flags |= CMD_SEARCH_FLAG_NOT_SUSPENDED;
+            } else if(!stricmp(argv[i+1], "zombie")) {
+                if(positive)
+                    criteria.flags |= CMD_SEARCH_FLAG_IS_ZOMBIE;
+                else
+                    criteria.flags |= CMD_SEARCH_FLAG_NOT_ZOMBIE;
             }
         }
         else if(!stricmp(argv[i], "state")) {
@@ -110,16 +120,36 @@ CMD_BIND(neonserv_cmd_search) {
         }
     }
     int matches = 0;
+    if((criteria.flags & (CMD_SEARCH_FLAG_IS_ZOMBIE | CMD_SEARCH_FLAG_NOT_ZOMBIE))) {
+        if(neonserv_cmd_search_zombie) {
+            reply(getTextBot(), user, "NS_SEARCH_ZOMBIE_SCAN_IN_PROGRESS");
+            return;
+        }
+        neonserv_cmd_search_zombie = 1;
+    }
+    
     reply(getTextBot(), user, "NS_SEARCH_HEADER");
     MYSQL_RES *res, *res2;
     MYSQL_ROW row, row2;
     printf_mysql_query("SELECT `channel_name`, `user_user`, `channel_registered`, `channel_nodelete`, `suspended`, `channel_id` FROM `bot_channels` LEFT JOIN `bots` ON `bots`.`id` = `botid` LEFT JOIN `channels` ON `chanid` = `channel_id` LEFT JOIN `users` ON `channel_registrator` = `user_id` WHERE `botclass` = '%d' AND `active` = '1'", client->botid);
     res = mysql_use();
+    struct ChanNode *channel;
     while ((row = mysql_fetch_row(res)) != NULL) {
-        if(show_chans && matches == criteria.limit) {
-            //too many
-            break;
+        if((criteria.flags & (CMD_SEARCH_FLAG_IS_ZOMBIE | CMD_SEARCH_FLAG_NOT_ZOMBIE))) {
+            channel = getChanByName(row[0]);
+            if(channel)
+                channel->flags |= CHANFLAG_SCRIPTFLAG1;
+            if(show_chans && matches == criteria.limit) {
+                //too many
+                continue;
+            }
+        } else {
+            if(show_chans && matches == criteria.limit) {
+                //too many
+                break;
+            }
         }
+        if((criteria.flags & CMD_SEARCH_FLAG_IS_ZOMBIE)) continue;
         if(criteria.name && match(criteria.name, row[0])) continue;
         if(criteria.registrar && row[1] && match(criteria.registrar, row[1])) continue;
         if(criteria.unvisited) {
@@ -136,7 +166,8 @@ CMD_BIND(neonserv_cmd_search) {
         if((criteria.flags & CMD_SEARCH_FLAG_HAS_SUSPENDED) && strcmp(row[4], "1")) continue;
         if((criteria.flags & CMD_SEARCH_FLAG_NOT_SUSPENDED) && strcmp(row[4], "0")) continue;
         if((criteria.flags & CMD_SEARCH_FLAG_STATES) || criteria.onchan) {
-            struct ChanNode *channel = getChanByName(row[0]);
+            if(!(criteria.flags & (CMD_SEARCH_FLAG_IS_ZOMBIE | CMD_SEARCH_FLAG_NOT_ZOMBIE)))
+                channel = getChanByName(row[0]);
             if(criteria.onchan) {
                 if(!channel) continue;
                 struct ChanUser *chanuser = NULL;
@@ -171,5 +202,20 @@ CMD_BIND(neonserv_cmd_search) {
             reply(getTextBot(), user, "%s", row[0]);
         }
     }
+    if((criteria.flags & (CMD_SEARCH_FLAG_IS_ZOMBIE | CMD_SEARCH_FLAG_NOT_ZOMBIE))) {
+        struct ChanUser *chanuser;
+        for(chanuser = getUserChannels(client->user, NULL); chanuser; chanuser = getUserChannels(client->user, chanuser)) {
+            channel = chanuser->chan;
+            if(channel->flags & CHANFLAG_SCRIPTFLAG1) {
+                channel->flags &= ~CHANFLAG_SCRIPTFLAG1;
+            } else if((criteria.flags & CMD_SEARCH_FLAG_IS_ZOMBIE)) {
+                matches++;
+                if(show_chans) {
+                    reply(getTextBot(), user, "%s", channel->name);
+                }
+            }
+        }
+    }
+    neonserv_cmd_search_zombie = 0;
     reply(getTextBot(), user, "NS_TABLE_COUNT", matches);
 }