Skip to content
This repository was archived by the owner on Dec 10, 2025. It is now read-only.

Commit 21640aa

Browse files
committed
refactor(netty): simplify Velocity secret handling and optimize Bukkit packet listener components
1 parent 29060b2 commit 21640aa

File tree

3 files changed

+42
-53
lines changed

3 files changed

+42
-53
lines changed

surf-cloud-bukkit/src/main/kotlin/dev/slne/surf/cloud/bukkit/netty/network/BukkitSpecificPacketListenerExtension.kt

Lines changed: 12 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package dev.slne.surf.cloud.bukkit.netty.network
22

3+
import com.github.shynixn.mccoroutine.folia.entityDispatcher
34
import com.github.shynixn.mccoroutine.folia.globalRegionDispatcher
45
import com.github.shynixn.mccoroutine.folia.launch
56
import dev.slne.surf.cloud.api.common.player.teleport.TeleportCause
@@ -17,7 +18,6 @@ import dev.slne.surf.cloud.core.common.netty.network.protocol.running.Serverboun
1718
import dev.slne.surf.surfapi.bukkit.api.extensions.server
1819
import dev.slne.surf.surfapi.bukkit.api.nms.NmsUseWithCaution
1920
import dev.slne.surf.surfapi.bukkit.api.nms.bridges.nmsCommonBridge
20-
import dev.slne.surf.surfapi.bukkit.api.util.dispatcher
2121
import kotlinx.coroutines.flow.launchIn
2222
import kotlinx.coroutines.flow.map
2323
import kotlinx.coroutines.flow.onEach
@@ -26,28 +26,11 @@ import net.kyori.adventure.text.Component
2626
import org.bukkit.Bukkit
2727
import java.net.InetAddress
2828
import java.net.InetSocketAddress
29-
import java.nio.charset.StandardCharsets
3029
import java.util.*
31-
import kotlin.io.path.Path
32-
import kotlin.io.path.inputStream
33-
import kotlin.io.path.notExists
3430
import org.springframework.stereotype.Component as SpringComponent
3531

