cd0e37c9493cda22ff15f644f9e3dcf44d9d4852
[NeonServV5.git] / cmd_neonserv_search.c
1
2 #define CMD_SEARCH_FLAG_HAS_NODELETE 0x01
3 #define CMD_SEARCH_FLAG_NOT_NODELETE 0x02
4 #define CMD_SEARCH_FLAG_HAS_SUSPENDED 0x04
5 #define CMD_SEARCH_FLAG_NOT_SUSPENDED 0x08
6
7 struct neonserv_cmd_search_criteria {
8     char *name;
9     char *registrar;
10     unsigned int flags : 16;
11     unsigned int unvisited;
12     unsigned int registered;
13     unsigned int limit : 16;
14 };
15
16 static CMD_BIND(neonserv_cmd_search) {
17     //ok parse the criterias
18     struct neonserv_cmd_search_criteria *criteria = malloc(sizeof(*criteria));
19     if (!criteria) {
20         perror("malloc() failed");
21         return;
22     }
23     memset(criteria, 0, sizeof(*criteria));
24     criteria->limit = 50;
25     int i, show_chans = 0, positive;
26     if(!stricmp(argv[0], "print")) {
27         show_chans = 1;
28     }
29     for(i = 1; i < argc; i += 2) {
30         if(argc <= i+1) {
31             reply(getTextBot(), user, "MODCMD_LESS_PARAM_COUNT");
32             return;
33         }
34         if(!stricmp(argv[i], "name")) criteria->name = argv[i+1];
35         else if(!stricmp(argv[i], "registrar")) criteria->registrar = argv[i+1];
36         else if(!stricmp(argv[i], "unvisited")) criteria->unvisited = strToTime(user, argv[i+1]);
37         else if(!stricmp(argv[i], "registered")) criteria->registered = strToTime(user, argv[i+1]);
38         else if(!stricmp(argv[i], "flags")) {
39             if(argv[i+1][0] == '+') {
40                 positive = 1;
41                 argv[i+1]++;
42             } else if(argv[i+1][0] == '-') {
43                 positive = 0;
44                 argv[i+1]++;
45             } else
46                 positive = 1;
47             if(!stricmp(argv[i+1], "nodelete")) {
48                 if(positive)
49                     criteria->flags |= CMD_SEARCH_FLAG_HAS_NODELETE;
50                 else
51                     criteria->flags |= CMD_SEARCH_FLAG_NOT_NODELETE;
52             } else if(!stricmp(argv[i+1], "suspended")) {
53                 if(positive)
54                     criteria->flags |= CMD_SEARCH_FLAG_HAS_SUSPENDED;
55                 else
56                     criteria->flags |= CMD_SEARCH_FLAG_NOT_SUSPENDED;
57             }
58         }
59         else if(!stricmp(argv[i], "limit")) {
60             criteria->limit = atoi(argv[i+1]);
61         }
62     }
63     int matches = 0;
64     reply(getTextBot(), user, "NS_SEARCH_HEADER");
65     MYSQL_RES *res, *res2;
66     MYSQL_ROW row, row2;
67     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);
68     res = mysql_use();
69     while ((row = mysql_fetch_row(res)) != NULL) {
70         if(show_chans && matches == criteria->limit) {
71             //too many
72             break;
73         }
74         if(criteria->name && match(criteria->name, row[0])) continue;
75         if(criteria->registrar && row[1] && match(criteria->registrar, row[1])) continue;
76         if(criteria->unvisited) {
77             printf_mysql_query("SELECT `chanuser_seen` FROM `chanusers` WHERE `chanuser_cid` = '%s' ORDER BY `chanuser_seen` DESC LIMIT 1", row[5]);
78             res2 = mysql_use();
79             row2 = mysql_fetch_row(res);
80             if(!row2) continue;
81             if((time(0) - atoi(row2[0])) < criteria->unvisited) continue;
82         }
83         if(criteria->registered && (time(0) - atoi(row[2])) < criteria->registered) continue;
84         
85         if((criteria->flags & CMD_SEARCH_FLAG_HAS_NODELETE) && strcmp(row[3], "1")) continue;
86         if((criteria->flags & CMD_SEARCH_FLAG_NOT_NODELETE) && strcmp(row[3], "0")) continue;
87         if((criteria->flags & CMD_SEARCH_FLAG_HAS_SUSPENDED) && strcmp(row[4], "1")) continue;
88         if((criteria->flags & CMD_SEARCH_FLAG_NOT_SUSPENDED) && strcmp(row[4], "0")) continue;
89         matches++;
90         //output
91         if(show_chans) {
92             reply(getTextBot(), user, "%s", row[0]);
93         }
94     }
95     reply(getTextBot(), user, "NS_TABLE_COUNT", matches);
96 }