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