From 1e6c411bec962febb5c69dd4e2f224604fd5648a Mon Sep 17 00:00:00 2001 From: pk910 Date: Mon, 31 Oct 2011 22:27:24 +0100 Subject: [PATCH] added states criteria to cmd_search --- src/cmd_neonserv_search.c | 63 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 59 insertions(+), 4 deletions(-) diff --git a/src/cmd_neonserv_search.c b/src/cmd_neonserv_search.c index 0c642c8..eaac114 100644 --- a/src/cmd_neonserv_search.c +++ b/src/cmd_neonserv_search.c @@ -17,10 +17,17 @@ #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; @@ -74,6 +81,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]); } @@ -104,6 +137,28 @@ 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) { + 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))) { + 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) { -- 2.20.1