Include list of FTFs

master
Tomasz Golinski 2022-07-13 01:11:44 +02:00
rodzic fc0372a887
commit 54b077de6d
4 zmienionych plików z 70 dodań i 6 usunięć

Wyświetl plik

@ -54,6 +54,7 @@ public:
class Cache {
public:
std::string code;
int internal_id;
Position pos;
std::string name;
Status status;
@ -86,6 +87,7 @@ public:
int age_when_found = -1;
int age_now = -1;
int trail = 0;
bool ftf = 0;
void set_date(const std::tm& t);
void set_date_hidden(const std::tm& t);

Wyświetl plik

@ -201,7 +201,8 @@ int main(int argc, char** argv) {
if (use_oc) {
if (!ocpl_user_uuid.empty() || !ocpl_user.empty()) {
Okapi OCpl(ocpl_url, ocpl_key);
if (!ocpl_user.empty()) ocpl_user_uuid = OCpl.get_uuid(ocpl_user);
int uid;
if (!ocpl_user.empty()) ocpl_user_uuid = OCpl.get_uuid(ocpl_user, &uid);
Caches tmp = OCpl.get_user_caches(ocpl_user_uuid, 0);
t.read_from_json("powertrails.json");
@ -217,6 +218,8 @@ int main(int argc, char** argv) {
}
}
OCpl.get_ftf(uid, tmp);
std::copy(tmp.begin(), tmp.end(), std::back_inserter(cc));
ocpl_user_profile = OCpl.get_profile_url(ocpl_user_uuid);
}
@ -346,6 +349,7 @@ int main(int argc, char** argv) {
pCaches caches_by_fav;
pCaches caches_by_fav_perc;
pCaches caches_by_finds;
pCaches caches_ftf;
// pCaches caches_by_rating;
pCaches fcc;
@ -369,7 +373,8 @@ int main(int argc, char** argv) {
caches_by_fav_perc.push_back(&*i);
caches_by_finds.push_back(&*i);
// caches_by_rating.push_back(&*i);
if (i->ftf)
caches_ftf.push_back(&*i);
i++;
}
std::sort(caches_by_fav.begin(), caches_by_fav.end(), [&](const Cache* a, const Cache* b) { return a->fav > b->fav; });
@ -910,6 +915,34 @@ int main(int argc, char** argv) {
std::cout << "Number of started power trails: <span class=\"value\">" << tt.size() << "</span><br>\n";
std::cout << "</div>\n";
std::cout << "<h2>FTF</h2>\n";
std::cout << "<table class=\"list\">\n";
std::cout << "<tr><th></th>";
std::cout << "<th>Cache</th>";
std::cout << "<th>Type</th>";
std::cout << "<th>Region</th>";
std::cout << "<th>Date hidden</th>";
std::cout << "<th>Finds</th>";
std::cout << "</tr>\n";
n = 1;
for (auto i : caches_ftf) {
std::cout << "<tr><th>" << n << "</th> ";
std::cout << "<td>" << i->link_name() << "</td>";
std::cout << "<td>" << i->type << "</td>";
std::cout << "<td>" << i->region << "</td>";
std::cout << "<td>" << i->date_hidden << "</td>";
std::cout << "<td>" << i->founds << "</td>";
std::cout << "</tr>\n";
n++;
// if (n > LIST_MAX) break;
}
std::cout << "</table>\n";
std::cout << "<div class=\"basic_stats\">\n";
// std::cout << "Number of FTFs: <span class=\"value\">" << std::count_if(cc.begin(), cc.end(), [&](const auto& a) { return a.ftf; }) << "</span><br>\n";
std::cout << "Number of FTFs: <span class=\"value\">" << caches_ftf.size() << "</span><br>\n";
std::cout << "</div>\n";
} // end of main if
if (get_not_found) {

Wyświetl plik

@ -93,7 +93,7 @@ void Okapi::get_user_caches_json(const std::string& uuid, int count, int offset)
void Okapi::get_caches_json(const std::string& codes) const {
std::string service = url + OKAPI_caches;
std::string query = "consumer_key=" + key + "&cache_codes=" + codes + "&fields=code|name|location|type|status|difficulty|terrain|owner|region|country2|size2|date_created|recommendations|rating|founds|status";
std::string query = "consumer_key=" + key + "&cache_codes=" + codes + "&fields=code|name|location|type|status|difficulty|terrain|owner|region|country2|size2|date_created|recommendations|rating|founds|status|internal_id";
curl_post(service, query);
}
@ -153,6 +153,7 @@ Caches Okapi::get_caches(const std::set<std::string>& codes) const {
for (auto& el : j.items()) {
if (el.value().is_null()) continue;
c.code = el.value()["code"];
c.internal_id = el.value()["internal_id"];
c.name = el.value()["name"];
c.type = el.value()["type"];
c.size = el.value()["size2"];
@ -310,13 +311,14 @@ void Okapi::update_caches_ratings(Caches& cc) const {
}
}
std::string Okapi::get_uuid(const std::string& username) const {
std::string Okapi::get_uuid(const std::string& username, int* id) const {
std::string service = url + OKAPI_username;
char* user_esc = curl_easy_escape(curl, username.c_str(), username.size());
std::string query = "consumer_key=" + key + "&username=" + user_esc + "&fields=uuid";
std::string query = "consumer_key=" + key + "&username=" + user_esc + "&fields=uuid|internal_id";
curl_free(user_esc);
curl_post(service, query);
json j = json::parse(curl_output);
if (id) *id = j["internal_id"];
return j["uuid"];
}
@ -334,3 +336,29 @@ std::string Okapi::get_changelog_json(int revision) const {
curl_post(service, query);
return curl_output;
}
void Okapi::get_ftf(int id, Caches& cc) const {
std::string url = "https://opencaching.pl/UserProfile/getUserFtfsAjax/" + std::to_string(id);
CURLcode res;
curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "");
curl_output.clear();
res = curl_easy_perform(curl);
if (res != CURLE_OK) {
Debug(1) << "Connection failed: " << curl_easy_strerror(res) << '\n';
curl_easy_cleanup(curl);
std::exit(EXIT_FAILURE);
}
Debug(5) << "FTF query result: " << curl_output;
json j = json::parse(curl_output);
for (auto& el : j.items()) {
if (el.value().is_null()) continue;
int id = std::stoi(el.value()["cache_id"].get<std::string>());
auto res = std::find_if(cc.begin(), cc.end(), [&](const auto& a) { return a.internal_id == id; });
if (res != std::end(cc))
res->ftf = 1;
}
}

Wyświetl plik

@ -40,6 +40,7 @@ public:
void update_caches(Caches& cc) const;
void update_caches_ratings(Caches& cc) const;
std::string get_uuid(const std::string& username) const;
std::string get_uuid(const std::string& username, int* id = nullptr) const;
std::string get_profile_url(const std::string& uuid) const;
void get_ftf(int id, Caches& cc) const;
};