func (s *Storage) DeleteSeeder(infohash string, p *models.Peer) error { shard := s.getTorrentShard(infohash, false) defer shard.Unlock() torrent, exists := shard.torrents[infohash] if !exists { return models.ErrTorrentDNE } torrent.Seeders.Delete(p.Key()) return nil }
func (tkr *Tracker) handlePeerEvent(ann *models.Announce, p *models.Peer) (snatched bool, err error) { p, t := ann.Peer, ann.Torrent switch { case ann.Event == "stopped" || ann.Event == "paused": // updateSwarm checks if the peer is active on the torrent, // so one of these branches must be followed. if t.Seeders.Contains(p.Key()) { err = tkr.DeleteSeeder(t.Infohash, p) if err != nil { return } stats.RecordPeerEvent(stats.DeletedSeed) } else if t.Leechers.Contains(p.Key()) { err = tkr.DeleteLeecher(t.Infohash, p) if err != nil { return } stats.RecordPeerEvent(stats.DeletedLeech) } case t.Leechers.Contains(p.Key()) && (ann.Event == "completed" || ann.Left == 0): // A leecher has completed or this is the first time we've seen them since // they've completed. err = tkr.leecherFinished(t, p) if err != nil { return } // Only mark as snatched if we receive the completed event. if ann.Event == "completed" { snatched = true } } return }