// Announce announces using UDP format func (u UDPTracker) Announce(query url.Values, file data.FileRecord) []byte { // Create UDP announce response announce := udp.AnnounceResponse{ Action: 1, TransID: u.TransID, Interval: uint32(common.Static.Config.Interval), } // Calculate file seeders and leechers seeders, err := file.Seeders() if err != nil { log.Println(err.Error()) } announce.Seeders = uint32(seeders) leechers, err := file.Leechers() if err != nil { log.Println(err.Error()) } announce.Leechers = uint32(leechers) // Convert to UDP byte buffer announceBuf, err := announce.MarshalBinary() if err != nil { log.Println(err.Error()) return u.Error(ErrAnnounceFailure.Error()) } // Numwant numwant, err := strconv.Atoi(query.Get("numwant")) if err != nil { numwant = 50 } // Retrieve compact peer list // Note: because we are UDP, we send the second parameter 'false' to get // a "best guess" peer list, due to anonymous announces peers, err := file.CompactPeerList(numwant, false) if err != nil { log.Println(err.Error()) return u.Error(ErrPeerListFailure.Error()) } // Add compact peer list res := bytes.NewBuffer(announceBuf) err = binary.Write(res, binary.BigEndian, peers) if err != nil { log.Println(err.Error()) return u.Error(ErrPeerListFailure.Error()) } return res.Bytes() }