-/* cmd_neonserv_search.c - NeonServ v5.2
+/* cmd_neonserv_search.c - NeonServ v5.3
* Copyright (C) 2011 Philipp Kreil (pk910)
*
* This program is free software: you can redistribute it and/or modify
struct neonserv_cmd_search_criteria {
char *name;
char *registrar;
+ char *onchan;
unsigned int flags : 16;
unsigned int unvisited;
unsigned int registered;
}
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], "onchan")) criteria->onchan = 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")) {
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);
+ printf_mysql_query("SELECT `channel_name`, `user_user`, `channel_registered`, `channel_nodelete`, `suspended`, `channel_id` FROM `bot_channels` LEFT JOIN `bots` ON `bots`.`id` = `botid` LEFT JOIN `channels` ON `chanid` = `channel_id` LEFT JOIN `users` ON `channel_registrator` = `user_id` WHERE `botclass` = '%d' AND `active` = '1'", client->botid);
res = mysql_use();
while ((row = mysql_fetch_row(res)) != NULL) {
if(show_chans && matches == criteria->limit) {
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);
+ row2 = mysql_fetch_row(res2);
if(!row2) continue;
if((time(0) - atoi(row2[0])) < criteria->unvisited) 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;
- if(criteria->flags & CMD_SEARCH_FLAG_STATES) {
+ if((criteria->flags & CMD_SEARCH_FLAG_STATES) || criteria->onchan) {
struct ChanNode *channel = getChanByName(row[0]);
+ if(criteria->onchan) {
+ if(!channel) continue;
+ struct ChanUser *chanuser = NULL;
+ for(chanuser = getChannelUsers(channel, NULL); chanuser; chanuser = getChannelUsers(channel, chanuser)) {
+ if(!match(criteria->onchan, chanuser->user->nick)) break;
+ }
+ if(!chanuser) continue;
+ }
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))) {