#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;
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]);
}
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) {