X-Git-Url: http://git.pk910.de/?a=blobdiff_plain;f=src%2Fcmd_neonserv_search.c;h=a98d0e6d53bddbccde144270c410cf882648fe31;hb=bb5692b9cbff069abbf9573c81e86c3cd2061ceb;hp=0691366968f07e3d52ee598c60c15da14684a83d;hpb=0f1dc61921eef1db8e404a5a82372e2d1cd55daa;p=NeonServV5.git diff --git a/src/cmd_neonserv_search.c b/src/cmd_neonserv_search.c index 0691366..a98d0e6 100644 --- a/src/cmd_neonserv_search.c +++ b/src/cmd_neonserv_search.c @@ -1,14 +1,38 @@ +/* cmd_neonserv_search.c - NeonServ v5.3 + * Copyright (C) 2011-2012 Philipp Kreil (pk910) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #include "cmd_neonserv.h" -#define CMD_SEARCH_FLAG_HAS_NODELETE 0x01 -#define CMD_SEARCH_FLAG_NOT_NODELETE 0x02 -#define CMD_SEARCH_FLAG_HAS_SUSPENDED 0x04 -#define CMD_SEARCH_FLAG_NOT_SUSPENDED 0x08 +#define CMD_SEARCH_FLAG_HAS_NODELETE 0x001 +#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_STATES 0x3f0 struct neonserv_cmd_search_criteria { char *name; char *registrar; + char *onchan; unsigned int flags : 16; unsigned int unvisited; unsigned int registered; @@ -35,6 +59,7 @@ CMD_BIND(neonserv_cmd_search) { } if(!stricmp(argv[i], "name")) criteria->name = argv[i+1]; else if(!stricmp(argv[i], "registrar")) criteria->registrar = argv[i+1]; + else if(!stricmp(argv[i], "onchan")) criteria->onchan = argv[i+1]; else if(!stricmp(argv[i], "unvisited")) criteria->unvisited = strToTime(user, argv[i+1]); else if(!stricmp(argv[i], "registered")) criteria->registered = strToTime(user, argv[i+1]); else if(!stricmp(argv[i], "flags")) { @@ -58,6 +83,32 @@ CMD_BIND(neonserv_cmd_search) { criteria->flags |= CMD_SEARCH_FLAG_NOT_SUSPENDED; } } + else if(!stricmp(argv[i], "state")) { + if(argv[i+1][0] == '+') { + positive = 1; + argv[i+1]++; + } else if(argv[i+1][0] == '-') { + positive = 0; + argv[i+1]++; + } else + positive = 1; + if(!stricmp(argv[i+1], "joined")) { + if(positive) + criteria->flags |= CMD_SEARCH_FLAG_IS_JOINED; + else + criteria->flags |= CMD_SEARCH_FLAG_NOT_JOINED; + } else if(!stricmp(argv[i+1], "opped")) { + if(positive) + criteria->flags |= CMD_SEARCH_FLAG_IS_OPPED; + else + criteria->flags |= CMD_SEARCH_FLAG_NOT_OPPED; + } else if(!stricmp(argv[i+1], "voiced")) { + if(positive) + criteria->flags |= CMD_SEARCH_FLAG_IS_VOICED; + else + criteria->flags |= CMD_SEARCH_FLAG_NOT_VOICED; + } + } else if(!stricmp(argv[i], "limit")) { criteria->limit = atoi(argv[i+1]); } @@ -66,7 +117,7 @@ CMD_BIND(neonserv_cmd_search) { 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 `channels` ON `chanid` = `channel_id` LEFT JOIN `users` ON `channel_registrator` = `user_id` WHERE `botid` = '%d'", client->botid); + 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(); while ((row = mysql_fetch_row(res)) != NULL) { if(show_chans && matches == criteria->limit) { @@ -78,7 +129,7 @@ CMD_BIND(neonserv_cmd_search) { if(criteria->unvisited) { printf_mysql_query("SELECT `chanuser_seen` FROM `chanusers` WHERE `chanuser_cid` = '%s' ORDER BY `chanuser_seen` DESC LIMIT 1", row[5]); res2 = mysql_use(); - row2 = mysql_fetch_row(res); + row2 = mysql_fetch_row(res2); if(!row2) continue; if((time(0) - atoi(row2[0])) < criteria->unvisited) continue; } @@ -88,6 +139,36 @@ CMD_BIND(neonserv_cmd_search) { if((criteria->flags & CMD_SEARCH_FLAG_NOT_NODELETE) && strcmp(row[3], "0")) continue; 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->onchan) { + if(!channel) continue; + struct ChanUser *chanuser = NULL; + for(chanuser = getChannelUsers(channel, NULL); chanuser; chanuser = getChannelUsers(channel, chanuser)) { + if(!match(criteria->onchan, chanuser->user->nick)) break; + } + if(!chanuser) continue; + } + if((criteria->flags & CMD_SEARCH_FLAG_IS_JOINED) && !channel) continue; + if((criteria->flags & CMD_SEARCH_FLAG_NOT_JOINED) && channel) continue; + if(channel && (criteria->flags & (CMD_SEARCH_FLAG_IS_OPPED | CMD_SEARCH_FLAG_NOT_OPPED | CMD_SEARCH_FLAG_IS_VOICED | CMD_SEARCH_FLAG_NOT_VOICED))) { + int flags = 0; + struct ClientSocket *bot; + for(bot = getBots(SOCKET_FLAG_READY, NULL); bot; bot = getBots(SOCKET_FLAG_READY, bot)) { + if(bot->botid == client->botid) { + struct ChanUser *chanuser = getChanUser(bot->user, channel); + if(chanuser) { + flags = chanuser->flags; + break; + } + } + } + if((criteria->flags & CMD_SEARCH_FLAG_IS_OPPED) && !(flags & CHANUSERFLAG_OPPED)) continue; + if((criteria->flags & CMD_SEARCH_FLAG_NOT_OPPED) && (flags & CHANUSERFLAG_OPPED)) continue; + if((criteria->flags & CMD_SEARCH_FLAG_IS_VOICED) && !(flags & CHANUSERFLAG_VOICED)) continue; + if((criteria->flags & CMD_SEARCH_FLAG_NOT_VOICED) && (flags & CHANUSERFLAG_VOICED)) continue; + } + } matches++; //output if(show_chans) {