#include #include #include #include //signal handler #include #include #include "search.h" #include "textfilter.h" #include "mediafilter.h" #include "datefilter.h" static bool run = true; void sig_handler(int sig_num) { Log::info << "signalHandler triggered"; run = false; ::close(STDIN_FILENO); //interrupt input (void) sig_num; } std::map filterlist; void loadFilter() { filterlist.insert({"TextSearch", new TextFilter()}); filterlist.insert({"RegexSearch", new RegexFilter()}); filterlist.insert({"HasMedia", new HasMediaFilter()}); filterlist.insert({"Filename", new FilenameFilter()}); filterlist.insert({"RegexFilename", new RegexFilenameFilter()}); filterlist.insert({"Date", new DateFilter()}); filterlist.insert({"Chat", new FilterChat()}); filterlist.insert({"ForwordedFrom", new ForwardedFromChatFilter()}); } void removeFilter() { for(auto it : filterlist) { delete it.second; } filterlist.clear(); } Filter* chooseFilter(std::ostream& o, std::istream& istr) { //print filter uint32_t i = 0; std::vector templookup; templookup.reserve(filterlist.size()); for(auto it : filterlist) { o << "[" << std::setw(2) << std::setfill('0') << i << "] " << it.first << std::endl; templookup.push_back(it.second); ++i; } uint32_t choise = 0; do { o << "Pick one" << std::endl; istr >> choise; } while(choise > templookup.size()); resetStream(istr); return templookup.at(choise); } static void printResults(const Search* search, std::list& list) { for(const Message* m : list) { Log::Entry e = (Log::info << search->getShortChatname(m->senderid)); e << "@" << search->getShortChatname(m->chatid) << "[" << m->getDate() << "]> (" << m->messageid << ") "; if(m->text.empty()) { e << ""; } else { e << m->text; } } } int main(int argc, const char** argv) { Log::init(); Log::setConsoleLogLevel(Log::Level::TRACE); Log::addLogfile("log.txt", Log::Level::TRACE); #if __unix__ Log::setColoredOutput(true); #endif if(argc < 2) { Log::error << "Usage: " << argv[0] << " [ ....]"; return 1; } time_t start = time(nullptr); Search rootsearch; for(int i = 1; i < argc; ++i) { Log::info << "Load File: " << argv[i]; rootsearch.addFile(argv[i]); } rootsearch.finalize(); time_t end = time(nullptr); Log::info << rootsearch.getChatCount() << " Chats with " << rootsearch.getMessageCount() << " Messages loaded in " << end-start << "s"; loadFilter(); signal(SIGINT, sig_handler); Search* search = nullptr; while(run) { if(!search) search = &rootsearch; Log::info << search->getMessageCount() << " Messages. Configure Search: "; Filter* filter = chooseFilter(std::cout, std::cin); filter->setup(std::cout, std::cin); if(!run) break; time_t start = time(nullptr); std::list results = search->search(*filter); time_t end = time(nullptr); Log::info << results.size() << " results found in " << end-start << "s"; if(results.size()) { Log::info << "Print results ?"; char c; std::cin >> c; if(!run) break; if(isYes(c)) { //print results printResults(search, results); } Log::info << "New Subfilter (y)? Clear Search (c)? Change current Filter (anykey)?"; std::cin >> c; if(!run) break; if(isYes(c)) { //filter Search* subsearch = new Search(*search, &results); //delete old subsearch (dont delete root) if(search != &rootsearch) delete search; //set new search search = subsearch; } else if(isLetter(c, 'c')) { //move to root search if(search != &rootsearch) { delete search; search = &rootsearch; } } } resetStream(std::cin); } if(search != &rootsearch) delete search; Log::stop(); return 0; }