Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
14 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
kotlin.code.style=official
kotlin.stdlib.default.dependency=false
org.gradle.parallel=true
version=2.2.1-SNAPSHOT
version=2.3.0-SNAPSHOT
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package dev.slne.surf.core.api.paper

import dev.slne.surf.core.api.paper.CorePlayerInfoProvider.Companion.getServerInfo
import java.util.*

interface CorePlayerInfoProvider {
fun createServerInfo(playerUuid: UUID): ServerInfo?

/**
* Server Info data class containing the server name, nice name and region. This is used to provide information about the server a player is currently on.
*
* @param serverName The name of the server the player is currently on.
* @param serverDisplayName The nice name of the server the player is currently on.
* @param serverRegion The region of the server the player is currently on.
*
* NOTE: This method should not be used to gain access to players current server. Use [dev.slne.surf.core.api.common.player.SurfPlayer.currentServer] instead.
*
* @see [getServerInfo]
*/
data class ServerInfo(
val serverName: String,
val serverDisplayName: String,
val serverRegion: String
Comment thread
TheBjoRedCraft marked this conversation as resolved.
)

companion object {
private lateinit var instance: CorePlayerInfoProvider
Comment thread
TheBjoRedCraft marked this conversation as resolved.

fun setInstance(provider: CorePlayerInfoProvider) {
instance = provider
}

/**
* Available after plugin bootstrapper
*/
fun getServerInfo(playerUuid: UUID) = instance.createServerInfo(playerUuid)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import com.velocitypowered.api.command.VelocityBrigadierMessage
import dev.jorel.commandapi.CommandAPICommand
import dev.jorel.commandapi.CommandTree
import dev.jorel.commandapi.arguments.Argument
import dev.jorel.commandapi.arguments.ArgumentSuggestions
import dev.jorel.commandapi.arguments.CommandAPIArgumentType
import dev.jorel.commandapi.executors.CommandArguments
import dev.slne.surf.api.core.messages.adventure.buildText
Expand All @@ -19,6 +20,14 @@ open class SurfServerArgument(nodeName: String) :
return CommonSurfServer::class.java
}

init {
replaceSuggestions(
ArgumentSuggestions.stringCollection { _ ->
SurfCoreApi.getCommonServers().map { it.name }
}
)
}

override fun getArgumentType(): CommandAPIArgumentType? {
return CommandAPIArgumentType.PRIMITIVE_STRING
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import com.mojang.brigadier.context.CommandContext
import dev.jorel.commandapi.CommandAPICommand
import dev.jorel.commandapi.CommandTree
import dev.jorel.commandapi.arguments.Argument
import dev.jorel.commandapi.arguments.ArgumentSuggestions
import dev.jorel.commandapi.arguments.CommandAPIArgumentType
import dev.jorel.commandapi.executors.CommandArguments
import dev.slne.surf.api.core.util.logger
Expand Down Expand Up @@ -33,6 +34,15 @@ open class SurfOfflinePlayerArgument(nodeName: String) :
SurfCoreApi.getOfflinePlayer(StringArgumentType.getString(cmdCtx, key))
}.asDeferred()

init {
replaceSuggestions(
ArgumentSuggestions.stringCollection { _ ->
SurfCoreApi.getOnlinePlayers()
.mapNotNull { it.lastKnownName }
}
)
}

companion object {
private val log = logger()
private val scope =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import com.velocitypowered.api.command.VelocityBrigadierMessage
import dev.jorel.commandapi.CommandAPICommand
import dev.jorel.commandapi.CommandTree
import dev.jorel.commandapi.arguments.Argument
import dev.jorel.commandapi.arguments.ArgumentSuggestions
import dev.jorel.commandapi.arguments.CommandAPIArgumentType
import dev.jorel.commandapi.executors.CommandArguments
import dev.slne.surf.api.core.messages.adventure.buildText
Expand Down Expand Up @@ -36,6 +37,16 @@ open class SurfPlayerArgument(nodeName: String) :
}
)
).create()


init {
replaceSuggestions(
ArgumentSuggestions.stringCollection { _ ->
SurfCoreApi.getOnlinePlayers()
.mapNotNull { it.lastKnownName }
}
)
}
}

