using HyperbolicDownloaderApi.Managment; using System.Net.Sockets; using System.Text.Json; namespace HyperbolicDownloaderApi.Networking; public class HostsManager { private List hosts = new List(); public int Count => hosts.Count; public void AddRange(IEnumerable hosts) { foreach (NetworkSocket host in hosts) { Add(host); } SaveHosts(); } public void Add(NetworkSocket host) { if (!Contains(host)) { hosts.Add(host); } SaveHosts(); } public void Remove(NetworkSocket host, bool forceRemove = false) { if (DateTime.Now - host.LastActive >= new TimeSpan(24, 0, 0) || forceRemove) { _ = hosts.RemoveAll(x => x.IPAddress == host.IPAddress && x.Port == host.Port); } SaveHosts(); } public bool Contains(NetworkSocket host) { return hosts.Any(x => x.IPAddress == host.IPAddress && x.Port == host.Port); } public int CheckHostsActivity() { List hostsToRemove = new List(); int activeHostsCount = 0; foreach (NetworkSocket host in hosts) { ApiManager.SendNotificationMessage($"{host.IPAddress}:{host.Port} > ???", NotificationMessageType.Warning); using TcpClient tcpClient = new TcpClient(); try { _ = tcpClient.ConnectAsync(host.IPAddress, host.Port).Wait(500); Console.CursorLeft = 0; if (tcpClient.Connected) { ApiManager.SendNotificationMessageNewLine($"{host.IPAddress}:{host.Port} > Active", NotificationMessageType.Success); host.LastActive = DateTime.Now; activeHostsCount++; } else { if (DateTime.Now - host.LastActive >= new TimeSpan(24, 0, 0)) { hostsToRemove.Add(host); } ApiManager.SendNotificationMessageNewLine($"{host.IPAddress}:{host.Port} > Inactive", NotificationMessageType.Error); } } catch { if (DateTime.Now - host.LastActive >= new TimeSpan(24, 0, 0)) { hostsToRemove.Add(host); } Console.CursorLeft = 0; ApiManager.SendNotificationMessageNewLine($"{host.IPAddress}:{host.Port} > Inactive", NotificationMessageType.Error); } } foreach (NetworkSocket host in hostsToRemove) { _ = hosts.Remove(host); } SaveHosts(); return activeHostsCount; } public List ToList() { return hosts.ToList(); } public void SaveHosts() { hosts = hosts.OrderByDescending(h => h.LastActive).ToList(); File.WriteAllText(ApiConfiguration.HostsFilePath, JsonSerializer.Serialize(hosts)); } }