package torrent import ( "context" "time" "git.kmsign.ru/royalcat/tstor/pkg/rlog" "github.com/anacrolix/torrent/types/infohash" ) func (s *Daemon) allStats(ctx context.Context) (map[infohash.T]TorrentStats, TorrentStats) { totalPeers := 0 activePeers := 0 connectedSeeders := 0 perTorrentStats := map[infohash.T]TorrentStats{} for _, v := range s.client.Torrents() { stats := v.Stats() perTorrentStats[v.InfoHash()] = TorrentStats{ Timestamp: time.Now(), DownloadedBytes: uint64(stats.BytesRead.Int64()), UploadedBytes: uint64(stats.BytesWritten.Int64()), TotalPeers: uint16(stats.TotalPeers), ActivePeers: uint16(stats.ActivePeers), ConnectedSeeders: uint16(stats.ConnectedSeeders), } totalPeers += stats.TotalPeers activePeers += stats.ActivePeers connectedSeeders += stats.ConnectedSeeders } totalStats := s.client.Stats() return perTorrentStats, TorrentStats{ Timestamp: time.Now(), DownloadedBytes: uint64(totalStats.BytesRead.Int64()), UploadedBytes: uint64(totalStats.BytesWritten.Int64()), TotalPeers: uint16(totalPeers), ActivePeers: uint16(activePeers), ConnectedSeeders: uint16(connectedSeeders), } } func (s *Daemon) updateStats(ctx context.Context) { log := s.log perTorrentStats, totalStats := s.allStats(ctx) for ih, v := range perTorrentStats { err := s.statsStore.AddTorrentStats(ih, v) if err != nil { log.Error(ctx, "error saving torrent stats", rlog.Error(err)) } } err := s.statsStore.AddTotalStats(totalStats) if err != nil { log.Error(ctx, "error saving total stats", rlog.Error(err)) } } func (s *Daemon) TotalStatsHistory(ctx context.Context, since time.Time) ([]TorrentStats, error) { return s.statsStore.ReadTotalStatsHistory(ctx, since) } func (s *Daemon) TorrentStatsHistory(ctx context.Context, since time.Time, ih infohash.T) ([]TorrentStats, error) { return s.statsStore.ReadTorrentStatsHistory(ctx, since, ih) } func (s *Daemon) StatsHistory(ctx context.Context, since time.Time) ([]TorrentStats, error) { return s.statsStore.ReadStatsHistory(ctx, since) }