]> Sergey Matveev's repositories - btrtrc.git/blobdiff - cmd/btrtrc/txstats.go
Initial draft client
[btrtrc.git] / cmd / btrtrc / txstats.go
diff --git a/cmd/btrtrc/txstats.go b/cmd/btrtrc/txstats.go
new file mode 100644 (file)
index 0000000..f05a4b8
--- /dev/null
@@ -0,0 +1,74 @@
+package main
+
+import (
+       "fmt"
+       "log"
+       "os"
+       "strconv"
+       "sync"
+       "time"
+
+       "github.com/anacrolix/torrent"
+       "github.com/anacrolix/torrent/metainfo"
+)
+
+const TxExt = ".tx"
+
+var (
+       TxStats  = map[metainfo.Hash]int64{}
+       TxStatsM sync.Mutex
+)
+
+func txStatsLoad(h metainfo.Hash) {
+       pth := h.HexString() + TxExt
+       data, err := os.ReadFile(pth)
+       if err != nil {
+               return
+       }
+       v, err := strconv.ParseInt(string(data[:len(data)-1]), 10, 64)
+       if err != nil {
+               log.Println("ParseInt:", pth, err)
+               return
+       }
+       TxStatsM.Lock()
+       TxStats[h] = v
+       TxStatsM.Unlock()
+}
+
+func txStatsDel(h metainfo.Hash) {
+       TxStatsM.Lock()
+       delete(TxStats, h)
+       TxStatsM.Unlock()
+}
+
+func txStatsDump(t *torrent.Torrent) {
+       stats := t.Stats()
+       TxStatsM.Lock()
+       s := stats.BytesWrittenData.Int64() + TxStats[t.InfoHash()]
+       pth := t.InfoHash().HexString() + TxExt
+       if err := os.WriteFile(pth, []byte(fmt.Sprintf("%d\n", s)), 0666); err != nil {
+               log.Println("WriteFile:", pth, err)
+       }
+       TxStatsM.Unlock()
+}
+
+func txStatsDumpAll(c *torrent.Client) {
+       for _, t := range c.Torrents() {
+               if t.Info() != nil {
+                       txStatsDump(t)
+               }
+       }
+}
+
+func txStatsDumper(c *torrent.Client) {
+       tick := time.Tick(10 * time.Second)
+       for {
+               txStatsDumpAll(c)
+               select {
+               case <-Cancel:
+                       Jobs.Done()
+                       return
+               case <-tick:
+               }
+       }
+}