Skip to content

Commit a313f9f

Browse files
authored
update voice regions to handle new cloudflare regions (#38)
1 parent bf14331 commit a313f9f

File tree

1 file changed

+117
-46
lines changed

1 file changed

+117
-46
lines changed

src/main/kotlin/dev/arbjerg/lavalink/client/loadbalancing/regionFiltering.kt

Lines changed: 117 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@ object RegionGroup {
2626
*/
2727
@JvmField
2828
val ASIA: IRegionFilter = object : IRegionFilter {
29-
val regions = listOf(VoiceRegion.SYDNEY, VoiceRegion.INDIA, VoiceRegion.JAPAN, VoiceRegion.HONGKONG, VoiceRegion.SINGAPORE, VoiceRegion.SOUTH_KOREA)
29+
val regions = listOf(VoiceRegion.SYDNEY, VoiceRegion.INDIA, VoiceRegion.JAPAN, VoiceRegion.HONGKONG,
30+
VoiceRegion.SINGAPORE, VoiceRegion.SOUTH_KOREA, VoiceRegion.ASIA, VoiceRegion.OCEANIA)
3031

3132
override fun isRegionAllowed(node: LavalinkNode, region: VoiceRegion): RegionFilterVerdict {
3233
return if (region in regions) RegionFilterVerdict.PASS else RegionFilterVerdict.SOFT_BLOCK
@@ -40,7 +41,8 @@ object RegionGroup {
4041
@JvmField
4142
val EUROPE: IRegionFilter = object : IRegionFilter {
4243
val regions = listOf(VoiceRegion.ROTTERDAM, VoiceRegion.RUSSIA, VoiceRegion.AMSTERDAM, VoiceRegion.MADRID, VoiceRegion.MILAN,
43-
VoiceRegion.BUCHAREST, VoiceRegion.EUROPE, VoiceRegion.LONDON, VoiceRegion.FINLAND, VoiceRegion.FRANKFURT, VoiceRegion.STOCKHOLM, VoiceRegion.WARSAW)
44+
VoiceRegion.BUCHAREST, VoiceRegion.EUROPE, VoiceRegion.LONDON, VoiceRegion.FINLAND, VoiceRegion.FRANKFURT, VoiceRegion.STOCKHOLM,
45+
VoiceRegion.WARSAW, VoiceRegion.EUROPE)
4446

4547
override fun isRegionAllowed(node: LavalinkNode, region: VoiceRegion): RegionFilterVerdict {
4648
return if (region in regions) RegionFilterVerdict.PASS else RegionFilterVerdict.SOFT_BLOCK
@@ -54,7 +56,8 @@ object RegionGroup {
5456
@JvmField
5557
val US: IRegionFilter = object : IRegionFilter {
5658
val regions = listOf(VoiceRegion.US_CENTRAL, VoiceRegion.US_EAST, VoiceRegion.US_SOUTH, VoiceRegion.US_WEST, VoiceRegion.ATLANTA,
57-
VoiceRegion.SEATTLE, VoiceRegion.SANTA_CLARA, VoiceRegion.NEWARK, VoiceRegion.MONTREAL, VoiceRegion.OREGON, VoiceRegion.ST_PETE)
59+
VoiceRegion.SEATTLE, VoiceRegion.SANTA_CLARA, VoiceRegion.NEWARK, VoiceRegion.MONTREAL, VoiceRegion.OREGON, VoiceRegion.ST_PETE,
60+
VoiceRegion.CENTRAL_AMERICA)
5861

5962
override fun isRegionAllowed(node: LavalinkNode, region: VoiceRegion): RegionFilterVerdict {
6063
return if (region in regions) RegionFilterVerdict.PASS else RegionFilterVerdict.SOFT_BLOCK
@@ -66,7 +69,7 @@ object RegionGroup {
6669
*/
6770
@JvmField
6871
val SOUTH_AMERICA: IRegionFilter = object : IRegionFilter {
69-
val regions = listOf(VoiceRegion.BRAZIL, VoiceRegion.SANTIAGO, VoiceRegion.BUENOS_AIRES)
72+
val regions = listOf(VoiceRegion.BRAZIL, VoiceRegion.SANTIAGO, VoiceRegion.BUENOS_AIRES, VoiceRegion.SOUTH_AMERICA)
7073

7174
override fun isRegionAllowed(node: LavalinkNode, region: VoiceRegion): RegionFilterVerdict {
7275
return if (region in regions) RegionFilterVerdict.PASS else RegionFilterVerdict.SOFT_BLOCK
@@ -78,7 +81,7 @@ object RegionGroup {
7881
*/
7982
@JvmField
8083
val AFRICA: IRegionFilter = object : IRegionFilter {
81-
val regions = listOf(VoiceRegion.SOUTH_AFRICA)
84+
val regions = listOf(VoiceRegion.SOUTH_AFRICA, VoiceRegion.AFRICA)
8285

8386
override fun isRegionAllowed(node: LavalinkNode, region: VoiceRegion): RegionFilterVerdict {
8487
return if (region in regions) RegionFilterVerdict.PASS else RegionFilterVerdict.SOFT_BLOCK
@@ -90,7 +93,7 @@ object RegionGroup {
9093
*/
9194
@JvmField
9295
val MIDDLE_EAST: IRegionFilter = object : IRegionFilter {
93-
val regions = listOf(VoiceRegion.TEL_AVIV, VoiceRegion.DUBAI)
96+
val regions = listOf(VoiceRegion.TEL_AVIV, VoiceRegion.DUBAI, VoiceRegion.MIDDLE_EAST)
9497

9598
override fun isRegionAllowed(node: LavalinkNode, region: VoiceRegion): RegionFilterVerdict {
9699
return if (region in regions) RegionFilterVerdict.PASS else RegionFilterVerdict.SOFT_BLOCK
@@ -116,57 +119,125 @@ object RegionGroup {
116119
}
117120

118121
// TODO In case no exact server match, should it look for the closest node in that same region?
119-
enum class VoiceRegion(val id: String, val visibleName: String) {
120-
AMSTERDAM("amsterdam", "Amsterdam"),
121-
ATLANTA("atlanta", "Atlanta"),
122-
BRAZIL("brazil", "Brazil"),
123-
BUCHAREST("bucharest", "Bucharest"),
124-
BUENOS_AIRES("buenos-aires", "Brazil"),
125-
DUBAI("dubai", "Dubai"),
126-
EUROPE("europe", "Europe"),
127-
FINLAND("finland", "Finland"),
128-
FRANKFURT("frankfurt", "Frankfurt"),
129-
HONGKONG("hongkong", "Hong Kong"),
130-
INDIA("india", "India"),
131-
JAPAN("japan","Japan"),
132-
LONDON("london", "London"),
133-
MADRID("madrid", "Madrid"),
134-
MILAN("milan", "Milan"),
135-
MONTREAL("montreal", "Montreal"),
136-
NEWARK("newark", "Newark"),
137-
OREGON("oregon", "Oregon"),
138-
ROTTERDAM("rotterdam","Rotterdam"),
139-
RUSSIA("russia", "Russia"),
140-
SANTA_CLARA("santa-clara", "Santa Clara"),
141-
SANTIAGO("santiago", "Santiago"),
142-
SEATTLE("seattle", "Seattle"),
143-
SINGAPORE("singapore", "Singapore"),
144-
SOUTH_AFRICA("southafrica","South Africa"),
145-
SOUTH_KOREA("south-korea", "South Korea"),
146-
ST_PETE("st-pete", "St Pete"),
147-
STOCKHOLM("stockholm", "Stockholm"),
148-
SYDNEY("sydney", "Sydney"),
149-
TEL_AVIV("tel-aviv", "Tel Aviv"),
150-
US_CENTRAL("us-central", "US Central"),
151-
US_EAST("us-east", "US East"),
152-
US_SOUTH("us-south", "US South"),
153-
US_WEST("us-west", "US West"),
154-
WARSAW("warsaw", "Warsaw"),
155-
156-
UNKNOWN("", "Unknown");
122+
enum class VoiceRegion(
123+
val visibleName: String,
124+
val discId: String, // The discord voice server id
125+
val cfIds: List<String> // The new cf datacenter ids (IATA codes)
126+
) {
127+
AMSTERDAM("Amsterdam", "amsterdam", listOf("ams")),
128+
ATLANTA("Atlanta", "atlanta", listOf("atl")),
129+
BRAZIL("Brazil", "brazil", listOf(
130+
"aru", "bel", "bnu", "bsb", "caw", "cfc", "cgb", "cnf", "cwb", "fln", "for",
131+
"gig", "gru", "gyn", "itj", "jdo", "joi", "mao", "nvt", "pmw", "poa", "qwj",
132+
"rao", "rec", "sjk", "sjp", "sod", "ssa", "udi", "vcp", "vix", "xap"
133+
)),
134+
BUCHAREST("Bucharest", "bucharest", listOf("otp")),
135+
BUENOS_AIRES("Buenos Aires", "buenos-aires", listOf(
136+
"eze", "cor", "nqn"
137+
)),
138+
DUBAI("Dubai", "dubai", listOf("dxb")),
139+
EUROPE("Europe", "europe", listOf(
140+
"tia","evn","vie","gyd", "llk","msq","bru","sof","zag","lca","prg","cph","bod",
141+
"cdg", "lys", "mrs","tbs","ath", "skg","bud","kef","dub", "ork","fco", "pmo","rix",
142+
"vno","lux","kiv", "skp", "osl", "lis", "beg", "bts", "bcn", "got", "gva", "zrh",
143+
"adb", "ist", "kbp", "edi", "man", "dus", "ham", "muc", "str", "txl")),
144+
FINLAND("Finland", "finland", listOf("hel")),
145+
FRANKFURT("Frankfurt", "frankfurt", listOf("fra")),
146+
HONGKONG("Hong Kong", "hongkong", listOf("hkg", "mfm")),
147+
INDIA("India", "india", listOf(
148+
"amd", "bbi", "blr", "bom", "ccu", "cnn", "cok", "del", "hyd", "ixc", "knu", "maa", "nag", "pat"
149+
)),
150+
JAPAN("Japan","japan", listOf("fuk", "kix", "nrt", "oka")),
151+
LONDON("London", "london", listOf("lhr")),
152+
MADRID("Madrid", "madrid", listOf("mad")),
153+
MILAN("Milan", "milan", listOf("mxp")),
154+
MONTREAL("Montreal", "montreal", listOf(
155+
"yul", "yhz", "yow", "yvr", "ywg", "yxe", "yyc", "yyz"
156+
)),
157+
NEWARK("Newark", "newark", listOf("ewr")),
158+
OREGON("Oregon", "oregon", listOf("pdx")),
159+
ROTTERDAM("Rotterdam","rotterdam", listOf("rtm")),
160+
RUSSIA("Russia", "russia", listOf("dme", "led", "kja", "svx")),
161+
SANTA_CLARA("Santa Clara", "santa-clara", listOf("sjc")),
162+
SANTIAGO("Santiago", "santiago", listOf("scl", "ari")),
163+
SEATTLE("Seattle", "seattle", listOf("sea")),
164+
SINGAPORE("Singapore", "singapore", listOf("sin")),
165+
SOUTH_AFRICA("South Africa","southafrica", listOf(
166+
"cpt", "dur", "jnb"
167+
)),
168+
SOUTH_KOREA("South Korea", "south-korea", listOf("icn")),
169+
ST_PETE("St Pete", "st-pete", listOf("pie")),
170+
STOCKHOLM("Stockholm", "stockholm", listOf("arn")),
171+
SYDNEY("Sydney", "sydney", listOf(
172+
"syd", "adl", "akl", "bne", "cbr", "chc", "hba", "mel", "per"
173+
)),
174+
TEL_AVIV("Tel Aviv", "tel-aviv", listOf("tlv", "hfa")),
175+
US_CENTRAL("US Central", "us-central", listOf(
176+
"cle", "cmh", "den", "fsd", "ind", "mci", "mem", "msp", "okc", "oma", "ord", "phx", "stl", "dtw"
177+
)),
178+
US_EAST("US East", "us-east", listOf(
179+
"bgr", "bos", "buf", "iad", "orf", "phl", "pit", "rdu", "ric"
180+
)),
181+
US_SOUTH("US South", "us-south", listOf(
182+
"aus", "bna", "clt", "dfw", "iah", "jax", "mfe", "mia", "sat", "tpa", "tlh"
183+
)),
184+
US_WEST("US West", "us-west", listOf(
185+
"abq", "anc", "hnl", "las", "lax", "san", "sfo", "slc", "smf"
186+
)),
187+
WARSAW("Warsaw", "warsaw", listOf("waw")),
188+
189+
ASIA("Asia", "", listOf(
190+
"bhy", "can", "cgd", "cgo", "csx", "ctu", "czx", "dlc", "foc", "fuo", "hak",
191+
"hfe","hgh", "hyn", "jxg", "khn", "kmg", "kwe", "lhw", "nng", "pkx", "sha",
192+
"sjw","szx", "tao", "ten", "tna", "tsn", "tyn", "whu", "xfn", "xiy", "xnn",
193+
"zgn","khh", "tpe","uln","ceb", "cgy", "crk", "mnl","cgk", "dps", "jog","bkk",
194+
"cnx", "urt","dad", "han", "sgn","kch", "kul", "jhb", "bwn","pnh","vte","cgp",
195+
"dac", "jsr","cmb","isb", "khi", "lhe","ktm","pbh","mle","akx", "ala", "nqz","tas"
196+
)),
197+
CENTRAL_AMERICA("Central America", "", listOf(
198+
"gdl", "mex", "qro","gua","pty","sap", "tgu","sjo","bgi","gnd","kin","pos","sdq", "sti","sju",
199+
)),
200+
SOUTH_AMERICA("South America", "", listOf(
201+
"lim","lpb","gye", "uio","baq", "bog", "clo", "mde","geo","pbm"
202+
)),
203+
AFRICA("Africa", "", listOf(
204+
"aae", "alg", "orn", "tun","cai","abj", "ask","acc","dkr",
205+
"los","add","dar","ebb","kgl","mba","nbo","hre","jib",
206+
"mru","mpm", "oua","run","lun","fih","lad", "wdh","tnr"
207+
)),
208+
MIDDLE_EAST("Middle East", "", listOf(
209+
"bah","dmm", "ruh", "jed","doh", "kwi","mct","bey","amm",
210+
"bgw", "bsr", "ebl", "isu", "njf", "xnh","zdm"
211+
)),
212+
OCEANIA("Oceania", "", listOf(
213+
"nou","suv","gum","ppt"
214+
)),
215+
UNKNOWN("Unknown", "", listOf("local"));
157216

158217
companion object {
159218
@JvmStatic
160219
fun fromEndpoint(endpoint: String): VoiceRegion {
220+
// Handle new cloudflare based servers (e.g c-ewr07-d2466d40.discord.media:xxxx)
221+
if (endpoint.startsWith("c-")) {
222+
return parseCFEndpoint(endpoint)
223+
}
161224
// Endpoints come in format like "seattle1865.discord.gg", trim to subdomain with no numbers
162225
val endpointRegex = "^([a-z\\-]+)[0-9]+.*:443\$".toRegex()
163226
val match = endpointRegex.find(endpoint) ?: return UNKNOWN
164227
val idFromEndpoint = match.groupValues[1]
165-
return entries.find { it.id == idFromEndpoint } ?: UNKNOWN
228+
return entries.find { it.discId == idFromEndpoint } ?: UNKNOWN
229+
}
230+
231+
@JvmStatic
232+
fun parseCFEndpoint(endpoint: String): VoiceRegion {
233+
val endpointRegex = "^[a-z-A-Z0-9]-([a-z]+)[0-9]+-[a-zA-Z0-9]+\\.discord\\.media:[0-9]+$".toRegex()
234+
val match = endpointRegex.find(endpoint) ?: return UNKNOWN
235+
val idFromEndpoint = match.groupValues[1]
236+
return entries.find { it.cfIds.contains(idFromEndpoint) } ?: UNKNOWN
166237
}
167238
}
168239

169240
override fun toString(): String {
170-
return "${name}($id, $visibleName)"
241+
return "${name}($visibleName, $discId, $cfIds)"
171242
}
172243
}

0 commit comments

Comments
 (0)