TelegramSearch/src/main.cpp

154 lines
3.3 KiB
C++

#include <Log.h>
#include <iostream>
#include <iomanip>
#include <signal.h> //signal handler
#include <unistd.h>
#include <ctime>
#include "search.h"
#include "textfilter.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<std::string, Filter*> filterlist;
void loadFilter() {
filterlist.insert({"TextSearch", new TextFilter()});
filterlist.insert({"RegexSearch", new RegexFilter()});
}
void removeFilter() {
for(auto it : filterlist) {
delete it.second;
}
filterlist.clear();
}
inline void resetStream(std::istream& i = std::cin) {
i.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}
Filter* chooseFilter(std::ostream& o, std::istream& istr) {
//print filter
uint32_t i = 0;
std::vector<Filter*> 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);
}
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] << " <file> [<file2> ....]";
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<const Message*> 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(c == 'y' || c == 'Y') {
//print results
for(const Message* m : results) {
Log::info << search->getShortChatname(m->senderid) << "@" << search->getShortChatname(m->chatid) << "> (" << m->messageid << ") " << m->text;
}
}
Log::info << "New Subfilter (y)? Clear Search (c)? Change current Filter (anykey)?";
std::cin >> c;
if(!run) break;
if(c == 'y' || c == 'Y') {
//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(c == 'c' || 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;
}