package torrent import ( "log/slog" "time" "github.com/anacrolix/dht/v2" "github.com/anacrolix/dht/v2/bep44" tlog "github.com/anacrolix/log" "github.com/anacrolix/torrent" "github.com/anacrolix/torrent/storage" "git.kmsign.ru/royalcat/tstor/src/config" dlog "git.kmsign.ru/royalcat/tstor/src/log" ) func newClient(st storage.ClientImpl, fis bep44.Store, cfg *config.TorrentClient, id [20]byte) (*torrent.Client, error) { l := slog.With("component", "torrent-client") // TODO download and upload limits torrentCfg := torrent.NewDefaultClientConfig() torrentCfg.PeerID = string(id[:]) torrentCfg.DefaultStorage = st torrentCfg.AlwaysWantConns = true torrentCfg.DropMutuallyCompletePeers = true torrentCfg.TorrentPeersLowWater = 100 torrentCfg.TorrentPeersHighWater = 1000 torrentCfg.AcceptPeerConnections = true torrentCfg.Seed = true torrentCfg.DisableAggressiveUpload = false tl := tlog.NewLogger() tl.SetHandlers(&dlog.Torrent{L: l}) torrentCfg.Logger = tl torrentCfg.Callbacks.NewPeer = append(torrentCfg.Callbacks.NewPeer, func(p *torrent.Peer) { l := l.With("ip", p.RemoteAddr.String()) if p.Torrent() != nil { l = l.With("torrent", p.Torrent().Name()) } l.Debug("new peer") }) torrentCfg.Callbacks.PeerClosed = append(torrentCfg.Callbacks.PeerClosed, func(p *torrent.Peer) { l := l.With("ip", p.RemoteAddr.String()) if p.Torrent() != nil { l = l.With("torrent", p.Torrent().Name()) } l.Debug("peer closed") }) // torrentCfg.Callbacks.PeerConnClosed = append(torrentCfg.Callbacks.PeerConnClosed, func(c *torrent.PeerConn) { // l.Debug("peer closed", "ip", c.RemoteAddr.String()) // }) torrentCfg.PeriodicallyAnnounceTorrentsToDht = true torrentCfg.ConfigureAnacrolixDhtServer = func(cfg *dht.ServerConfig) { cfg.Store = fis cfg.Exp = 2 * time.Hour cfg.NoSecurity = false } return torrent.NewClient(torrentCfg) }