@@ -26,7 +26,8 @@ object RegionGroup {
26
26
*/
27
27
@JvmField
28
28
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 )
30
31
31
32
override fun isRegionAllowed (node : LavalinkNode , region : VoiceRegion ): RegionFilterVerdict {
32
33
return if (region in regions) RegionFilterVerdict .PASS else RegionFilterVerdict .SOFT_BLOCK
@@ -40,7 +41,8 @@ object RegionGroup {
40
41
@JvmField
41
42
val EUROPE : IRegionFilter = object : IRegionFilter {
42
43
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 )
44
46
45
47
override fun isRegionAllowed (node : LavalinkNode , region : VoiceRegion ): RegionFilterVerdict {
46
48
return if (region in regions) RegionFilterVerdict .PASS else RegionFilterVerdict .SOFT_BLOCK
@@ -54,7 +56,8 @@ object RegionGroup {
54
56
@JvmField
55
57
val US : IRegionFilter = object : IRegionFilter {
56
58
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 )
58
61
59
62
override fun isRegionAllowed (node : LavalinkNode , region : VoiceRegion ): RegionFilterVerdict {
60
63
return if (region in regions) RegionFilterVerdict .PASS else RegionFilterVerdict .SOFT_BLOCK
@@ -66,7 +69,7 @@ object RegionGroup {
66
69
*/
67
70
@JvmField
68
71
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 )
70
73
71
74
override fun isRegionAllowed (node : LavalinkNode , region : VoiceRegion ): RegionFilterVerdict {
72
75
return if (region in regions) RegionFilterVerdict .PASS else RegionFilterVerdict .SOFT_BLOCK
@@ -78,7 +81,7 @@ object RegionGroup {
78
81
*/
79
82
@JvmField
80
83
val AFRICA : IRegionFilter = object : IRegionFilter {
81
- val regions = listOf (VoiceRegion .SOUTH_AFRICA )
84
+ val regions = listOf (VoiceRegion .SOUTH_AFRICA , VoiceRegion . AFRICA )
82
85
83
86
override fun isRegionAllowed (node : LavalinkNode , region : VoiceRegion ): RegionFilterVerdict {
84
87
return if (region in regions) RegionFilterVerdict .PASS else RegionFilterVerdict .SOFT_BLOCK
@@ -90,7 +93,7 @@ object RegionGroup {
90
93
*/
91
94
@JvmField
92
95
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 )
94
97
95
98
override fun isRegionAllowed (node : LavalinkNode , region : VoiceRegion ): RegionFilterVerdict {
96
99
return if (region in regions) RegionFilterVerdict .PASS else RegionFilterVerdict .SOFT_BLOCK
@@ -116,57 +119,125 @@ object RegionGroup {
116
119
}
117
120
118
121
// 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" ));
157
216
158
217
companion object {
159
218
@JvmStatic
160
219
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
+ }
161
224
// Endpoints come in format like "seattle1865.discord.gg", trim to subdomain with no numbers
162
225
val endpointRegex = " ^([a-z\\ -]+)[0-9]+.*:443\$ " .toRegex()
163
226
val match = endpointRegex.find(endpoint) ? : return UNKNOWN
164
227
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
166
237
}
167
238
}
168
239
169
240
override fun toString (): String {
170
- return " ${name} ($id , $visibleName )"
241
+ return " ${name} ($visibleName , $discId , $cfIds )"
171
242
}
172
243
}
0 commit comments