package utils import ( "encoding/base32" "io" "math/rand" "net/http" "os" "path/filepath" "strings" "server/settings" "golang.org/x/time/rate" ) var defTrackers = []string{ "http://retracker.local/announce", "http://bt4.t-ru.org/ann?magnet", "http://retracker.mgts.by:80/announce", "http://tracker.city9x.com:2710/announce", "http://tracker.electro-torrent.pl:80/announce", "http://tracker.internetwarriors.net:1337/announce", "http://tracker2.itzmx.com:6961/announce", "udp://opentor.org:2710", "udp://public.popcorn-tracker.org:6969/announce", "udp://tracker.opentrackr.org:1337/announce", "http://bt.svao-ix.ru/announce", "udp://explodie.org:6969/announce", "wss://tracker.btorrent.xyz", "wss://tracker.openwebtorrent.com", } var loadedTrackers []string func GetTrackerFromFile() []string { name := filepath.Join(settings.Path, "trackers.txt") buf, err := os.ReadFile(name) if err == nil { list := strings.Split(string(buf), "\n") var ret []string for _, l := range list { if strings.HasPrefix(l, "udp") || strings.HasPrefix(l, "http") { ret = append(ret, l) } } return ret } return nil } func GetDefTrackers() []string { loadNewTracker() if len(loadedTrackers) == 0 { return defTrackers } return loadedTrackers } func loadNewTracker() { if len(loadedTrackers) > 0 { return } resp, err := http.Get("https://raw.githubusercontent.com/ngosang/trackerslist/master/trackers_best_ip.txt") if err == nil { buf, err := io.ReadAll(resp.Body) if err == nil { arr := strings.Split(string(buf), "\n") var ret []string for _, s := range arr { s = strings.TrimSpace(s) if len(s) > 0 { ret = append(ret, s) } } loadedTrackers = append(ret, defTrackers...) } } } func PeerIDRandom(peer string) string { randomBytes := make([]byte, 32) _, err := rand.Read(randomBytes) if err != nil { panic(err) } return peer + base32.StdEncoding.EncodeToString(randomBytes)[:20-len(peer)] } func Limit(i int) *rate.Limiter { l := rate.NewLimiter(rate.Inf, 0) if i > 0 { b := i if b < 16*1024 { b = 16 * 1024 } l = rate.NewLimiter(rate.Limit(i), b) } return l }