X-Git-Url: http://git.pk910.de/?p=NeonServV5.git;a=blobdiff_plain;f=src%2Fmodules%2FNeonServ.mod%2Fcmd_neonserv_search.c;h=12c1b75b3a23013739a0b4b0b87639616798a361;hp=8f864a18a00059f84231084b02cfce1878604459;hb=923d68b1cf61c22ac4bd61cd55f4ac305def1ea3;hpb=2e12c97bb38cb3d59e7dc38c958a981d8242e28a 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); }