UsenetSearch/src/usenetfind.cpp

66 lines
1.9 KiB
C++

#include "usenetsearch/Application.h"
#include "usenetsearch/Indexer.h"
#include "usenetsearch/StringUtils.h"
#include "usenetsearch/UsenetClient.h"
#include <iostream>
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<SearchResults> 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<NntpListEntry> 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;
}