diff --git a/cache.cpp b/cache.cpp index 8352a30..6840fa8 100644 --- a/cache.cpp +++ b/cache.cpp @@ -22,10 +22,10 @@ float Cache::distance() const { return 2 * Earth_radius * asin(sqrt(pow(sin(degtorad((pos.lat - home.lat) / 2)), 2) + cos(degtorad(pos.lat)) * cos(degtorad(home.lat)) * pow(sin(degtorad((pos.lon - home.lon) / 2)), 2))); } -void Cache::set_date(const std::tm* t) { +void Cache::set_date(const std::tm& t) { char tmp[20]; - date_tm = *t; + date_tm = t; std::mktime(&date_tm); year = std::to_string(1900 + date_tm.tm_year); @@ -41,6 +41,16 @@ void Cache::set_date(const std::tm* t) { //date += std::to_string(date_tm.tm_hour) + ":" + std::to_string(date_tm.tm_min) + ":" + std::to_string(date_tm.tm_sec); } +void Cache::set_date_hidden(const std::tm& t) { + char tmp[20]; + + date_hidden_tm = t; + std::mktime(&date_hidden_tm); + + std::strftime(tmp, 20, "%F", &date_hidden_tm); + date_hidden = tmp; +} + float cache_distance(const Cache& a, const Cache& b) { return 2 * Earth_radius * asin(sqrt(pow(sin(degtorad((a.pos.lat - b.pos.lat) / 2)), 2) + cos(degtorad(a.pos.lat)) * cos(degtorad(b.pos.lat)) * pow(sin(degtorad((a.pos.lon - b.pos.lon) / 2)), 2))); } diff --git a/cache.h b/cache.h index f484d51..89fdaf1 100644 --- a/cache.h +++ b/cache.h @@ -56,14 +56,17 @@ public: std::string owner; std::string owner_uuid; std::tm date_tm; + std::tm date_hidden_tm; std::string year; std::string mon; std::string day; std::string hour; std::string day_of_week; std::string date; + std::string date_hidden; - void set_date(const std::tm* t); + void set_date(const std::tm& t); + void set_date_hidden(const std::tm& t); static Position home; diff --git a/geo.css b/geo.css index 9cbef62..3fd1599 100644 --- a/geo.css +++ b/geo.css @@ -78,17 +78,28 @@ dl, color: #666; } -.dt_head { +.list td { + background: #f0f8ff; + color: #000; + padding-left: 10px; + padding-right: 10px; +} + +.list_head td { font-weight: bold; } -td { - width: 4em; +.dt td { background: #CCC; color: #000; text-align: center; } +.dt_head td { + font-weight: bold; + width: 4em; +} + td.dt_zero { color: #888; } @@ -203,6 +214,8 @@ dl { padding: .5rem 1rem; } +/* index flow */ + .row { display: flex; width: 900px; @@ -212,4 +225,4 @@ dl { .column { flex: 50%; -} \ No newline at end of file +} diff --git a/geostat.cpp b/geostat.cpp index 7b178f7..0d5476a 100644 --- a/geostat.cpp +++ b/geostat.cpp @@ -216,16 +216,21 @@ int main(int argc, char** argv) { // Prepare sorted list of caches, excluding moving caches std::map dates; Date_Caches sorted_caches; + Date_Caches sorted_fcaches; + Date_Caches sorted_caches_by_hidden; Caches fcc; std::tm tmp; for (auto& i : cc) { dates[i.date]++; + tmp = i.date_tm; + sorted_caches.insert({ std::mktime(&tmp), &i }); if (i.type != "Moving" && i.type != "Own") { - tmp = i.date_tm; - sorted_caches.insert({ std::mktime(&tmp), &i }); + sorted_fcaches.insert({ std::mktime(&tmp), &i }); fcc.insert(i); } + tmp = i.date_hidden_tm; + sorted_caches_by_hidden.insert({ std::mktime(&tmp), &i }); } std::cout << "\n"; @@ -271,12 +276,12 @@ int main(int argc, char** argv) { std::cout << "Longest caching streak: " << longest_str << " starting on " << str_tmp << "
\n"; int tot_dist = 0; - for (auto i = sorted_caches.begin(); i != std::prev(sorted_caches.end()); i++) { + for (auto i = sorted_fcaches.begin(); i != std::prev(sorted_fcaches.end()); i++) { //std::cout << "Distance between " << i->second->name << " and " << std::next(i)->second->name << " is " << cache_distance(*i->second, *std::next(i)->second) << "
"; tot_dist += cache_distance(*i->second, *std::next(i)->second); } std::cout << "Total distance between caches: " << tot_dist << " km (equivalent to " << tot_dist / (2 * Pi * Earth_radius) << "x trips around Earth)
\n"; - std::cout << "Average distance between caches: " << tot_dist / sorted_caches.size() << " km
\n"; + std::cout << "Average distance between caches: " << tot_dist / sorted_fcaches.size() << " km
\n"; std::cout << "\n"; } @@ -293,15 +298,15 @@ int main(int argc, char** argv) { auto W = std::min_element(fcc.begin(), fcc.end(), [&](const Cache& a, const Cache& b) { return a.pos.lon < b.pos.lon; }); std::cout << "

Geographically extreme caches

\n"; - std::cout << "\n"; + std::cout << "
\n"; std::cout << "\n"; - std::cout << " \n"; + std::cout << " \n"; std::cout << "\n"; - std::cout << " \n"; + std::cout << " \n"; std::cout << "\n"; - std::cout << " \n"; + std::cout << " \n"; std::cout << "\n"; - std::cout << " \n"; + std::cout << " \n"; std::cout << "\n"; std::cout << "
North:link() << "\">" << N->name << " (" << N->code << ")" << N->pos.lat << "North:link() << "\">" << N->name << " (" << N->code << ")" << N->pos.lat << "
South:link() << "\">" << S->name << " (" << S->code << ")" << S->pos.lat << "South:link() << "\">" << S->name << " (" << S->code << ")" << S->pos.lat << "
East: link() << "\">" << E->name << " (" << E->code << ")" << E->pos.lon << "East: link() << "\">" << E->name << " (" << E->code << ")" << E->pos.lon << "
West: link() << "\">" << W->name << " (" << W->code << ")" << W->pos.lon << "West: link() << "\">" << W->name << " (" << W->code << ")" << W->pos.lon << "
\n"; @@ -382,6 +387,49 @@ int main(int argc, char** argv) { std::cout << "
\n"; std::cout << "Total " << n << " days out of 366 (" << std::setprecision(3) << n / 3.66 << "%).\n"; std::cout << "
\n"; + + const int LIST_MAX = 15; + n = 1; + + std::cout << "

Oldest caches found

\n"; + std::cout << "\n"; + std::cout << ""; + std::cout << ""; + std::cout << ""; + std::cout << ""; + std::cout << "\n"; + + for (auto i = sorted_caches_by_hidden.begin(); i != sorted_caches_by_hidden.end(); i++) { + std::cout << " "; + std::cout << ""; + std::cout << ""; + std::cout << ""; + std::cout << "\n"; + n++; + if (n > LIST_MAX) break; + } + std::cout << "
CacheDate hiddenDate found
" << n << "" << "second->link() << "\">" << i->second->name << " (" << i->second->code << ")" << "" << i->second->date_hidden << "" << i->second->date << "
\n"; + + n = 1; + + std::cout << "

Newest caches found

\n"; + std::cout << "\n"; + std::cout << ""; + std::cout << ""; + std::cout << ""; + std::cout << ""; + std::cout << "\n"; + + for (auto i = sorted_caches_by_hidden.rbegin(); i != sorted_caches_by_hidden.rend(); i++) { + std::cout << " "; + std::cout << ""; + std::cout << ""; + std::cout << ""; + std::cout << "\n"; + n++; + if (n > LIST_MAX) break; + } + std::cout << "
CacheDate hiddenDate found
" << n << "" << "second->link() << "\">" << i->second->name << " (" << i->second->code << ")" << "" << i->second->date_hidden << "" << i->second->date << "
\n"; } std::cout << "
\n"; diff --git a/okapi.cpp b/okapi.cpp index d4bc115..3b24255 100644 --- a/okapi.cpp +++ b/okapi.cpp @@ -75,7 +75,7 @@ std::string Okapi::get_user_caches_json(std::string uuid, int count, int offset) std::string Okapi::get_caches_json(std::string codes) { 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|size2"; + std::string query = "consumer_key=" + key + "&cache_codes=" + codes + "&fields=code|name|location|type|status|difficulty|terrain|owner|region|size2|date_hidden"; return curl_post(service, query); } @@ -136,10 +136,16 @@ Caches Okapi::get_caches(std::vector> codes) { c.owner_uuid = el.value()["owner"]["uuid"]; c.pos = get_lat_lon(el.value()["location"]); c.origin = "OC.pl"; + + std::tm tmp; + std::stringstream ss(el.value()["date_hidden"].get()); + ss >> std::get_time(&tmp, "%Y-%m-%dT%H:%M:%S+"); + c.set_date_hidden(tmp); + //ugly way to handle date... for (auto& el2 : codes) { if (el2.first == c.code) { - c.set_date(&el2.second); + c.set_date(el2.second); break; } }