add more information when deleting a user; added zombie channel search
authorpk910 <philipp@zoelle1.de>
Sun, 29 Apr 2012 12:14:33 +0000 (14:14 +0200)
committerpk910 <philipp@zoelle1.de>
Sun, 29 Apr 2012 12:19:32 +0000 (14:19 +0200)
src/ChanNode.h
src/main.c
src/modules/NeonServ.mod/bot_NeonServ.c
src/modules/NeonServ.mod/cmd_neonserv_search.c
src/modules/NeonSpam.mod/bot_NeonSpam.c

index 9a2c8c2b24e5db4546c12824cdd347f3a1d7ab35..756a6b4a28571f3d9243c8b726bdf8a63e5a4650 100644 (file)
@@ -29,6 +29,8 @@ struct NeonSpamSettings;
 #define CHANFLAG_HAVE_INVISIBLES    0x08
 #define CHANFLAG_REJOINING          0x10
 
+#define CHANFLAG_SCRIPTFLAG1        0x80 /* used by neonserv_cmd_search */
+
 struct ChanNode {
     char name[CHANNELLEN+1];
     char topic[TOPICLEN+1];
index 1292a82c7c627c68e6241e80e3dab80fcaf18774..f3afaaf8a18c97a9bfd50a452eac5c2bd2a9feb5 100644 (file)
@@ -437,10 +437,16 @@ static AUTHLOOKUP_CALLBACK(main_checkauths_callback) {
             deleteUser(atoi(row[0]));
             char *alertchan = get_string_field("General.CheckAuths.alertchan");
             if(alertchan) {
+                char reason[MAXLEN];
+                if(!exists) {
+                    strcpy(reason, "USER_NOT_EXISTS");
+                } else {
+                    sprintf(reason, "USER_REGISTERED_MISSMATCH: %lu, expected %d (diff: %d)", (unsigned long) registered, atoi(row[1]), diff);
+                }
                 struct ChanNode *alertchan_chan = getChanByName(alertchan);
                 struct ClientSocket *alertclient;
                 if(alertchan_chan && (alertclient = getChannelBot(alertchan_chan, 0)) != NULL) {
-                    putsock(alertclient, "PRIVMSG %s :Deleted User %s", alertchan_chan->name, auth);
+                    putsock(alertclient, "PRIVMSG %s :Deleted User %s (%s)", alertchan_chan->name, auth, reason);
                 }
             }
         } else if(exists && !strcmp(row[1], "0")) {
index 5914dc61ce0af068e1e73d8d3c799ebf440cceef..5b13de0788cfc7e2e5c1c7941147caaca2c7f879 100644 (file)
@@ -291,6 +291,7 @@ static const struct default_language_entry msgtab[] = {
     {"NS_UNBIND_DONE", "Unbound command $b%s$b."}, /* {ARGS: "TestCommand"} */
     {"NS_EVENTS_HEADER", "The following channel events were found:"},
     {"NS_OPLOG_HEADER", "The following oper events were found:"},
+    {"NS_SEARCH_ZOMBIE_SCAN_IN_PROGRESS", "Another Zombie Scan is already in progress."},
     {"NS_SEARCH_HEADER", "The following channels were found:"},
     {"NS_COMMAND_BINDING", "$b%s$b is a binding of %s %s"}, /* {ARGS: "TestCommand", "TestFunction", "TestParameters"} */
     {"NS_COMMAND_ACCESS", "You need at least %d channel access and %d oper access to execute this command."}, /* {ARGS: 500, 100} */
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);
 }
index f29cb903e7c98ba8ba92fb096cc2f79480a1861f..b4db7243f8bae67f2cff0309542c98d51dcfbc53 100644 (file)
@@ -254,7 +254,8 @@ int loadNeonSpamSettings(struct ChanNode *chan) {
     loadChannelSettings(chan);
     printf_mysql_query("SELECT `channel_scanner`, `channel_spam_limit`, `channel_spam_except`, `channel_flood_limit`, `channel_flood_time`, `channel_flood_except`, `channel_join_limit`, `channel_join_time`, `channel_join_except`, `channel_caps_percent`, `channel_caps_except`, `channel_digit_percent`, `channel_digit_except`, `channel_badword_except` FROM `channels` WHERE `channel_id` = '%d'", chan->channel_id);
     res = mysql_use();
-    row = mysql_fetch_row(res);
+    if(!(row = mysql_fetch_row(res)))
+        return 0;
     if(!row[0] || !row[1] || !row[2] || !row[3] || !row[4] || !row[5] || !row[6] || !row[7] || !row[8] || !row[9] || !row[10] || !row[11] || !row[12]) {
         printf_mysql_query("SELECT `channel_scanner`, `channel_spam_limit`, `channel_spam_except`, `channel_flood_limit`, `channel_flood_time`, `channel_flood_except`, `channel_join_limit`, `channel_join_time`, `channel_join_except`, `channel_caps_percent`, `channel_caps_except`, `channel_digit_percent`, `channel_digit_except`, `channel_badword_except` FROM `channels` WHERE `channel_name` = 'defaults'");
         res = mysql_use();