added states criteria to cmd_search
authorpk910 <philipp@zoelle1.de>
Mon, 31 Oct 2011 21:27:24 +0000 (22:27 +0100)
committerpk910 <philipp@zoelle1.de>
Mon, 31 Oct 2011 21:27:24 +0000 (22:27 +0100)
src/cmd_neonserv_search.c

index 0c642c84a244b54c3799ce309a9435beca3f847f..eaac114711dd58eaa4e24251cabcb632d07cb9ba 100644 (file)
 
 #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) {