7 "github.com/anacrolix/missinggo"
9 "github.com/anacrolix/torrent/tracker"
12 // Announces a torrent to a tracker at regular intervals, when peers are
14 type trackerScraper struct {
16 // Causes the trackerScraper to stop running.
21 func trackerToTorrentPeers(ps []tracker.Peer) (ret []Peer) {
22 ret = make([]Peer, 0, len(ps))
23 for _, p := range ps {
24 ret = append(ret, Peer{
27 Source: peerSourceTracker,
33 // Return how long to wait before trying again.
34 func (me *trackerScraper) announce() time.Duration {
35 blocked, urlToUse, host, err := me.t.cl.prepareTrackerAnnounceUnlocked(me.url)
37 // Wait for DNS to potentially change. Very few people do it faster
39 return 5 * time.Minute
42 req := me.t.announceRequest()
44 res, err := tracker.AnnounceHost(urlToUse, &req, host)
46 log.Printf("error announcing %s %q to %q: %s", me.t.InfoHash().HexString(), me.t.Name(), me.url, err)
47 return 5 * time.Minute
49 me.t.AddPeers(trackerToTorrentPeers(res.Peers))
50 return time.Duration(res.Interval) * time.Second
53 func (me *trackerScraper) Run() {
56 case <-me.t.closed.LockedChan(&me.t.cl.mu):
58 case <-me.stop.LockedChan(&me.t.cl.mu):
60 case <-me.t.wantPeersEvent.LockedChan(&me.t.cl.mu):
63 intervalChan := time.After(me.announce())
66 case <-me.t.closed.LockedChan(&me.t.cl.mu):
68 case <-me.stop.LockedChan(&me.t.cl.mu):