X-Git-Url: http://git.pk910.de/?a=blobdiff_plain;f=src%2Fcmd_neonserv_search.c;h=2cefe55104b1e0c814cb4a3321527d1bb18d8ade;hb=b53d0c5f88063f075a48a0426f9d5d6b3490b9fc;hp=2101cd2b46443d264c59c17046004cec500fa94b;hpb=e3b52b8d2c02940d9b6bb86cfa4062b32cfb4fed;p=NeonServV5.git diff --git a/src/cmd_neonserv_search.c b/src/cmd_neonserv_search.c index 2101cd2..2cefe55 100644 --- a/src/cmd_neonserv_search.c +++ b/src/cmd_neonserv_search.c @@ -1,5 +1,5 @@ -/* cmd_neonserv_search.c - NeonServ v5.2 - * Copyright (C) 2011 Philipp Kreil (pk910) +/* 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 @@ -32,6 +32,7 @@ struct neonserv_cmd_search_criteria { char *name; char *registrar; + char *onchan; unsigned int flags : 16; unsigned int unvisited; unsigned int registered; @@ -40,13 +41,9 @@ struct neonserv_cmd_search_criteria { CMD_BIND(neonserv_cmd_search) { //ok parse the criterias - struct neonserv_cmd_search_criteria *criteria = malloc(sizeof(*criteria)); - if (!criteria) { - perror("malloc() failed"); - return; - } - memset(criteria, 0, sizeof(*criteria)); - criteria->limit = 50; + struct neonserv_cmd_search_criteria criteria; + memset(&criteria, 0, sizeof(criteria)); + criteria.limit = 50; int i, show_chans = 0, positive; if(!stricmp(argv[0], "print")) { show_chans = 1; @@ -56,10 +53,11 @@ CMD_BIND(neonserv_cmd_search) { reply(getTextBot(), user, "MODCMD_LESS_PARAM_COUNT"); return; } - 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], "unvisited")) criteria->unvisited = strToTime(user, argv[i+1]); - else if(!stricmp(argv[i], "registered")) criteria->registered = strToTime(user, argv[i+1]); + 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")) { if(argv[i+1][0] == '+') { positive = 1; @@ -71,14 +69,14 @@ CMD_BIND(neonserv_cmd_search) { positive = 1; if(!stricmp(argv[i+1], "nodelete")) { if(positive) - criteria->flags |= CMD_SEARCH_FLAG_HAS_NODELETE; + criteria.flags |= CMD_SEARCH_FLAG_HAS_NODELETE; else - criteria->flags |= CMD_SEARCH_FLAG_NOT_NODELETE; + criteria.flags |= CMD_SEARCH_FLAG_NOT_NODELETE; } else if(!stricmp(argv[i+1], "suspended")) { if(positive) - criteria->flags |= CMD_SEARCH_FLAG_HAS_SUSPENDED; + criteria.flags |= CMD_SEARCH_FLAG_HAS_SUSPENDED; else - criteria->flags |= CMD_SEARCH_FLAG_NOT_SUSPENDED; + criteria.flags |= CMD_SEARCH_FLAG_NOT_SUSPENDED; } } else if(!stricmp(argv[i], "state")) { @@ -92,23 +90,23 @@ CMD_BIND(neonserv_cmd_search) { positive = 1; if(!stricmp(argv[i+1], "joined")) { if(positive) - criteria->flags |= CMD_SEARCH_FLAG_IS_JOINED; + criteria.flags |= CMD_SEARCH_FLAG_IS_JOINED; else - criteria->flags |= CMD_SEARCH_FLAG_NOT_JOINED; + criteria.flags |= CMD_SEARCH_FLAG_NOT_JOINED; } else if(!stricmp(argv[i+1], "opped")) { if(positive) - criteria->flags |= CMD_SEARCH_FLAG_IS_OPPED; + criteria.flags |= CMD_SEARCH_FLAG_IS_OPPED; else - criteria->flags |= CMD_SEARCH_FLAG_NOT_OPPED; + criteria.flags |= CMD_SEARCH_FLAG_NOT_OPPED; } else if(!stricmp(argv[i+1], "voiced")) { if(positive) - criteria->flags |= CMD_SEARCH_FLAG_IS_VOICED; + criteria.flags |= CMD_SEARCH_FLAG_IS_VOICED; else - criteria->flags |= CMD_SEARCH_FLAG_NOT_VOICED; + criteria.flags |= CMD_SEARCH_FLAG_NOT_VOICED; } } else if(!stricmp(argv[i], "limit")) { - criteria->limit = atoi(argv[i+1]); + criteria.limit = atoi(argv[i+1]); } } int matches = 0; @@ -118,30 +116,38 @@ CMD_BIND(neonserv_cmd_search) { 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) { + if(show_chans && matches == criteria.limit) { //too many break; } - 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.name && match(criteria.name, row[0])) continue; + if(criteria.registrar && row[1] && match(criteria.registrar, row[1])) continue; + 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(res2); if(!row2) continue; - if((time(0) - atoi(row2[0])) < criteria->unvisited) continue; + if((time(0) - atoi(row2[0])) < criteria.unvisited) continue; } - if(criteria->registered && (time(0) - atoi(row[2])) < criteria->registered) continue; + if(criteria.registered && (time(0) - atoi(row[2])) < criteria.registered) continue; - if((criteria->flags & CMD_SEARCH_FLAG_HAS_NODELETE) && strcmp(row[3], "1")) continue; - 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) { + if((criteria.flags & CMD_SEARCH_FLAG_HAS_NODELETE) && strcmp(row[3], "1")) continue; + 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->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))) { + 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)) { @@ -153,10 +159,10 @@ CMD_BIND(neonserv_cmd_search) { } } } - 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; + 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++;