From 923d68b1cf61c22ac4bd61cd55f4ac305def1ea3 Mon Sep 17 00:00:00 2001 From: pk910 Date: Sun, 29 Apr 2012 14:14:33 +0200 Subject: [PATCH] add more information when deleting a user; added zombie channel search --- src/ChanNode.h | 2 + src/main.c | 8 ++- src/modules/NeonServ.mod/bot_NeonServ.c | 1 + .../NeonServ.mod/cmd_neonserv_search.c | 66 ++++++++++++++++--- src/modules/NeonSpam.mod/bot_NeonSpam.c | 3 +- 5 files changed, 68 insertions(+), 12 deletions(-) diff --git a/src/ChanNode.h b/src/ChanNode.h index 9a2c8c2..756a6b4 100644 --- a/src/ChanNode.h +++ b/src/ChanNode.h @@ -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]; diff --git a/src/main.c b/src/main.c index 1292a82..f3afaaf 100644 --- a/src/main.c +++ b/src/main.c @@ -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")) { diff --git a/src/modules/NeonServ.mod/bot_NeonServ.c b/src/modules/NeonServ.mod/bot_NeonServ.c index 5914dc6..5b13de0 100644 --- a/src/modules/NeonServ.mod/bot_NeonServ.c +++ b/src/modules/NeonServ.mod/bot_NeonServ.c @@ -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} */ diff --git a/src/modules/NeonServ.mod/cmd_neonserv_search.c b/src/modules/NeonServ.mod/cmd_neonserv_search.c index 8f864a1..12c1b75 100644 --- a/src/modules/NeonServ.mod/cmd_neonserv_search.c +++ b/src/modules/NeonServ.mod/cmd_neonserv_search.c @@ -21,12 +21,15 @@ #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); } diff --git a/src/modules/NeonSpam.mod/bot_NeonSpam.c b/src/modules/NeonSpam.mod/bot_NeonSpam.c index f29cb90..b4db724 100644 --- a/src/modules/NeonSpam.mod/bot_NeonSpam.c +++ b/src/modules/NeonSpam.mod/bot_NeonSpam.c @@ -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(); -- 2.20.1