package geoip import ( "github.com/safing/portbase/utils" ) // AddRegion adds the region based on the country. func (l *Location) AddRegion() { if regionID, ok := countryRegions[l.Country.ISOCode]; ok { l.Continent.Code = regionID } } // IsRegionalNeighbor returns whether the supplied location is a regional neighbor. func (l *Location) IsRegionalNeighbor(other *Location) bool { if l.Continent.Code == "" || other.Continent.Code == "" { return false } if region, ok := regions[l.Continent.Code]; ok { return utils.StringInSlice(region.Neighbors, other.Continent.Code) } return false } type Region struct { ID string Name string Neighbors []string } var regions = map[string]*Region{ "AF-C": { ID: "AF-C", Name: "Africa, Sub-Saharan Africa, Middle Africa", Neighbors: []string{ "AF-E", "AF-N", "AF-S", "AF-W", }, }, "AF-E": { ID: "AF-E", Name: "Africa, Sub-Saharan Africa, Eastern Africa", Neighbors: []string{ "AF-C", "AF-N", "AF-S", }, }, "AF-N": { ID: "AF-N", Name: "Africa, Northern Africa", Neighbors: []string{ "AF-C", "AF-E", "AF-W", "AS-W", "EU-S", }, }, "AF-S": { ID: "AF-S", Name: "Africa, Sub-Saharan Africa, Southern Africa", Neighbors: []string{ "AF-C", "AF-E", "AF-W", }, }, "AF-W": { ID: "AF-W", Name: "Africa, Sub-Saharan Africa, Western Africa", Neighbors: []string{ "AF-C", "AF-N", "AF-S", }, }, "AN": { ID: "AN", Name: "Antarctica", Neighbors: []string{}, }, "AS-C": { ID: "AS-C", Name: "Asia, Central Asia", Neighbors: []string{ "AS-E", "AS-S", "AS-SE", "AS-W", }, }, "AS-E": { ID: "AS-E", Name: "Asia, Eastern Asia", Neighbors: []string{ "AS-C", "AS-S", "AS-SE", }, }, "AS-S": { ID: "AS-S", Name: "Asia, Southern Asia", Neighbors: []string{ "AS-C", "AS-E", "AS-SE", "AS-W", }, }, "AS-SE": { ID: "AS-SE", Name: "Asia, South-eastern Asia", Neighbors: []string{ "AS-C", "AS-E", "AS-S", "OC-C", "OC-E", "OC-N", "OC-S", }, }, "AS-W": { ID: "AS-W", Name: "Asia, Western Asia", Neighbors: []string{ "AF-N", "AS-C", "AS-S", "EU-E", }, }, "EU-E": { ID: "EU-E", Name: "Europe, Eastern Europe", Neighbors: []string{ "AS-W", "EU-N", "EU-S", "EU-W", }, }, "EU-N": { ID: "EU-N", Name: "Europe, Northern Europe", Neighbors: []string{ "EU-E", "EU-S", "EU-W", }, }, "EU-S": { ID: "EU-S", Name: "Europe, Southern Europe", Neighbors: []string{ "AF-N", "EU-E", "EU-N", "EU-W", }, }, "EU-W": { ID: "EU-W", Name: "Europe, Western Europe", Neighbors: []string{ "EU-E", "EU-N", "EU-S", }, }, "NA-E": { ID: "NA-E", Name: "North America, Caribbean", Neighbors: []string{ "NA-N", "NA-S", "SA", }, }, "NA-N": { ID: "NA-N", Name: "North America, Northern America", Neighbors: []string{ "NA-E", "NA-N", "NA-S", }, }, "NA-S": { ID: "NA-S", Name: "North America, Central America", Neighbors: []string{ "NA-E", "NA-N", "NA-S", "SA", }, }, "OC-C": { ID: "OC-C", Name: "Oceania, Melanesia", Neighbors: []string{ "AS-SE", "OC-E", "OC-N", "OC-S", }, }, "OC-E": { ID: "OC-E", Name: "Oceania, Polynesia", Neighbors: []string{ "AS-SE", "OC-C", "OC-N", "OC-S", }, }, "OC-N": { ID: "OC-N", Name: "Oceania, Micronesia", Neighbors: []string{ "AS-SE", "OC-C", "OC-E", "OC-S", }, }, "OC-S": { ID: "OC-S", Name: "Oceania, Australia and New Zealand", Neighbors: []string{ "AS-SE", "OC-C", "OC-E", "OC-N", }, }, "SA": { // TODO: Split up ID: "SA", Name: "South America", Neighbors: []string{ "NA-E", "NA-S", }, }, } var countryRegions = map[string]string{ "AF": "AS-S", "AX": "EU-N", "AL": "EU-S", "DZ": "AF-N", "AS": "OC-E", "AD": "EU-S", "AO": "AF-C", "AI": "NA-E", "AQ": "AN", "AG": "NA-E", "AR": "SA", "AM": "AS-W", "AW": "NA-E", "AU": "OC-S", "AT": "EU-W", "AZ": "AS-W", "BS": "NA-E", "BH": "AS-W", "BD": "AS-S", "BB": "NA-E", "BY": "EU-E", "BE": "EU-W", "BZ": "NA-S", "BJ": "AF-W", "BM": "NA-N", "BT": "AS-S", "BO": "SA", "BQ": "NA-E", "BA": "EU-S", "BW": "AF-S", "BV": "SA", "BR": "SA", "IO": "AF-E", "BN": "AS-SE", "BG": "EU-E", "BF": "AF-W", "BI": "AF-E", "CV": "AF-W", "KH": "AS-SE", "CM": "AF-C", "CA": "NA-N", "KY": "NA-E", "CF": "AF-C", "TD": "AF-C", "CL": "SA", "CN": "AS-E", "CX": "OC-S", "CC": "OC-S", "CO": "SA", "KM": "AF-E", "CG": "AF-C", "CD": "AF-C", "CK": "OC-E", "CR": "NA-S", "CI": "AF-W", "HR": "EU-S", "CU": "NA-E", "CW": "NA-E", "CY": "AS-W", "CZ": "EU-E", "DK": "EU-N", "DJ": "AF-E", "DM": "NA-E", "DO": "NA-E", "EC": "SA", "EG": "AF-N", "SV": "NA-S", "GQ": "AF-C", "ER": "AF-E", "EE": "EU-N", "SZ": "AF-S", "ET": "AF-E", "FK": "SA", "FO": "EU-N", "FJ": "OC-C", "FI": "EU-N", "FR": "EU-W", "GF": "SA", "PF": "OC-E", "TF": "AF-E", "GA": "AF-C", "GM": "AF-W", "GE": "AS-W", "DE": "EU-W", "GH": "AF-W", "GI": "EU-S", "GR": "EU-S", "GL": "NA-N", "GD": "NA-E", "GP": "NA-E", "GU": "OC-N", "GT": "NA-S", "GG": "EU-N", "GN": "AF-W", "GW": "AF-W", "GY": "SA", "HT": "NA-E", "HM": "OC-S", "VA": "EU-S", "HN": "NA-S", "HK": "AS-E", "HU": "EU-E", "IS": "EU-N", "IN": "AS-S", "ID": "AS-SE", "IR": "AS-S", "IQ": "AS-W", "IE": "EU-N", "IM": "EU-N", "IL": "AS-W", "IT": "EU-S", "JM": "NA-E", "JP": "AS-E", "JE": "EU-N", "JO": "AS-W", "KZ": "AS-C", "KE": "AF-E", "KI": "OC-N", "KP": "AS-E", "KR": "AS-E", "KW": "AS-W", "KG": "AS-C", "LA": "AS-SE", "LV": "EU-N", "LB": "AS-W", "LS": "AF-S", "LR": "AF-W", "LY": "AF-N", "LI": "EU-W", "LT": "EU-N", "LU": "EU-W", "MO": "AS-E", "MG": "AF-E", "MW": "AF-E", "MY": "AS-SE", "MV": "AS-S", "ML": "AF-W", "MT": "EU-S", "MH": "OC-N", "MQ": "NA-E", "MR": "AF-W", "MU": "AF-E", "YT": "AF-E", "MX": "NA-S", "FM": "OC-N", "MD": "EU-E", "MC": "EU-W", "MN": "AS-E", "ME": "EU-S", "MS": "NA-E", "MA": "AF-N", "MZ": "AF-E", "MM": "AS-SE", "NA": "AF-S", "NR": "OC-N", "NP": "AS-S", "NL": "EU-W", "NC": "OC-C", "NZ": "OC-S", "NI": "NA-S", "NE": "AF-W", "NG": "AF-W", "NU": "OC-E", "NF": "OC-S", "MK": "EU-S", "MP": "OC-N", "NO": "EU-N", "OM": "AS-W", "PK": "AS-S", "PW": "OC-N", "PS": "AS-W", "PA": "NA-S", "PG": "OC-C", "PY": "SA", "PE": "SA", "PH": "AS-SE", "PN": "OC-E", "PL": "EU-E", "PT": "EU-S", "PR": "NA-E", "QA": "AS-W", "RE": "AF-E", "RO": "EU-E", "RU": "EU-E", "RW": "AF-E", "BL": "NA-E", "SH": "AF-W", "KN": "NA-E", "LC": "NA-E", "MF": "NA-E", "PM": "NA-N", "VC": "NA-E", "WS": "OC-E", "SM": "EU-S", "ST": "AF-C", "SA": "AS-W", "SN": "AF-W", "RS": "EU-S", "SC": "AF-E", "SL": "AF-W", "SG": "AS-SE", "SX": "NA-E", "SK": "EU-E", "SI": "EU-S", "SB": "OC-C", "SO": "AF-E", "ZA": "AF-S", "GS": "SA", "SS": "AF-E", "ES": "EU-S", "LK": "AS-S", "SD": "AF-N", "SR": "SA", "SJ": "EU-N", "SE": "EU-N", "CH": "EU-W", "SY": "AS-W", "TW": "AS-E", "TJ": "AS-C", "TZ": "AF-E", "TH": "AS-SE", "TL": "AS-SE", "TG": "AF-W", "TK": "OC-E", "TO": "OC-E", "TT": "NA-E", "TN": "AF-N", "TR": "AS-W", "TM": "AS-C", "TC": "NA-E", "TV": "OC-E", "UG": "AF-E", "UA": "EU-E", "AE": "AS-W", "GB": "EU-N", "US": "NA-N", "UM": "OC-N", "UY": "SA", "UZ": "AS-C", "VU": "OC-C", "VE": "SA", "VN": "AS-SE", "VG": "NA-E", "VI": "NA-E", "WF": "OC-E", "EH": "AF-N", "YE": "AS-W", "ZM": "AF-E", "ZW": "AF-E", }