Skip to content

Commit 7b7fc55

Browse files
authored
Update voice region filters to match subregions. (#16)
* Update voice regions to match to subregions as well, Add Africa and South_America regiongroups * add santiago chile subregion * Split out subregions to their own regions
1 parent 1f2d7d4 commit 7b7fc55

File tree

1 file changed

+61
-9
lines changed

1 file changed

+61
-9
lines changed

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

Lines changed: 61 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -23,53 +23,105 @@ enum class RegionFilterVerdict {
2323
object RegionGroup {
2424
@JvmField
2525
val ASIA: IRegionFilter = object : IRegionFilter {
26-
val regions = listOf(VoiceRegion.SIDNEY, VoiceRegion.INDIA, VoiceRegion.JAPAN, VoiceRegion.HONGKONG, VoiceRegion.SOUTH_AFRICA)
26+
val regions = listOf(VoiceRegion.SYDNEY, VoiceRegion.INDIA, VoiceRegion.JAPAN, VoiceRegion.HONGKONG, VoiceRegion.SINGAPORE, VoiceRegion.SOUTH_KOREA)
2727

2828
override fun isRegionAllowed(node: LavalinkNode, region: VoiceRegion): RegionFilterVerdict {
2929
return if (region in regions) RegionFilterVerdict.PASS else RegionFilterVerdict.SOFT_BLOCK
3030
}
3131
}
3232
@JvmField
3333
val EUROPE: IRegionFilter = object : IRegionFilter {
34-
val regions = listOf(VoiceRegion.ROTTERDAM, VoiceRegion.RUSSIA)
34+
val regions = listOf(VoiceRegion.ROTTERDAM, VoiceRegion.RUSSIA, VoiceRegion.AMSTERDAM, VoiceRegion.MADRID, VoiceRegion.MILAN,
35+
VoiceRegion.BUCHAREST, VoiceRegion.EUROPE, VoiceRegion.LONDON, VoiceRegion.FINLAND, VoiceRegion.FRANKFURT, VoiceRegion.STOCKHOLM)
3536

3637
override fun isRegionAllowed(node: LavalinkNode, region: VoiceRegion): RegionFilterVerdict {
3738
return if (region in regions) RegionFilterVerdict.PASS else RegionFilterVerdict.SOFT_BLOCK
3839
}
3940
}
4041
@JvmField
4142
val US: IRegionFilter = object : IRegionFilter {
42-
val regions = listOf(VoiceRegion.BRAZIL, VoiceRegion.SIDNEY, VoiceRegion.US_CENTRAL, VoiceRegion.US_EAST, VoiceRegion.US_SOUTH, VoiceRegion.US_WEST)
43+
val regions = listOf(VoiceRegion.US_CENTRAL, VoiceRegion.US_EAST, VoiceRegion.US_SOUTH, VoiceRegion.US_WEST, VoiceRegion.ATLANTA,
44+
VoiceRegion.SEATTLE, VoiceRegion.SANTA_CLARA, VoiceRegion.NEWARK, VoiceRegion.MONTREAL, VoiceRegion.OREGON, VoiceRegion.ST_PETE)
45+
46+
override fun isRegionAllowed(node: LavalinkNode, region: VoiceRegion): RegionFilterVerdict {
47+
return if (region in regions) RegionFilterVerdict.PASS else RegionFilterVerdict.SOFT_BLOCK
48+
}
49+
}
50+
@JvmField
51+
val SOUTH_AMERICA: IRegionFilter = object : IRegionFilter {
52+
val regions = listOf(VoiceRegion.BRAZIL, VoiceRegion.SANTIAGO, VoiceRegion.BUENOS_AIRES)
53+
54+
override fun isRegionAllowed(node: LavalinkNode, region: VoiceRegion): RegionFilterVerdict {
55+
return if (region in regions) RegionFilterVerdict.PASS else RegionFilterVerdict.SOFT_BLOCK
56+
}
57+
}
58+
@JvmField
59+
val AFRICA: IRegionFilter = object : IRegionFilter {
60+
val regions = listOf(VoiceRegion.SOUTH_AFRICA)
61+
62+
override fun isRegionAllowed(node: LavalinkNode, region: VoiceRegion): RegionFilterVerdict {
63+
return if (region in regions) RegionFilterVerdict.PASS else RegionFilterVerdict.SOFT_BLOCK
64+
}
65+
}
66+
@JvmField
67+
val MIDDLE_EAST: IRegionFilter = object : IRegionFilter {
68+
val regions = listOf(VoiceRegion.TEL_AVIV, VoiceRegion.DUBAI)
4369

4470
override fun isRegionAllowed(node: LavalinkNode, region: VoiceRegion): RegionFilterVerdict {
4571
return if (region in regions) RegionFilterVerdict.PASS else RegionFilterVerdict.SOFT_BLOCK
4672
}
4773
}
4874

75+
4976
/**
5077
* Gets a [RegionGroup] from a string. This method is case-insensitive.
5178
*
52-
* @param region The region to get the [RegionGroup] for. Valid values are [ASIA], [EUROPE], and [US].
79+
* @param region The region to get the [RegionGroup] for.
80+
* Valid values are [AFRICA], [ASIA], [EUROPE], [MIDDLE_EAST], [SOUTH_AMERICA] and [US].
5381
*/
5482
fun valueOf(region: String) = when (region.uppercase()) {
83+
"AFRICA" -> AFRICA
5584
"ASIA" -> ASIA
5685
"EUROPE" -> EUROPE
86+
"MIDDLE_EAST" -> MIDDLE_EAST
87+
"SOUTH_AMERICA" -> SOUTH_AMERICA
5788
"US" -> US
5889
else -> throw IllegalArgumentException("No region constant: $region")
5990
}
6091
}
6192

6293
// TODO In case no exact server match, should it look for the closest node in that same region?
6394
enum class VoiceRegion(val id: String, val visibleName: String) {
95+
AMSTERDAM("amsterdam", "Amsterdam"),
96+
ATLANTA("atlanta", "Atlanta"),
6497
BRAZIL("brazil", "Brazil"),
98+
BUCHAREST("bucharest", "Bucharest"),
99+
BUENOS_AIRES("buenos-aires", "Brazil"),
100+
DUBAI("dubai", "Dubai"),
101+
EUROPE("europe", "Europe"),
102+
FINLAND("finland", "Finland"),
103+
FRANKFURT("frankfurt", "Frankfurt"),
65104
HONGKONG("hongkong", "Hong Kong"),
66105
INDIA("india", "India"),
67-
JAPAN("japan", "Japan"),
68-
ROTTERDAM("rotterdam", "Rotterdam"),
106+
JAPAN("japan","Japan"),
107+
LONDON("london", "London"),
108+
MADRID("madrid", "Madrid"),
109+
MILAN("milan", "Milan"),
110+
MONTREAL("montreal", "Montreal"),
111+
NEWARK("newark", "Newark"),
112+
OREGON("oregon", "Oregon"),
113+
ROTTERDAM("rotterdam","Rotterdam"),
69114
RUSSIA("russia", "Russia"),
115+
SANTA_CLARA("santa-clara", "Santa Clara"),
116+
SANTIAGO("santiago", "Santiago"),
117+
SEATTLE("seattle", "Seattle"),
70118
SINGAPORE("singapore", "Singapore"),
71-
SOUTH_AFRICA("southafrica", "South Africa"),
72-
SIDNEY("sidney", "Sidney"),
119+
SOUTH_AFRICA("southafrica","South Africa"),
120+
SOUTH_KOREA("south-korea", "South Korea"),
121+
ST_PETE("st-pete", "St Pete"),
122+
STOCKHOLM("stockholm", "Stockholm"),
123+
SYDNEY("sydney", "Sydney"),
124+
TEL_AVIV("tel-aviv", "Tel Aviv"),
73125
US_CENTRAL("us-central", "US Central"),
74126
US_EAST("us-east", "US East"),
75127
US_SOUTH("us-south", "US South"),
@@ -80,10 +132,10 @@ enum class VoiceRegion(val id: String, val visibleName: String) {
80132
companion object {
81133
@JvmStatic
82134
fun fromEndpoint(endpoint: String): VoiceRegion {
135+
// Endpoints come in format like "seattle1865.discord.gg", trim to subdomain with no numbers
83136
val endpointRegex = "^([a-z\\-]+)[0-9]+.*:443\$".toRegex()
84137
val match = endpointRegex.find(endpoint) ?: return UNKNOWN
85138
val idFromEndpoint = match.groupValues[1]
86-
87139
return entries.find { it.id == idFromEndpoint } ?: UNKNOWN
88140
}
89141
}

0 commit comments

Comments
 (0)