-/* cmd_neonserv_search.c - NeonServ v5.3
+/* cmd_neonserv_search.c - NeonServ v5.6
* Copyright (C) 2011-2012 Philipp Kreil (pk910)
*
* This program is free software: you can redistribute it and/or modify
#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 {
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;
}
for(i = 1; i < argc; i += 2) {
if(argc <= i+1) {
- reply(getTextBot(), user, "MODCMD_LESS_PARAM_COUNT");
+ reply(textclient, user, "MODCMD_LESS_PARAM_COUNT");
return;
}
if(!stricmp(argv[i], "name")) criteria.name = argv[i+1];
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")) {
}
}
int matches = 0;
- reply(getTextBot(), user, "NS_SEARCH_HEADER");
+ if((criteria.flags & (CMD_SEARCH_FLAG_IS_ZOMBIE | CMD_SEARCH_FLAG_NOT_ZOMBIE))) {
+ if(neonserv_cmd_search_zombie) {
+ reply(textclient, user, "NS_SEARCH_ZOMBIE_SCAN_IN_PROGRESS");
+ return;
+ }
+ neonserv_cmd_search_zombie = 1;
+ }
+
+ reply(textclient, 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) {
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;
matches++;
//output
if(show_chans) {
- reply(getTextBot(), user, "%s", row[0]);
+ reply(textclient, 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(textclient, user, "%s", channel->name);
+ }
+ }
}
}
- reply(getTextBot(), user, "NS_TABLE_COUNT", matches);
+ neonserv_cmd_search_zombie = 0;
+ reply(textclient, user, "NS_TABLE_COUNT", matches);
}