Feature: filter PIA servers by hostname and name

This commit is contained in:
Quentin McGaw
2021-05-09 16:49:22 +00:00
parent 1fb0840e72
commit 4fe1e062f2
9 changed files with 400 additions and 349 deletions

View File

@@ -21,6 +21,7 @@ type apiData struct {
type regionData struct {
Name string `json:"name"`
DNS string `json:"dns"`
PortForward bool `json:"port_forward"`
Offline bool `json:"offline"`
Servers struct {

View File

@@ -26,12 +26,12 @@ func GetServers(ctx context.Context, client *http.Client, minServers int) (
// newServers can support only UDP or both TCP and UDP
newServers := dataToServers(region.Servers.UDP, region.Name,
region.PortForward, commonNameToProtocols)
region.DNS, region.PortForward, commonNameToProtocols)
servers = append(servers, newServers...)
// tcpServers only support TCP as mixed servers were found above.
tcpServers := dataToServers(region.Servers.TCP, region.Name,
region.PortForward, commonNameToProtocols)
region.DNS, region.PortForward, commonNameToProtocols)
servers = append(servers, tcpServers...)
}
@@ -66,8 +66,8 @@ func dedupByProtocol(region regionData) (commonNameToProtocols map[string]protoc
return commonNameToProtocols
}
func dataToServers(data []serverData, region string, portForward bool,
commonNameToProtocols map[string]protocols) (
func dataToServers(data []serverData, region, hostname string,
portForward bool, commonNameToProtocols map[string]protocols) (
servers []models.PIAServer) {
servers = make([]models.PIAServer, 0, len(data))
for _, serverData := range data {
@@ -78,6 +78,7 @@ func dataToServers(data []serverData, region string, portForward bool,
delete(commonNameToProtocols, serverData.CN)
server := models.PIAServer{
Region: region,
Hostname: hostname,
ServerName: serverData.CN,
TCP: proto.tcp,
UDP: proto.udp,

View File

@@ -9,7 +9,10 @@ import (
func sortServers(servers []models.PIAServer) {
sort.Slice(servers, func(i, j int) bool {
if servers[i].Region == servers[j].Region {
return servers[i].ServerName < servers[j].ServerName
if servers[i].Hostname == servers[j].Hostname {
return servers[i].ServerName < servers[j].ServerName
}
return servers[i].Hostname < servers[j].Hostname
}
return servers[i].Region < servers[j].Region
})