using Shared; using Shared.Engine; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net.Sockets; using System.Text; using System.Text.RegularExpressions; using System.Threading; using System.Threading.Tasks; namespace Lampac.Engine.CRON { public static class TrackersCron { public static void Run() { _cronTimer = new Timer(cron, null, TimeSpan.FromMinutes(2), TimeSpan.FromMinutes(AppInit.conf.dlna.intervalUpdateTrackers)); } static Timer _cronTimer; static int _updatingDb = 0; async static void cron(object state) { if (Interlocked.Exchange(ref _updatingDb, 1) == 1) return; try { if (AppInit.modules == null || AppInit.modules.FirstOrDefault(i => i.dll == "DLNA.dll" && i.enable) == null) return; if (AppInit.conf.dlna.enable && AppInit.conf.dlna.autoupdatetrackers) { var trackers = new HashSet(); var trackers_bad = new HashSet(); var temp = new HashSet(); foreach (string uri in new string[] { "http://redapi.cfhttp.top/trackers.txt", "https://raw.githubusercontent.com/ngosang/trackerslist/master/trackers_all_ip.txt", "https://raw.githubusercontent.com/XIU2/TrackersListCollection/master/all.txt", "https://newtrackon.com/api/all" }) { string plain = await Http.Get(uri, weblog: false); if (plain == null) continue; foreach (string line in plain.Replace("\r", "").Replace("\t", "").Split("\n")) if (!string.IsNullOrEmpty(line)) temp.Add(line.Trim()); } foreach (string url in temp) { if (await ckeck(url)) trackers.Add(url); else trackers_bad.Add(url); } File.WriteAllLines("cache/trackers_bad.txt", trackers_bad); File.WriteAllLines("cache/trackers.txt", trackers.OrderByDescending(i => Regex.IsMatch(i, "[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+")).ThenByDescending(i => i.StartsWith("http"))); } } catch { } finally { Volatile.Write(ref _updatingDb, 0); } } async static Task ckeck(string tracker) { if (string.IsNullOrWhiteSpace(tracker) || tracker.Contains("[")) return false; if (tracker.StartsWith("http")) { try { using (var handler = new System.Net.Http.HttpClientHandler()) { handler.ServerCertificateCustomValidationCallback += (sender, cert, chain, sslPolicyErrors) => true; using (var client = new System.Net.Http.HttpClient(handler)) { client.Timeout = TimeSpan.FromSeconds(7); await client.GetAsync(tracker, System.Net.Http.HttpCompletionOption.ResponseHeadersRead); return true; } } } catch { } } else if (tracker.StartsWith("udp:")) { try { tracker = tracker.Replace("udp://", ""); string host = tracker.Split(':')[0].Split('/')[0]; int port = tracker.Contains(":") ? int.Parse(tracker.Split(':')[1].Split('/')[0]) : 6969; using (UdpClient client = new UdpClient(host, port)) { CancellationTokenSource cts = new CancellationTokenSource(); cts.CancelAfter(7000); string uri = Regex.Match(tracker, "^[^/]/(.*)").Groups[1].Value; await client.SendAsync(Encoding.UTF8.GetBytes($"GET /{uri} HTTP/1.1\r\nHost: {host}\r\n\r\n"), cts.Token); return true; } } catch { } } return false; } } }