--- /dev/null
+
+#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
+
+struct neonserv_cmd_search_criteria {
+ char *name;
+ char *registrar;
+ unsigned int flags : 16;
+ unsigned int unvisited;
+ unsigned int registered;
+ unsigned int limit : 16;
+};
+
+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);
+}