/// <summary> /// Chooses a server from the selected server city according to server weights. /// </summary> /// <param name="serverCityItem">Selected server city for connection.</param> /// <returns>VPN server selected for connection.</returns> public VPNServer SelectServer(Models.CityServerListItem serverCityItem) { var city = serverCityItem.City; Dictionary <int, VPNServer> servers = new Dictionary <int, VPNServer>(); servers = GetServerItems().Where(x => x.Value.City == city).ToDictionary(x => x.Key, x => x.Value); var weightSum = servers.Sum(server => server.Value.Weight); Random rand = new Random(); int r = rand.Next(0, weightSum + 1); VPNServer serverSelection = new VPNServer(); foreach (var server in servers) { r -= server.Value.Weight; if (r <= 0) { serverSelection = server.Value; break; } } return(serverSelection); }
/// <summary> /// Loads the server list from a file. /// </summary> /// <param name="filePath">Path of the file containing the server list.</param> public void LoadServerDataFromFile(string filePath) { string jsonStringData = string.Empty; JSONStructures.ServerList servers; try { jsonStringData = File.ReadAllText(filePath); JObject jObjectServerData = JObject.Parse(jsonStringData); servers = JsonConvert.DeserializeObject <JSONStructures.ServerList>(jObjectServerData.ToString()); } catch (Exception) { return; } var newVPNServers = new Dictionary <int, VPNServer>(); var serverIndex = 0; foreach (var country in servers.Countries) { foreach (var city in country.Cities) { try { foreach (var server in city.Servers) { var portRanges = new List <List <int> > { new List <int> { 53, 53 } }; try { portRanges = new List <List <int> >(); // Port range parsing foreach (var portRange in server.PortRanges) { portRanges.Add(new List <int> { portRange.First(), portRange.Last() }); } } catch (Exception e) { ErrorHandling.ErrorHandler.Handle(e, ErrorHandling.LogLevel.Debug); } var newVPNServer = new VPNServer { IPv4Address = server.IPv4Gateway, IPv6Address = server.IPv6Gateway, Endpoint = server.IPv4EndpointAddress, DNSServerAddress = server.IPv4Gateway, Ports = portRanges, PublicKey = server.PublicKey, Weight = server.Weight, Name = server.Hostname, Country = country.Name, City = city.Name, }; newVPNServers[serverIndex] = newVPNServer; serverIndex++; } } catch (NullReferenceException) { continue; } } } // Sort the server list newVPNServers = SortServerList(newVPNServers); List <Models.CityServerListItem> newServerData = new List <Models.CityServerListItem>(); var groupedServersByCity = newVPNServers.GroupBy(s => s.Value.City).ToDictionary(grp => grp.Key, grp => grp.ToList()); foreach (var serverCity in groupedServersByCity) { List <Models.ServerListItem> cityServers = new List <Models.ServerListItem>(); for (int i = 0; i < serverCity.Value.Count; i++) { cityServers.Add(new Models.ServerListItem { Country = serverCity.Value[i].Value.Country, City = serverCity.Value[i].Value.City, Name = serverCity.Value.Count > 1 ? string.Format("{0} {1}", serverCity.Value[i].Value.City, i + 1) : serverCity.Value[i].Value.City, Code = serverCity.Value[i].Value.Name, Endpoint = serverCity.Value[i].Value.Endpoint, }); } newServerData.Add(new Models.CityServerListItem { Country = serverCity.Value[0].Value.Country, City = serverCity.Key, Servers = cityServers, }); } serverCityData = newServerData; vpnServers = newVPNServers; }