added cmd_search
authorpk910 <philipp@zoelle1.de>
Sat, 24 Sep 2011 14:41:19 +0000 (16:41 +0200)
committerpk910 <philipp@zoelle1.de>
Sat, 24 Sep 2011 14:47:49 +0000 (16:47 +0200)
bot_NeonServ.c
cmd_neonserv_search.c [new file with mode: 0644]

index 7934ed34ac28771dfbea0e2553047db58f769c1d..669eb860ea6611c8845a248bd002d1d1e37147a9 100644 (file)
@@ -217,6 +217,7 @@ static const struct default_language_entry msgtab[] = {
     {"NS_UNBIND_DONE", "Unbound command $b%s$b."}, /* {ARGS: "TestCommand"} */
     {"NS_EVENTS_HEADER", "The following channel events were found:"},
     {"NS_OPLOG_HEADER", "The following oper events were found:"},
+    {"NS_SEARCH_HEADER", "The following channels were found:"},
     {NULL, NULL}
 };
 
@@ -297,7 +298,7 @@ INCLUDE ALL CMD's HERE
 //#include "cmd_neonserv_merge.c"
 #include "cmd_neonserv_move.c"
 //#include "cmd_neonserv_dnrsearch.c"
-//#include "cmd_neonserv_search.c"
+#include "cmd_neonserv_search.c"
 #include "cmd_neonserv_trace.c"
 #include "cmd_neonserv_say.c"
 #include "cmd_neonserv_emote.c"
@@ -503,6 +504,7 @@ void init_NeonServ() {
     OPER_COMMAND("bind",         neonserv_cmd_bind,      2,     900,  CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG);
     OPER_COMMAND("unbind",       neonserv_cmd_unbind,    1,     900,  CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG);
     OPER_COMMAND("oplog",        neonserv_cmd_oplog,     0,     1,    CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG);
+    OPER_COMMAND("search",       neonserv_cmd_search,    1,     400,  CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH);
     #undef OPER_COMMAND
     
     start_bots();
diff --git a/cmd_neonserv_search.c b/cmd_neonserv_search.c
new file mode 100644 (file)
index 0000000..cd0e37c
--- /dev/null
@@ -0,0 +1,96 @@
+
+#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
+
+struct neonserv_cmd_search_criteria {
+    char *name;
+    char *registrar;
+    unsigned int flags : 16;
+    unsigned int unvisited;
+    unsigned int registered;
+    unsigned int limit : 16;
+};
+
+static 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;
+    int i, show_chans = 0, positive;
+    if(!stricmp(argv[0], "print")) {
+        show_chans = 1;
+    }
+    for(i = 1; i < argc; i += 2) {
+        if(argc <= i+1) {
+            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]);
+        else if(!stricmp(argv[i], "flags")) {
+            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], "nodelete")) {
+                if(positive)
+                    criteria->flags |= CMD_SEARCH_FLAG_HAS_NODELETE;
+                else
+                    criteria->flags |= CMD_SEARCH_FLAG_NOT_NODELETE;
+            } else if(!stricmp(argv[i+1], "suspended")) {
+                if(positive)
+                    criteria->flags |= CMD_SEARCH_FLAG_HAS_SUSPENDED;
+                else
+                    criteria->flags |= CMD_SEARCH_FLAG_NOT_SUSPENDED;
+            }
+        }
+        else if(!stricmp(argv[i], "limit")) {
+            criteria->limit = atoi(argv[i+1]);
+        }
+    }
+    int matches = 0;
+    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);
+    res = mysql_use();
+    while ((row = mysql_fetch_row(res)) != NULL) {
+        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) {
+            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);
+            if(!row2) continue;
+            if((time(0) - atoi(row2[0])) < criteria->unvisited) 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;
+        matches++;
+        //output
+        if(show_chans) {
+            reply(getTextBot(), user, "%s", row[0]);
+        }
+    }
+    reply(getTextBot(), user, "NS_TABLE_COUNT", matches);
+}