3632
@SpringComponent
3733
class BukkitSpecificPacketListenerExtension : PlatformSpecificPacketListenerExtension {
38-
private val properties by lazy {
39-
val propertiesPath = Path("server.properties")
40-
if (propertiesPath.notExists()) {
41-
Properties()
42-
} else {
43-
Properties().apply {
44-
propertiesPath.inputStream().use { inputStream ->
45-
load(inputStream)
46-
}
47-
}
48-
}
49-
}
50-
5134
override val playAddress: InetSocketAddress by lazy {
5235
InetSocketAddress(InetAddress.getByName(server.ip), server.port)
5336
}
@@ -65,7 +48,7 @@ class BukkitSpecificPacketListenerExtension : PlatformSpecificPacketListenerExte
6548

6649
override fun disconnectPlayer(playerUuid: UUID, reason: Component) {
6750
val player = Bukkit.getPlayer(playerUuid) ?: return
68-
plugin.launch(player.dispatcher()) {
51+
plugin.launch(plugin.entityDispatcher(player)) {
6952
player.kick(reason)
7053
}
7154
}
@@ -104,17 +87,6 @@ class BukkitSpecificPacketListenerExtension : PlatformSpecificPacketListenerExte
10487
return player.teleportAsync(targetPlayer.location).await()
10588
}
10689

107-
@OptIn(NmsUseWithCaution::class)
108-
override fun setVelocitySecret(secret: ByteArray) {
109-
// nmsCommonBridge.setVelocityEnabled(true)
110-
// nmsCommonBridge.setVelocitySecret(secret.toString(StandardCharsets.UTF_8))
111-
// nmsCommonBridge.setOnlineMode(false)
112-
113-
BukkitVelocitySecretManager.currentVelocityEnabled = true
114-
BukkitVelocitySecretManager.currentVelocitySecret = secret
115-
BukkitVelocitySecretManager.currentOnlineMode = false
116-
}
117-
11890
override fun triggerShutdown() {
11991
plugin.launch(plugin.globalRegionDispatcher) {
12092
Bukkit.shutdown()
@@ -129,6 +101,13 @@ class BukkitSpecificPacketListenerExtension : PlatformSpecificPacketListenerExte
129101
server.shutdown()
130102
}
131103

104+
@OptIn(NmsUseWithCaution::class)
105+
override fun setVelocitySecret(secret: ByteArray) {
106+
BukkitVelocitySecretManager.currentVelocityEnabled = true
107+
BukkitVelocitySecretManager.currentVelocitySecret = secret
108+
BukkitVelocitySecretManager.currentOnlineMode = false
109+
}
110+
132111
@OptIn(NmsUseWithCaution::class)
133112
object BukkitVelocitySecretManager {
134113

@@ -138,7 +117,7 @@ class BukkitSpecificPacketListenerExtension : PlatformSpecificPacketListenerExte
138117
@Volatile
139118
var currentVelocitySecret = nmsCommonBridge
140119
.getVelocitySecret()
141-
.toByteArray(StandardCharsets.UTF_8)
120+
.toByteArray()
142121

143122
@Volatile
144123
var currentOnlineMode = server.onlineMode
@@ -147,22 +126,18 @@ class BukkitSpecificPacketListenerExtension : PlatformSpecificPacketListenerExte
147126
observingFlow({ nmsCommonBridge.isVelocityEnabled() })
148127
.onEach { remote ->
149128
if (remote != currentVelocityEnabled) {
150-
println("Updating Velocity enabled state: $remote")
151129
nmsCommonBridge.setVelocityEnabled(currentVelocityEnabled)
152130
}
153131
}
154132
.launchIn(CommonObservableScope)
155133

156134

157135
observingFlow({ nmsCommonBridge.getVelocitySecret() })
158-
.map { it.toByteArray(StandardCharsets.UTF_8) }
136+
.map { it.toByteArray() }
159137
.onEach { remote ->
160138
if (!remote.contentEquals(currentVelocitySecret)) {
161-
println("Updating Velocity secret: ${remote.toString(StandardCharsets.UTF_8)}")
162139
nmsCommonBridge.setVelocitySecret(
163-
currentVelocitySecret.toString(
164-
StandardCharsets.UTF_8
165-
)
140+
currentVelocitySecret.decodeToString()
166141
)
167142
}
168143
}
@@ -171,7 +146,6 @@ class BukkitSpecificPacketListenerExtension : PlatformSpecificPacketListenerExte
171146
observingFlow({ server.onlineMode })
172147
.onEach { remote ->
173148
if (remote != currentOnlineMode) {
174-
println("Updating online mode: $remote")
175149
nmsCommonBridge.setOnlineMode(remote)
176150
}
177151
}

surf-cloud-standalone/src/main/kotlin/dev/slne/surf/cloud/standalone/netty/server/ProxySecretHolder.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,12 @@ import dev.slne.surf.cloud.api.server.netty.packet.broadcast
44
import dev.slne.surf.cloud.core.common.netty.network.protocol.common.ClientboundSetVelocitySecretPacket
55
import dev.slne.surf.cloud.standalone.config.ProxyConfig.SecretConfig.SecretType
66
import dev.slne.surf.cloud.standalone.config.standaloneConfig
7-
import dev.slne.surf.surfapi.core.api.util.random
7+
import org.apache.commons.lang3.RandomStringUtils
88

99
object ProxySecretHolder {
1010

1111
private var dynamicSecret = randomSecret()
1212

13-
private fun randomSecret() = ByteArray(128).apply { random.nextBytes(this) }
14-
1513
fun currentSecret(): ByteArray {
1614
val secretConfig = standaloneConfig.proxy.secretConfig
1715
return when (secretConfig.type) {
@@ -24,4 +22,6 @@ object ProxySecretHolder {
2422
dynamicSecret = randomSecret()
2523
ClientboundSetVelocitySecretPacket(currentSecret()).broadcast()
2624
}
25+
26+
private fun randomSecret() = RandomStringUtils.secureStrong().next(128).toByteArray()
2727
}

surf-cloud-velocity/src/main/kotlin/dev/slne/surf/cloud/velocity/netty/network/VelocitySpecificPacketListenerExtension.kt

Lines changed: 27 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,20 @@
11
package dev.slne.surf.cloud.velocity.netty.network
22

3-
import com.github.benmanes.caffeine.cache.Caffeine
43
import com.velocitypowered.api.proxy.ConnectionRequestBuilder
54
import com.velocitypowered.api.proxy.server.ServerInfo
65
import dev.slne.surf.cloud.api.common.player.teleport.TeleportCause
76
import dev.slne.surf.cloud.api.common.player.teleport.TeleportFlag
87
import dev.slne.surf.cloud.api.common.player.teleport.TeleportLocation
8+
import dev.slne.surf.cloud.api.common.util.observer.observingFlow
99
import dev.slne.surf.cloud.core.client.netty.network.PlatformSpecificPacketListenerExtension
1010
import dev.slne.surf.cloud.core.client.server.ClientCloudServerImpl
11+
import dev.slne.surf.cloud.core.common.coroutines.CommonObservableScope
1112
import dev.slne.surf.cloud.core.common.netty.network.protocol.running.RegistrationInfo
1213
import dev.slne.surf.cloud.core.common.netty.network.protocol.running.ServerboundTransferPlayerPacketResponse.Status
1314
import dev.slne.surf.cloud.velocity.proxy
1415
import dev.slne.surf.cloud.velocity.reflection.VelocityConfigurationProxy
16+
import kotlinx.coroutines.flow.launchIn
17+
import kotlinx.coroutines.flow.onEach
1518
import kotlinx.coroutines.future.await
1619
import net.kyori.adventure.text.Component
1720
import java.net.InetSocketAddress
@@ -21,9 +24,6 @@ import org.springframework.stereotype.Component as SpringComponent
2124

2225
@SpringComponent
2326
class VelocitySpecificPacketListenerExtension : PlatformSpecificPacketListenerExtension {
24-
private val serverInfoCache = Caffeine.newBuilder()
25-
.build<Long, ServerInfo>()
26-
2727
override val playAddress: InetSocketAddress
2828
get() = proxy.boundAddress
2929

@@ -67,8 +67,8 @@ class VelocitySpecificPacketListenerExtension : PlatformSpecificPacketListenerEx
6767
error("Teleporting players is not supported on Velocity")
6868
}
6969

70-
override fun registerCloudServersToProxy(servers: Array<RegistrationInfo>) {
71-
servers.map { (name, address) -> ServerInfo(name, address) }
70+
override fun registerCloudServersToProxy(packets: Array<RegistrationInfo>) {
71+
packets.map { (name, address) -> ServerInfo(name, address) }
7272
.forEach { proxy.registerServer(it) }
7373
}
7474

@@ -77,11 +77,10 @@ class VelocitySpecificPacketListenerExtension : PlatformSpecificPacketListenerEx
7777
println("Registering server $serverInfo to proxy")
7878

7979
proxy.registerServer(serverInfo)
80-
serverInfoCache.put(client.uid, serverInfo)
8180
}
8281

8382
override fun unregisterCloudServerFromProxy(client: ClientCloudServerImpl) {
84-
val info = serverInfoCache.getIfPresent(client.uid) ?: return
83+
val info = ServerInfo(client.name, client.playAddress)
8584
println("Unregistering server $info from proxy")
8685
proxy.unregisterServer(info)
8786
}
@@ -93,10 +92,6 @@ class VelocitySpecificPacketListenerExtension : PlatformSpecificPacketListenerEx
9392
error("Teleporting players is not supported on Velocity")
9493
}
9594

96-
override fun setVelocitySecret(secret: ByteArray) {
97-
VelocityConfigurationProxy.instance.setForwardingSecret(proxy.configuration, secret)
98-
}
99-
10095
override fun triggerShutdown() {
10196
proxy.shutdown()
10297
}
@@ -108,4 +103,24 @@ class VelocitySpecificPacketListenerExtension : PlatformSpecificPacketListenerEx
108103
override fun shutdown() {
109104
proxy.shutdown()
110105
}
106+
107+
override fun setVelocitySecret(secret: ByteArray) {
108+
VelocitySecretManager.currentVelocitySecret = secret
109+
}
110+
111+
object VelocitySecretManager {
112+
@Volatile
113+
var currentVelocitySecret =
114+
VelocityConfigurationProxy.instance.getForwardingSecret(proxy.configuration)
115+
116+
init {
117+
observingFlow({ VelocityConfigurationProxy.instance.getForwardingSecret(proxy.configuration) })
118+
.onEach { remote ->
119+
if (!remote.contentEquals(currentVelocitySecret)) {
120+
VelocityConfigurationProxy.instance.setForwardingSecret(proxy.configuration, currentVelocitySecret)
121+
}
122+
}
123+
.launchIn(CommonObservableScope)
124+
}
125+
}
111126
}

0 commit comments

Comments
 (0)