inline fun CommandTree.surfPlayerArgument(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,10 @@ package dev.slne.surf.core.client

import dev.slne.surf.core.core.common.event.LocalSurfEventBusListener
import dev.slne.surf.core.core.common.player.SurfPlayerService
import dev.slne.surf.core.core.common.redis.listener.ExecuteCommandRedisListener
import dev.slne.surf.core.core.common.redis.listener.SendPlayerToProxyListener
import dev.slne.surf.core.core.common.redis.listener.SendPlayerToServerListener
import dev.slne.surf.core.core.common.redis.listener.ShutdownServerRedisListener
import dev.slne.surf.core.core.common.server.SurfServerService
import dev.slne.surf.rabbitmq.api.ClientRabbitMQApi
import dev.slne.surf.redis.RedisApi
Expand All @@ -31,6 +33,9 @@ class ClientLoader(
withListener(SendPlayerToServerListener)
withListener(SendPlayerToProxyListener)

withRequestResponseHandler(ShutdownServerRedisListener)
withRequestResponseHandler(ExecuteCommandRedisListener)

// Initialize Redis Maps
SurfPlayerService
SurfServerService
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,11 @@ import dev.slne.surf.core.api.common.server.SurfProxyServer
import dev.slne.surf.core.api.common.server.SurfServer
import dev.slne.surf.core.api.common.server.state.SurfServerState
import dev.slne.surf.core.client.ClientCoreInstance
import dev.slne.surf.core.core.common.redis.request.ExecuteCommandServerRequest
import dev.slne.surf.core.core.common.redis.request.ShutdownServerRequest
import dev.slne.surf.core.core.common.server.SurfServerService
import it.unimi.dsi.fastutil.objects.ObjectSet
import net.kyori.adventure.text.Component
import java.util.*

@AutoService(SurfServerService::class)
Expand Down Expand Up @@ -55,6 +58,14 @@ class SurfServerServiceImpl : SurfServerService {
}
}

override suspend fun shutdown(commonSurfServer: CommonSurfServer, reason: Component?) =
ShutdownServerRequest.createRequest(commonSurfServer, reason).status

override suspend fun executeCommand(
commonSurfServer: CommonSurfServer,
command: String
) = ExecuteCommandServerRequest.createRequest(commonSurfServer, command).status

override fun getServerByName(name: String) = servers.find { it.name == name }
override fun getServerByCategory(category: String) =
servers.filter { it.category == category }.toObjectSet()
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package dev.slne.surf.core.core.common.redis.listener

import dev.slne.surf.core.core.common.redis.request.ExecuteCommandServerRequest
import dev.slne.surf.redis.request.HandleRedisRequest
import dev.slne.surf.redis.request.RequestContext

object ExecuteCommandRedisListener {
@HandleRedisRequest
suspend fun handleExecuteCommandRequest(context: RequestContext<ExecuteCommandServerRequest.Request>) {
RemoteCommandExecutor.executeCommand(
context.request.commonSurfServer,
context.request.command
)?.let {
context.respond(
ExecuteCommandServerRequest.Response(
it
)
)
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package dev.slne.surf.core.core.common.redis.listener

import dev.slne.surf.api.core.util.requiredService
import dev.slne.surf.core.api.common.server.CommonSurfServer

private val listener = requiredService<RemoteCommandExecutor>()

interface RemoteCommandExecutor {
suspend fun executeCommand(commonSurfServer: CommonSurfServer, command: String): Boolean?

companion object :
RemoteCommandExecutor by listener
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package dev.slne.surf.core.core.common.redis.listener

import dev.slne.surf.api.core.util.requiredService
import dev.slne.surf.core.api.common.server.CommonSurfServer
import net.kyori.adventure.text.Component

private val listener = requiredService<ServerShutdownHandler>()

interface ServerShutdownHandler {
fun shutdown(commonSurfServer: CommonSurfServer, reason: Component?): Boolean?

companion object : ServerShutdownHandler by listener
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package dev.slne.surf.core.core.common.redis.listener

import dev.slne.surf.core.core.common.redis.request.ShutdownServerRequest
import dev.slne.surf.redis.request.HandleRedisRequest
import dev.slne.surf.redis.request.RequestContext

object ShutdownServerRedisListener {
@HandleRedisRequest
fun handleShutdownRequest(context: RequestContext<ShutdownServerRequest.Request>) {
Comment thread
TheBjoRedCraft marked this conversation as resolved.
ServerShutdownHandler.shutdown(
context.request.commonSurfServer,
context.request.reason
)?.let {
context.respond(
ShutdownServerRequest.Response(
it
)
)
}

}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package dev.slne.surf.core.core.common.redis.request

import dev.slne.surf.core.api.common.server.CommonSurfServer
import dev.slne.surf.core.core.CoreInstance
import dev.slne.surf.redis.request.RedisRequest
import dev.slne.surf.redis.request.RedisResponse
import kotlinx.serialization.Serializable
import kotlin.time.Duration.Companion.seconds

object ExecuteCommandServerRequest {
@Serializable
data class Request(
val commonSurfServer: CommonSurfServer,
val command: String
) : RedisRequest()

@Serializable
data class Response(
val status: Boolean
) : RedisResponse()

suspend fun createRequest(commonSurfServer: CommonSurfServer, command: String) =
runCatching {
CoreInstance.redisApi.sendRequest<Response>(
Request(commonSurfServer, command),
10.seconds.inWholeMilliseconds
)
}.getOrNull() ?: Response(false)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package dev.slne.surf.core.core.common.redis.request

import dev.slne.surf.api.core.serializer.adventure.component.SerializableComponent
import dev.slne.surf.core.api.common.server.CommonSurfServer
import dev.slne.surf.core.core.CoreInstance
import dev.slne.surf.redis.request.RedisRequest
import dev.slne.surf.redis.request.RedisResponse
import kotlinx.serialization.Serializable
import net.kyori.adventure.text.Component
import kotlin.time.Duration.Companion.seconds

object ShutdownServerRequest {
@Serializable
data class Request(
val commonSurfServer: CommonSurfServer,
val reason: SerializableComponent?
) : RedisRequest()

@Serializable
data class Response(
val status: Boolean
) : RedisResponse()

suspend fun createRequest(commonSurfServer: CommonSurfServer, reason: Component?) =
runCatching {
CoreInstance.redisApi.sendRequest<Response>(
Request(commonSurfServer, reason),
10.seconds.inWholeMilliseconds
)
}.getOrNull() ?: Response(false)
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import dev.slne.surf.core.api.common.server.SurfProxyServer
import dev.slne.surf.core.api.common.server.SurfServer
import dev.slne.surf.core.api.common.server.state.SurfServerState
import it.unimi.dsi.fastutil.objects.ObjectSet
import net.kyori.adventure.text.Component
import org.jetbrains.annotations.UnmodifiableView
import java.util.*

Expand All @@ -19,6 +20,9 @@ interface SurfServerService {
fun removeServer(server: CommonSurfServer)
fun changeState(commonSurfServer: CommonSurfServer, state: SurfServerState)

suspend fun shutdown(commonSurfServer: CommonSurfServer, reason: Component?): Boolean
suspend fun executeCommand(commonSurfServer: CommonSurfServer, command: String): Boolean

fun getServerByName(name: String): SurfServer?
fun getServerByUuid(uuid: UUID): CommonSurfServer?
fun getServerByCategory(category: String): ObjectSet<SurfServer>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,7 @@
package dev.slne.surf.core.microservice

import com.google.auto.service.AutoService
import dev.slne.surf.core.microservice.database.tables.SurfPlayerIpAddressHistoriesTable
import dev.slne.surf.core.microservice.database.tables.SurfPlayerNameHistoriesTable
import dev.slne.surf.core.microservice.database.tables.SurfPlayerTexturesHistoriesTable
import dev.slne.surf.core.microservice.database.tables.SurfPlayersTable
import dev.slne.surf.core.microservice.database.tables.*
import dev.slne.surf.core.microservice.rabbit.*
import dev.slne.surf.database.DatabaseApi
import dev.slne.surf.database.libs.org.jetbrains.exposed.v1.r2dbc.SchemaUtils
Expand All @@ -25,7 +22,8 @@ class CoreMicroservice : Microservice() {
SurfPlayerIpAddressHistoriesTable,
SurfPlayerNameHistoriesTable,
SurfPlayersTable,
SurfPlayerTexturesHistoriesTable
SurfPlayerTexturesHistoriesTable,
SurfPlayerErrorsTable
)
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,19 +1,24 @@
package dev.slne.surf.core.microservice.rabbit

import dev.slne.surf.core.core.common.rabbit.packet.player.error.SaveSurfPlayerErrorRequestPacket
import dev.slne.surf.core.core.common.rabbit.packet.player.error.SingleSurfPlayerErrorResponsePacket
import dev.slne.surf.core.microservice.database.repository.SurfPlayerErrorRepository
import dev.slne.surf.rabbitmq.api.handler.RabbitHandler
import kotlinx.coroutines.launch

object SurfPlayerErrorHandler {
@RabbitHandler
fun handleSavePlayerError(packet: SaveSurfPlayerErrorRequestPacket) = packet.launch {
SurfPlayerErrorRepository.saveError(
playerUuid = packet.playerUuid,
occurredOn = packet.occurredOn,
occurredAt = packet.occurredAt,
staffMessage = packet.staffMessage,
errorCode = packet.errorCode
packet.respond(
SingleSurfPlayerErrorResponsePacket(
SurfPlayerErrorRepository.saveError(
playerUuid = packet.playerUuid,
occurredOn = packet.occurredOn,
occurredAt = packet.occurredAt,
staffMessage = packet.staffMessage,
errorCode = packet.errorCode
)
)
)
}
}
Loading