#include "usenetsearch/Application.h" #include "usenetsearch/Indexer.h" #include "usenetsearch/StringUtils.h" #include "usenetsearch/UsenetClient.h" #include using namespace usenetsearch; int main(int argc, char* argv[]) { std::string searchString; Application::Get().AddStringOption('s', "Search string", [&searchString](const std::string& s){ searchString = s; } ); int maxResults{0}; Application::Get().AddIntegerOption('n', "Maximum results", [&maxResults](int n){ maxResults = n; } ); if (!Application::Get().Init(argc, argv)) return 1; if (searchString.empty()) { std::cerr << "Missing search string." << std::endl; Application::Get().Usage(argv[0]); return 1; } UsenetClient client; Indexer idx(client); std::unique_ptr results = idx.Search( searchString ); if (!results) { std::cout << "Nothing found." << std::endl; return 0; } idx.Connect(); size_t resultCounter{0}; for (const auto& sr: *results) { if (Application::Get().ShouldStop()) return 1; const std::unique_ptr newsGroup = Application::Get().GetDb().FindNntpEntry(sr.NewsgroupId()); if (!newsGroup) continue; client.Group(WideStringFromString(newsGroup->name)); const NntpHeader headers = client.Head(sr.ArticleId()); std::cout << "Score: " + std::to_string(sr.Hits()) << " | " << "Newsgroup: " + newsGroup->name << " | " << "Article id: " + std::to_string(sr.ArticleId()) << " | " << "Subject: " + headers.subject << std::endl; resultCounter++; if ((maxResults > 0) && (resultCounter >= maxResults)) break; } return 0; }