Skip to content

Commit

Permalink
feat(shulker-proxy-agent): listen on teleport player pub sub
Browse files Browse the repository at this point in the history
  • Loading branch information
jeremylvln committed Oct 27, 2023
1 parent 850af26 commit e4f8d17
Show file tree
Hide file tree
Showing 11 changed files with 86 additions and 54 deletions.
10 changes: 5 additions & 5 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,12 @@ class ProxyInterfaceBungeeCord(
)
}

override fun teleportPlayerOnServer(playerName: String, serverName: String) {
val server = this.proxy.getServerInfo(serverName)
if (server != null)
this.proxy.getPlayer(playerName)?.connect(server)
}

override fun getPlayerCount(): Int {
return this.proxy.players.size
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ interface ProxyInterface {
fun addServerPreConnectHook(hook: ServerPreConnectHook)
fun addServerPostConnectHook(hook: ServerPostConnectHook)

fun teleportPlayerOnServer(playerName: String, serverName: String)
fun getPlayerCount(): Int

fun scheduleDelayedTask(delay: Long, timeUnit: TimeUnit, runnable: Runnable): ScheduledTask
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import io.shulkermc.proxyagent.adapters.pubsub.PubSubAdapter
import io.shulkermc.proxyagent.adapters.pubsub.RedisPubSubAdapter
import io.shulkermc.proxyagent.api.ShulkerProxyAPI
import io.shulkermc.proxyagent.api.ShulkerProxyAPIImpl
import io.shulkermc.proxyagent.handlers.TeleportPlayerOnServerHandler
import io.shulkermc.proxyagent.services.PlayerMovementService
import io.shulkermc.proxyagent.services.ProxyLifecycleService
import io.shulkermc.proxyagent.services.ServerDirectoryService
Expand Down Expand Up @@ -60,6 +61,8 @@ class ShulkerProxyAgentCommon(val proxyInterface: ProxyInterface, val logger: Lo
this.playerMovementService = PlayerMovementService(this)
this.proxyLifecycleService = ProxyLifecycleService(this)

this.pubSub.onTeleportPlayerOnServer(TeleportPlayerOnServerHandler(this)::handle)

this.healthcheckTask = HealthcheckTask(this).schedule()
this.lostProxyPurgeTask = LostProxyPurgeTask(this).schedule()

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package io.shulkermc.proxyagent.adapters.cache

import io.shulkermc.proxyagent.api.ShulkerProxyAPI.PlayerPosition
import redis.clients.jedis.JedisPool
import redis.clients.jedis.Response
import redis.clients.jedis.params.SetParams
import java.util.Optional
import java.util.UUID
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,15 @@ class RedisPubSubAdapter(private val jedisPool: JedisPool) : PubSubAdapter {

override fun onTeleportPlayerOnServer(callback: (playerId: String, serverName: String) -> Unit) {
this.jedisPool.resource.use { jedis ->
jedis.subscribe(object : JedisPubSub() {
override fun onMessage(channel: String, message: String) {
val (playerId, serverName) = message.split(":")
callback(playerId, serverName)
}
}, "shulker:teleport")
jedis.subscribe(
object : JedisPubSub() {
override fun onMessage(channel: String, message: String) {
val (playerId, serverName) = message.split(":")
callback(playerId, serverName)
}
},
"shulker:teleport"
)
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package io.shulkermc.proxyagent.handlers

import io.shulkermc.proxyagent.ShulkerProxyAgentCommon

class TeleportPlayerOnServerHandler(private val agent: ShulkerProxyAgentCommon) {
fun handle(playerName: String, serverName: String) {
this.agent.proxyInterface.teleportPlayerOnServer(playerName, serverName)
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
package io.shulkermc.proxyagent.platform

data class ProxyPingHookResult(val playerCount: Int);
data class ProxyPingHookResult(val playerCount: Int)

typealias ProxyPingHook = () -> ProxyPingHookResult
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,14 @@ class ProxyInterfaceVelocity(private val plugin: ShulkerProxyAgentVelocity, priv
}
}

override fun teleportPlayerOnServer(playerName: String, serverName: String) {
this.proxy.getPlayer(playerName).ifPresent { player ->
this.proxy.getServer(serverName).ifPresent { server ->
player.createConnectionRequest(server).fireAndForget()
}
}
}

override fun getPlayerCount(): Int {
return this.proxy.playerCount
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,21 +14,22 @@ object GlobalFindCommand {
fun create(agent: ShulkerProxyAgentCommon): BrigadierCommand {
val rootNode = LiteralArgumentBuilder.literal<CommandSource>("gfind")
.requires { it.hasPermission("shulker.command.gfind") }
.then(RequiredArgumentBuilder.argument<CommandSource, String>("player", StringArgumentType.word())
.executes { context ->
val source = context.source
val player = context.getArgument("player", String::class.java)
val playerPosition = agent.cache.getPlayerIdFromName(player)
.flatMap { playerId -> agent.cache.getPlayerPosition(playerId) }
.then(
RequiredArgumentBuilder.argument<CommandSource, String>("player", StringArgumentType.word())
.executes { context ->
val source = context.source
val player = context.getArgument("player", String::class.java)
val playerPosition = agent.cache.getPlayerIdFromName(player)
.flatMap { playerId -> agent.cache.getPlayerPosition(playerId) }

if (playerPosition.isEmpty) {
source.sendMessage(Component.text("Player $player not found.", NamedTextColor.RED))
if (playerPosition.isEmpty) {
source.sendMessage(Component.text("Player $player not found.", NamedTextColor.RED))
return@executes Command.SINGLE_SUCCESS
}

source.sendMessage(Component.text("Player $player is connected on proxy ${playerPosition.get().proxyName} and located on server ${playerPosition.get().serverName}.", NamedTextColor.GREEN))
return@executes Command.SINGLE_SUCCESS
}

source.sendMessage(Component.text("Player $player is connected on proxy ${playerPosition.get().proxyName} and located on server ${playerPosition.get().serverName}.", NamedTextColor.GREEN))
return@executes Command.SINGLE_SUCCESS
}
)
.build()

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,43 +15,45 @@ object GlobalTeleportCommand {
fun create(agent: ShulkerProxyAgentCommon, proxyServer: ProxyServer): BrigadierCommand {
val rootNode = LiteralArgumentBuilder.literal<CommandSource>("gtp")
.requires { it.hasPermission("shulker.command.gtp") }
.then(RequiredArgumentBuilder.argument<CommandSource, String>("player", StringArgumentType.word())
.executes { context ->
val source = context.source
val player = context.getArgument("player", String::class.java)
val playerPosition = agent.cache.getPlayerIdFromName(player)
.flatMap { playerId -> agent.cache.getPlayerPosition(playerId) }

if (playerPosition.isEmpty) {
source.sendMessage(Component.text("Player $player not found.", NamedTextColor.RED))
return@executes Command.SINGLE_SUCCESS
}

val server = playerPosition.get().serverName
agent.pubSub.teleportPlayerOnServer(player, server)
source.sendMessage(Component.text("Teleported to server $server.", NamedTextColor.GREEN))

return@executes Command.SINGLE_SUCCESS
}
.then(RequiredArgumentBuilder.argument<CommandSource, String>("server", StringArgumentType.word())
.suggests { _, builder ->
proxyServer.allServers.forEach { server ->
builder.suggest(server.serverInfo.name)
}

return@suggests builder.buildFuture()
}
.then(
RequiredArgumentBuilder.argument<CommandSource, String>("player", StringArgumentType.word())
.executes { context ->
val source = context.source
val player = context.getArgument("player", String::class.java)
val server = context.getArgument("server", String::class.java)
val playerPosition = agent.cache.getPlayerIdFromName(player)
.flatMap { playerId -> agent.cache.getPlayerPosition(playerId) }

if (playerPosition.isEmpty) {
source.sendMessage(Component.text("Player $player not found.", NamedTextColor.RED))
return@executes Command.SINGLE_SUCCESS
}

val server = playerPosition.get().serverName
agent.pubSub.teleportPlayerOnServer(player, server)
source.sendMessage(Component.text("Teleported $player to server $server.", NamedTextColor.GREEN))
source.sendMessage(Component.text("Teleported to server $server.", NamedTextColor.GREEN))

return@executes Command.SINGLE_SUCCESS
}
)
.then(
RequiredArgumentBuilder.argument<CommandSource, String>("server", StringArgumentType.word())
.suggests { _, builder ->
proxyServer.allServers.forEach { server ->
builder.suggest(server.serverInfo.name)
}

return@suggests builder.buildFuture()
}
.executes { context ->
val source = context.source
val player = context.getArgument("player", String::class.java)
val server = context.getArgument("server", String::class.java)

agent.pubSub.teleportPlayerOnServer(player, server)
source.sendMessage(Component.text("Teleported $player to server $server.", NamedTextColor.GREEN))

return@executes Command.SINGLE_SUCCESS
}
)
)
.build()

Expand Down

0 comments on commit e4f8d17

Please sign in to comment.