diff --git a/libi2pd_client/Torrents.cpp b/libi2pd_client/Torrents.cpp index bfc04fec..60ed28ed 100644 --- a/libi2pd_client/Torrents.cpp +++ b/libi2pd_client/Torrents.cpp @@ -491,7 +491,8 @@ namespace torrents void Torrent::ParseTrackerResponse (size_t trackerID, std::string_view buf) { if (trackerID >= m_TrackersInfo.size ()) - m_TrackersInfo.resize (trackerID + 1, TrackerInfo{{}, MIN_TRACKER_REQUESTS_INTERVAL, 0, 0, 0}); + m_TrackersInfo.resize (trackerID + 1, TrackerInfo{{}, MIN_TRACKER_REQUESTS_INTERVAL, + 0, 0, 0, i2p::util::GetSecondsSinceEpoch ()}); ParseDictionary (buf, [this, trackerID](std::string_view key, std::string_view buf)->size_t { if (key == "interval") @@ -527,6 +528,7 @@ namespace torrents } return 0; }); + std::get<4>(m_TrackersInfo[trackerID]) = i2p::util::GetSecondsSinceEpoch (); } size_t Torrent::ParsePeers (size_t trackerID, std::string_view buf) @@ -546,12 +548,14 @@ namespace torrents const uint8_t * hashes, size_t hashesLen, int numSeeders, int numLeechers) { if (trackerID >= m_TrackersInfo.size ()) - m_TrackersInfo.resize (trackerID + 1, TrackerInfo{{}, MIN_TRACKER_REQUESTS_INTERVAL, 0, 0, 0}); - auto& [peers, trackerRequestInterval, nextRequestTime, seeders, leechers] = m_TrackersInfo[trackerID]; + m_TrackersInfo.resize (trackerID + 1, TrackerInfo{{}, MIN_TRACKER_REQUESTS_INTERVAL, + 0, 0, 0, i2p::util::GetSecondsSinceEpoch () }); + auto& [peers, trackerRequestInterval, nextRequestTime, seeders, leechers, lastUpdateTime] = m_TrackersInfo[trackerID]; trackerRequestInterval = interval*1000; // milliseconds nextRequestTime = i2p::util::GetMonotonicMilliseconds () + trackerRequestInterval; seeders = numSeeders; leechers = numLeechers; + lastUpdateTime = i2p::util::GetSecondsSinceEpoch (); peers.clear (); size_t offset = 0; while (offset + i2p::data::IdentHash::len <= hashesLen) @@ -807,7 +811,8 @@ namespace torrents void Torrent::SetNextTrackerRequestTime (size_t trackerID, uint64_t ts) { if (trackerID >= m_TrackersInfo.size ()) - m_TrackersInfo.resize (trackerID + 1, TrackerInfo{{}, MIN_TRACKER_REQUESTS_INTERVAL, 0, 0, 0}); + m_TrackersInfo.resize (trackerID + 1, TrackerInfo{{}, MIN_TRACKER_REQUESTS_INTERVAL, + 0, 0, 0, i2p::util::GetSecondsSinceEpoch ()}); std::get<2>(m_TrackersInfo[trackerID]) = ts; } diff --git a/libi2pd_client/Torrents.h b/libi2pd_client/Torrents.h index cdc6cc84..38095366 100644 --- a/libi2pd_client/Torrents.h +++ b/libi2pd_client/Torrents.h @@ -149,8 +149,9 @@ namespace torrents public: using InfoHash = std::array; - using TrackerInfo = std::tuple, int, uint64_t, int, int>; - // (peers, interval, next tracker request time in monotonic milliseconds, seeders, leechers) + using TrackerInfo = std::tuple, int, uint64_t, int, int, uint64_t>; + // (peers, interval, next tracker request time in monotonic milliseconds, + // seeders, leechers, last update time in seconds since epoch) Torrent (std::string_view buf); void ParseTrackerResponse (size_t trackerID, std::string_view buf); @@ -212,6 +213,7 @@ namespace torrents int GetNumSeeders (size_t trackerID) const { return (trackerID < m_TrackersInfo.size ()) ? std::get<3>(m_TrackersInfo[trackerID]) : 0; } int GetNumLeechers (size_t trackerID) const { return (trackerID < m_TrackersInfo.size ()) ? std::get<4>(m_TrackersInfo[trackerID]) : 0; } int GetNumPeers (size_t trackerID) const { return (trackerID < m_TrackersInfo.size ()) ? std::get<0>(m_TrackersInfo[trackerID]).size () : 0; } + uint64_t GetLastTrackerUpdateTime (size_t trackerID) const { return (trackerID < m_TrackersInfo.size ()) ? std::get<5>(m_TrackersInfo[trackerID]) : 0; } private: diff --git a/libi2pd_client/TorrentsRPC.cpp b/libi2pd_client/TorrentsRPC.cpp index c1301418..f85bfceb 100644 --- a/libi2pd_client/TorrentsRPC.cpp +++ b/libi2pd_client/TorrentsRPC.cpp @@ -450,8 +450,8 @@ namespace torrents tracker["lastAnnounceTimedOut"] = false; // TODO: tracker["nextAnnounceTime"] = (torrent->GetNextTrackerRequestTime (i) - i2p::util::GetMonotonicMilliseconds () + i2p::util::GetMillisecondsSinceEpoch ())/1000; - tracker["lastAnnounceTime"] = i2p::util::GetSecondsSinceEpoch (); // TODO: - tracker["lastAnnounceStartTime"] = i2p::util::GetSecondsSinceEpoch (); // TODO: + tracker["lastAnnounceTime"] = torrent->GetLastTrackerUpdateTime (i); + tracker["lastAnnounceStartTime"] = torrent->GetLastTrackerUpdateTime (i); // TODO: tracker["lastScrapeTime"] = 0; tracker["lastScrapeStartTime"] = 0; tracker["nextScrapeTime"] = 0;