168 lines
3.8 KiB
C++
168 lines
3.8 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"
|
|
#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<std::string, Filter*> 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<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);
|
|
}
|
|
|
|
static void printResults(const Search* search, std::list<const Message*>& 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 << "<empty>";
|
|
} 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] << " <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(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;
|
|
}
|