diff --git a/build.gradle.kts b/build.gradle.kts index 7865ec7..df9ea8a 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -20,6 +20,7 @@ allprojects { maven("https://buf.build/gen/maven") maven("https://repo.simplecloud.app/snapshots") maven("https://repo.papermc.io/repository/maven-public/") + maven("https://repo.simplecloud.app/snapshots") } } diff --git a/command-shared/build.gradle.kts b/command-shared/build.gradle.kts index 1c2708d..616c5bb 100644 --- a/command-shared/build.gradle.kts +++ b/command-shared/build.gradle.kts @@ -1,5 +1,5 @@ dependencies { - compileOnly(libs.simplecloud.controller) + api(libs.simplecloud.api) api(libs.cloud.core) api(libs.adventure.api) api(libs.adventure.text.minimessage) diff --git a/command-shared/src/main/kotlin/app/simplecloud/plugin/command/shared/CloudCommandHandler.kt b/command-shared/src/main/kotlin/app/simplecloud/plugin/command/shared/CloudCommandHandler.kt index 3f3f26a..1d28c69 100644 --- a/command-shared/src/main/kotlin/app/simplecloud/plugin/command/shared/CloudCommandHandler.kt +++ b/command-shared/src/main/kotlin/app/simplecloud/plugin/command/shared/CloudCommandHandler.kt @@ -1,27 +1,22 @@ package app.simplecloud.plugin.command.shared -import app.simplecloud.controller.api.ControllerApi -import app.simplecloud.controller.shared.group.Group -import build.buf.gen.simplecloud.controller.v1.ServerStopCause -import net.kyori.adventure.text.Component +import app.simplecloud.api.CloudApi +import app.simplecloud.plugin.command.shared.commands.DeleteGroupCommand +import app.simplecloud.plugin.command.shared.commands.GroupInfoCommand +import app.simplecloud.plugin.command.shared.commands.ServerInfoCommand +import app.simplecloud.plugin.command.shared.commands.StartCommand +import app.simplecloud.plugin.command.shared.commands.StopCommand import net.kyori.adventure.text.minimessage.MiniMessage -import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder import org.incendo.cloud.CommandManager import org.incendo.cloud.context.CommandContext -import org.incendo.cloud.parser.standard.LongParser.longParser -import org.incendo.cloud.parser.standard.StringParser.stringParser import org.incendo.cloud.permission.Permission -import org.incendo.cloud.suggestion.Suggestion -import org.incendo.cloud.suggestion.SuggestionProvider -import java.util.concurrent.CompletableFuture -// TODO: maybe move this into multiple classes? class CloudCommandHandler( private val commandManager: CommandManager, val commandPlugin: CommandPlugin ) { - private val controllerApi = ControllerApi.createFutureApi() + private val cloudApi = CloudApi.create() fun createCloudCommand() { commandManager.command( @@ -43,12 +38,6 @@ class CloudCommandHandler( context.sender().sendMessage( MiniMessage.miniMessage().deserialize(commandPlugin.messageConfiguration.cloudGroupInfoCommand) ) - context.sender().sendMessage( - MiniMessage.miniMessage().deserialize(commandPlugin.messageConfiguration.cloudEditGroupCommand) - ) - context.sender().sendMessage( - MiniMessage.miniMessage().deserialize(commandPlugin.messageConfiguration.cloudEditServerCommand) - ) context.sender().sendMessage( MiniMessage.miniMessage() .deserialize(commandPlugin.messageConfiguration.cloudDeleteGroupCommand) @@ -58,553 +47,10 @@ class CloudCommandHandler( .build() ) - registerStartCommand() - registerStopCommand() - registerServerInfoCommand() - registerGroupInfoCommand() - registerDeleteGroupCommand() - registerEditGroupCommand() - registerEditServerCommand() - } - - private fun registerStartCommand() { - commandManager.command( - commandManager.commandBuilder("cloud") - .literal("start") - .required( - "group", - stringParser(), - SuggestionProvider { _, _ -> - controllerApi.getGroups().getAllGroups().thenApply { groups -> - groups.map { group -> Suggestion.suggestion(group.name) } - } - } - ) - .handler { context: CommandContext -> - val group = context.get("group") - - controllerApi.getServers().startServer(group).thenAccept { server -> - val message = MiniMessage.miniMessage().deserialize( - commandPlugin.messageConfiguration.serverStarting, - Placeholder.component("group", Component.text(group)), - Placeholder.component("id", Component.text(server?.numericalId!!)) - ) - - context.sender().sendMessage(message) - } - } - .permission(Permission.permission("simplecloud.command.cloud.start")) - .build() - ) - } - - private fun registerStopCommand() { - commandManager.command( - commandManager.commandBuilder("cloud") - .literal("stop") - .required("group", stringParser(), SuggestionProvider { _, _ -> - controllerApi.getGroups().getAllGroups().thenApply { groups -> - groups.map { group -> Suggestion.suggestion(group.name) } - } - }) - .optional("id", longParser(), SuggestionProvider { _, _ -> - controllerApi.getServers().getAllServers().thenApply { servers -> - servers.map { server -> Suggestion.suggestion(server.numericalId.toString()) } - } - }) - .handler { context: CommandContext -> - val group = context.get("group") - val id = context.getOrDefault("id", null as Long?) - - if (id == null) { - val message = MiniMessage.miniMessage().deserialize( - commandPlugin.messageConfiguration.groupServerStopped, - Placeholder.component("group", Component.text(group)), - ) - - controllerApi.getServers().getServersByGroup(group).thenAccept { servers -> - servers.forEach { server -> - controllerApi.getServers().stopServer( - server.group, - server.numericalId.toLong() - ) - } - } - - context.sender().sendMessage(message) - } else { - - val message = MiniMessage.miniMessage().deserialize( - commandPlugin.messageConfiguration.serverStopped, - Placeholder.component("group", Component.text(group)), - Placeholder.component("id", Component.text(id.toString())) - ) - - controllerApi.getServers().stopServer(group, id) - context.sender().sendMessage(message) - } - } - .permission(Permission.permission("simplecloud.command.cloud.stop")) - .build() - ) - } - - private fun registerServerInfoCommand() { - commandManager.command( - commandManager.commandBuilder("cloud") - .literal("info", "get") - .literal("servers", "server") - .optional("group", stringParser(), SuggestionProvider { _, _ -> - controllerApi.getGroups().getAllGroups().thenApply { groups -> - groups.map { group -> Suggestion.suggestion(group.name) } - } - }) - .optional("id", longParser(), SuggestionProvider { _, _ -> - controllerApi.getServers().getAllServers().thenApply { servers -> - servers.map { server -> Suggestion.suggestion(server.numericalId.toString()) } - } - }) - .handler { context: CommandContext -> - val groupName = context.getOrDefault("group", null as String?) - val id = context.getOrDefault("id", null as Long?) - - when { - groupName != null && id != null -> { - controllerApi.getServers().getServerByNumerical(groupName, id).thenAccept { server -> - controllerApi.getGroups().getGroupByName(groupName).thenAccept { group -> - context.sender().sendMessage( - MiniMessage.miniMessage() - .deserialize( - commandPlugin.messageConfiguration.serverInfoTitle, - Placeholder.component("servergroup", Component.text(server.group)), - Placeholder.component( - "serveramount", - Component.text( - controllerApi.getServers().getServersByGroup(groupName) - .get().size.toString() - ) - ), - ) - ) - context.sender().sendMessage( - MiniMessage.miniMessage() - .deserialize( - commandPlugin.messageConfiguration.serverInfoType, - Placeholder.component("grouptype", Component.text(server.type.name)) - ) - ) - context.sender().sendMessage( - MiniMessage.miniMessage() - .deserialize( - commandPlugin.messageConfiguration.serverInfoSoftware, - Placeholder.component( - "groupsoftware", - Component.text(group.properties["server-software"].toString()) - ) - ) - ) - context.sender().sendMessage( - MiniMessage.miniMessage() - .deserialize( - commandPlugin.messageConfiguration.serverInfoMemory, - Placeholder.component("groupmemory", Component.text(server.maxMemory)) - ) - ) - context.sender().sendMessage( - MiniMessage.miniMessage() - .deserialize( - commandPlugin.messageConfiguration.serverInfoPlayers, - Placeholder.component( - "groupplayers", - Component.text(server.playerCount) - ) - ) - ) - } - } - } - - groupName != null -> { - controllerApi.getServers().getServersByGroup(groupName).thenAccept { servers -> - context.sender().sendMessage( - MiniMessage.miniMessage().deserialize( - commandPlugin.messageConfiguration.groupServerListTitle, - Placeholder.component("servergroup", Component.text(groupName)) - ) - ) - servers.forEach { server -> - context.sender().sendMessage( - MiniMessage.miniMessage().deserialize( - commandPlugin.messageConfiguration.groupServerListEntry, - Placeholder.component("servergroup", Component.text(server.group)), - Placeholder.component( - "numericalid", - Component.text(server.numericalId.toString()) - ), - Placeholder.component( - "onlineplayers", - Component.text(server.playerCount) - ), - Placeholder.component("maxplayers", Component.text(server.maxPlayers)), - Placeholder.component("minmemory", Component.text(server.minMemory)), - Placeholder.component("maxmemory", Component.text(server.maxMemory)), - Placeholder.component("state", Component.text(server.state.name)), - ) - ) - } - } - } - - else -> { - controllerApi.getServers().getAllServers().thenAccept { servers -> - context.sender().sendMessage( - MiniMessage.miniMessage().deserialize( - commandPlugin.messageConfiguration.serverListTitle, - ) - ) - servers.forEach { server -> - context.sender().sendMessage( - MiniMessage.miniMessage().deserialize( - commandPlugin.messageConfiguration.serverListEntry, - Placeholder.component("servergroup", Component.text(server.group)), - Placeholder.component( - "numericalid", - Component.text(server.numericalId.toString()) - ), - Placeholder.component( - "onlineplayers", - Component.text(server.playerCount) - ), - Placeholder.component("maxplayers", Component.text(server.maxPlayers)), - Placeholder.component("minmemory", Component.text(server.minMemory)), - Placeholder.component("maxmemory", Component.text(server.maxMemory)), - Placeholder.component("state", Component.text(server.state.name)), - ) - ) - } - } - } - } - } - .permission(Permission.permission("simplecloud.command.cloud.get.servers")) - .build() - ) - } - - private fun registerGroupInfoCommand() { - commandManager.command( - commandManager.commandBuilder("cloud") - .literal("info", "get") - .literal("groups", "group") - .optional("group", stringParser(), SuggestionProvider { _, _ -> - controllerApi.getGroups().getAllGroups().thenApply { groups -> - groups.map { group -> Suggestion.suggestion(group.name) } - } - }) - .handler { context: CommandContext -> - val groupName = context.getOrDefault("group", null as String?) - if (groupName != null) { - controllerApi.getGroups().getGroupByName(groupName).thenAccept { group -> - controllerApi.getServers().getServersByGroup(groupName).thenAccept { servers -> - context.sender().sendMessage( - MiniMessage.miniMessage().deserialize( - commandPlugin.messageConfiguration.groupInfoTitle, - Placeholder.component("servergroup", Component.text(groupName)), - Placeholder.component("serveramount", Component.text(servers.size)) - ) - ) - - context.sender().sendMessage( - MiniMessage.miniMessage().deserialize( - commandPlugin.messageConfiguration.groupInfoType, - Placeholder.component("grouptype", Component.text(group.type.name)) - ) - ) - - context.sender().sendMessage( - MiniMessage.miniMessage().deserialize( - commandPlugin.messageConfiguration.groupInfoTemplate, - Placeholder.component( - "grouptemplate", - Component.text(group.properties.get("template-id").toString()) - ) - ) - ) - - context.sender().sendMessage( - MiniMessage.miniMessage().deserialize( - commandPlugin.messageConfiguration.groupInfoMemory, - Placeholder.component("minmemory", Component.text(group.minMemory)), - Placeholder.component("maxmemory", Component.text(group.maxMemory)) - ) - ) - - context.sender().sendMessage( - MiniMessage.miniMessage().deserialize( - commandPlugin.messageConfiguration.groupInfoPlayers, - Placeholder.component("maxplayers", Component.text(group.maxPlayers)) - ) - ) - } - } - } else { - controllerApi.getGroups().getAllGroups().thenAccept { groups -> - context.sender().sendMessage( - MiniMessage.miniMessage() - .deserialize(commandPlugin.messageConfiguration.groupsListTitle) - ) - groups.forEach { group -> - context.sender().sendMessage( - MiniMessage.miniMessage().deserialize( - commandPlugin.messageConfiguration.groupsListEntry, - Placeholder.component("servergroup", Component.text(group.name)), - Placeholder.component( - "onlinecount", - Component.text( - controllerApi.getServers().getServersByGroup(group) - .get().size.toString() - ) - ), - Placeholder.component( - "template", - Component.text(group.properties["template-id"].toString()) - ), - Placeholder.component("type", Component.text(group.type.name)), - Placeholder.component("maxcount", Component.text(group.maxOnlineCount)), - Placeholder.component("minmemory", Component.text(group.minMemory)), - Placeholder.component("maxmemory", Component.text(group.maxMemory)), - ) - ) - - } - } - } - } - .permission(Permission.permission("simplecloud.command.cloud.get.groups")) - .build() - ) - } - - private fun registerDeleteGroupCommand() { - commandManager.command( - commandManager.commandBuilder("cloud") - .literal("delete") - .literal("group") - .required("group", stringParser(), SuggestionProvider { _, _ -> - controllerApi.getGroups().getAllGroups().thenApply { groups -> - groups.map { group -> Suggestion.suggestion(group.name) } - } - }) - .handler { context: CommandContext -> - val group = context.get("group") - - val message = MiniMessage.miniMessage().deserialize( - commandPlugin.messageConfiguration.groupDeleted, - Placeholder.component("group", Component.text(group)) - ) - - controllerApi.getServers().getServersByGroup(group).thenAccept { servers -> - servers.forEach { server -> - controllerApi.getServers().stopServer( - server.group, - server.numericalId.toLong() - ) - } - } - - controllerApi.getGroups().deleteGroup(group) - context.sender().sendMessage(message) - } - .permission(Permission.permission("simplecloud.command.cloud.delete.group")) - .build() - ) - } - - private fun registerEditGroupCommand() { - commandManager.command( - commandManager.commandBuilder("cloud") - .literal("edit") - .literal("group") - .required("group", stringParser(), SuggestionProvider { _, _ -> - controllerApi.getGroups().getAllGroups().thenApply { groups -> - groups.map { group -> Suggestion.suggestion(group.name) } - } - }) - .required("setting", stringParser(), SuggestionProvider { _, _ -> - CompletableFuture.completedFuture( - listOf( - "max-players", - "max-memory", - "max-online-count", - "min-memory", - "min-online-count", - "properties", - "server-url", - "start-port" - ).map { Suggestion.suggestion(it) } - ) - }) - .required("value", stringParser()) - .handler { context: CommandContext -> - val groupName = context.get("group") - val setting = context.get("setting") - val value = context.get("value") - - controllerApi.getGroups().getGroupByName(groupName).thenAccept { group -> - val updatedGroup = when (setting) { - "max-players" -> group.copy( - maxPlayers = value.toLongOrNull() ?: return@thenAccept context.sender().sendMessage( - MiniMessage.miniMessage().deserialize( - commandPlugin.messageConfiguration.invalidValue, - Placeholder.component("value", Component.text(value)), - Placeholder.component("key", Component.text(setting)) - ) - ) - ) - - "max-memory" -> group.copy( - maxMemory = value.toLongOrNull() ?: return@thenAccept context.sender().sendMessage( - MiniMessage.miniMessage().deserialize( - commandPlugin.messageConfiguration.invalidValue, - Placeholder.component("value", Component.text(value)), - Placeholder.component("key", Component.text(setting)) - ) - ) - ) - - "min-memory" -> group.copy( - minMemory = value.toLongOrNull() ?: return@thenAccept context.sender().sendMessage( - MiniMessage.miniMessage().deserialize( - commandPlugin.messageConfiguration.invalidValue, - Placeholder.component("value", Component.text(value)), - Placeholder.component("key", Component.text(setting)) - ) - ) - ) - - "max-online-count" -> group.copy( - maxOnlineCount = value.toLongOrNull() ?: return@thenAccept context.sender().sendMessage( - MiniMessage.miniMessage().deserialize( - commandPlugin.messageConfiguration.invalidValue, - Placeholder.component("value", Component.text(value)), - Placeholder.component("key", Component.text(setting)) - ) - ) - ) - - "min-online-count" -> group.copy( - minOnlineCount = value.toLongOrNull() ?: return@thenAccept context.sender().sendMessage( - MiniMessage.miniMessage().deserialize( - commandPlugin.messageConfiguration.invalidValue, - Placeholder.component("value", Component.text(value)), - Placeholder.component("key", Component.text(setting)) - ) - ) - ) - - "start-port" -> group.copy( - startPort = value.toLongOrNull() ?: return@thenAccept context.sender().sendMessage( - MiniMessage.miniMessage().deserialize( - commandPlugin.messageConfiguration.invalidValue, - Placeholder.component("value", Component.text(value)), - Placeholder.component("key", Component.text(setting)) - ) - ) - ) - - "server-url" -> group.copy(properties = group.properties + mapOf("server-url" to value)) - "properties" -> group.copy(properties = group.properties + mapOf("custom-property" to value)) - else -> { - context.sender().sendMessage( - MiniMessage.miniMessage().deserialize( - commandPlugin.messageConfiguration.invalidSetting, - Placeholder.component("key", Component.text(setting)) - ) - ) - return@thenAccept - } - } - - controllerApi.getGroups().updateGroup(updatedGroup).thenAccept { group -> - context.sender().sendMessage( - MiniMessage.miniMessage().deserialize( - commandPlugin.messageConfiguration.groupUpdated, - Placeholder.component("group", Component.text(group.name)) - ) - ) - } - } - - - } - .permission(Permission.permission("simplecloud.command.cloud.edit.group")) - .build() - ) - } - - private fun registerEditServerCommand() { - commandManager.command( - commandManager.commandBuilder("cloud") - .literal("edit") - .literal("server") - .required("group", stringParser(), SuggestionProvider { _, _ -> - controllerApi.getGroups().getAllGroups().thenApply { groups -> - groups.map { group -> Suggestion.suggestion(group.name) } - } - }) - .required("id", longParser(), SuggestionProvider { _, _ -> - controllerApi.getServers().getAllServers().thenApply { servers -> - servers.map { server -> Suggestion.suggestion(server.numericalId.toString()) } - } - }) - .required("setting", stringParser(), SuggestionProvider { _, _ -> - CompletableFuture.completedFuture( - listOf("max-players").map { Suggestion.suggestion(it) } - ) - }) - .required("value", stringParser()) - .handler { context: CommandContext -> - val groupName = context.get("group") - val serverId = context.get("id") - val setting = context.get("setting") - val value = context.get("value") - - controllerApi.getServers().getServerByNumerical(groupName, serverId).thenAccept { server -> - val updatedServer = when (setting) { - "max-players" -> server.copy( - maxPlayers = value.toLongOrNull() ?: return@thenAccept context.sender().sendMessage( - MiniMessage.miniMessage().deserialize( - commandPlugin.messageConfiguration.invalidValue, - Placeholder.component("value", Component.text(value)), - Placeholder.component("key", Component.text(setting)) - ) - ) - ) - - else -> { - context.sender().sendMessage( - MiniMessage.miniMessage().deserialize( - commandPlugin.messageConfiguration.invalidSetting, - Placeholder.component("key", Component.text(setting)) - ) - ) - return@thenAccept - } - } - - controllerApi.getServers().updateServer(updatedServer).thenAccept { server -> - context.sender().sendMessage( - MiniMessage.miniMessage().deserialize( - commandPlugin.messageConfiguration.serverUpdated, - Placeholder.component("group", Component.text(server.group)), - Placeholder.component("numericalid", Component.text(server.numericalId.toString())) - ) - ) - } - } - } - .permission(Permission.permission("simplecloud.command.cloud.edit.server")) - .build() - ) + StartCommand(cloudApi, commandPlugin).register(commandManager) + StopCommand(cloudApi, commandPlugin).register(commandManager) + ServerInfoCommand(cloudApi, commandPlugin).register(commandManager) + GroupInfoCommand(cloudApi, commandPlugin).register(commandManager) + DeleteGroupCommand(cloudApi, commandPlugin).register(commandManager) } } diff --git a/command-shared/src/main/kotlin/app/simplecloud/plugin/command/shared/commands/DeleteGroupCommand.kt b/command-shared/src/main/kotlin/app/simplecloud/plugin/command/shared/commands/DeleteGroupCommand.kt new file mode 100644 index 0000000..e51b437 --- /dev/null +++ b/command-shared/src/main/kotlin/app/simplecloud/plugin/command/shared/commands/DeleteGroupCommand.kt @@ -0,0 +1,54 @@ +package app.simplecloud.plugin.command.shared.commands + +import app.simplecloud.api.CloudApi +import app.simplecloud.api.server.ServerQuery +import app.simplecloud.plugin.command.shared.CloudSender +import app.simplecloud.plugin.command.shared.CommandPlugin +import net.kyori.adventure.text.Component +import net.kyori.adventure.text.minimessage.MiniMessage +import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder +import org.incendo.cloud.CommandManager +import org.incendo.cloud.context.CommandContext +import org.incendo.cloud.parser.standard.StringParser.stringParser +import org.incendo.cloud.permission.Permission +import org.incendo.cloud.suggestion.Suggestion +import org.incendo.cloud.suggestion.SuggestionProvider + +class DeleteGroupCommand( + private val cloudApi: CloudApi, + private val commandPlugin: CommandPlugin +) { + + fun register(commandManager: CommandManager) { + commandManager.command( + commandManager.commandBuilder("cloud") + .literal("delete") + .literal("group") + .required("group", stringParser(), SuggestionProvider { _, _ -> + cloudApi.group().allGroups.thenApply { groups -> + groups.map { group -> Suggestion.suggestion(group.name) } + } + }) + .handler { context: CommandContext -> + val group = context.get("group") + + val message = MiniMessage.miniMessage().deserialize( + commandPlugin.messageConfiguration.groupDeleted, + Placeholder.component("group", Component.text(group)) + ) + + cloudApi.server().getAllServers(ServerQuery.create().filterByServerGroupName(group)).thenAccept { servers -> + servers.forEach { server -> + cloudApi.server().stopServer(server.serverId) + } + } + + cloudApi.group().deleteGroup(group) + context.sender().sendMessage(message) + } + .permission(Permission.permission("simplecloud.command.cloud.delete.group")) + .build() + ) + } +} + diff --git a/command-shared/src/main/kotlin/app/simplecloud/plugin/command/shared/commands/GroupInfoCommand.kt b/command-shared/src/main/kotlin/app/simplecloud/plugin/command/shared/commands/GroupInfoCommand.kt new file mode 100644 index 0000000..1662f19 --- /dev/null +++ b/command-shared/src/main/kotlin/app/simplecloud/plugin/command/shared/commands/GroupInfoCommand.kt @@ -0,0 +1,116 @@ +package app.simplecloud.plugin.command.shared.commands + +import app.simplecloud.api.CloudApi +import app.simplecloud.api.server.ServerQuery +import app.simplecloud.plugin.command.shared.CloudSender +import app.simplecloud.plugin.command.shared.CommandPlugin +import net.kyori.adventure.text.Component +import net.kyori.adventure.text.minimessage.MiniMessage +import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder +import org.incendo.cloud.CommandManager +import org.incendo.cloud.context.CommandContext +import org.incendo.cloud.parser.standard.StringParser.stringParser +import org.incendo.cloud.permission.Permission +import org.incendo.cloud.suggestion.Suggestion +import org.incendo.cloud.suggestion.SuggestionProvider + +class GroupInfoCommand( + private val cloudApi: CloudApi, + private val commandPlugin: CommandPlugin +) { + + fun register(commandManager: CommandManager) { + commandManager.command( + commandManager.commandBuilder("cloud") + .literal("info", "get") + .literal("groups", "group") + .optional("group", stringParser(), SuggestionProvider { _, _ -> + cloudApi.group().allGroups.thenApply { groups -> + groups.map { group -> Suggestion.suggestion(group.name) } + } + }) + .handler { context: CommandContext -> + val groupName = context.getOrDefault("group", null as String?) + if (groupName != null) { + cloudApi.group().getGroupByName(groupName).thenAccept { group -> + // TODO: get server by group + cloudApi.server().getAllServers(ServerQuery.create() + .filterByServerGroupName(groupName)).thenAccept { servers -> + context.sender().sendMessage( + MiniMessage.miniMessage().deserialize( + commandPlugin.messageConfiguration.groupInfoTitle, + Placeholder.component("servergroup", Component.text(groupName)), + Placeholder.component("serveramount", Component.text(servers.size)) + ) + ) + + context.sender().sendMessage( + MiniMessage.miniMessage().deserialize( + commandPlugin.messageConfiguration.groupInfoType, + Placeholder.component("grouptype", Component.text(group.type.name)) + ) + ) + + context.sender().sendMessage( + MiniMessage.miniMessage().deserialize( + commandPlugin.messageConfiguration.groupInfoTemplate, + Placeholder.component( + "grouptemplate", + Component.text(group.properties.get("template-id").toString()) + ) + ) + ) + + context.sender().sendMessage( + MiniMessage.miniMessage().deserialize( + commandPlugin.messageConfiguration.groupInfoMemory, + Placeholder.component("minmemory", Component.text(group.minMemory)), + Placeholder.component("maxmemory", Component.text(group.maxMemory)) + ) + ) + + context.sender().sendMessage( + MiniMessage.miniMessage().deserialize( + commandPlugin.messageConfiguration.groupInfoPlayers, + Placeholder.component("maxplayers", Component.text(group.maxPlayers)) + ) + ) + } + } + } else { + cloudApi.group().allGroups.thenAccept { groups -> + context.sender().sendMessage( + MiniMessage.miniMessage() + .deserialize(commandPlugin.messageConfiguration.groupsListTitle) + ) + groups.forEach { group -> + context.sender().sendMessage( + MiniMessage.miniMessage().deserialize( + commandPlugin.messageConfiguration.groupsListEntry, + Placeholder.component("servergroup", Component.text(group.name)), + Placeholder.component( + "onlinecount", + Component.text( + cloudApi.server().getAllServers(ServerQuery.create().filterByServerGroupName(groupName)).get().size.toString() + ) + ), + Placeholder.component( + "template", + Component.text(group.properties["template-id"].toString()) + ), + Placeholder.component("type", Component.text(group.type.name)), + Placeholder.component("maxcount", Component.text(group.maxPlayers)), + Placeholder.component("minmemory", Component.text(group.minMemory)), + Placeholder.component("maxmemory", Component.text(group.maxMemory)), + ) + ) + } + } + } + } + .permission(Permission.permission("simplecloud.command.cloud.get.groups")) + .build() + ) + } +} + diff --git a/command-shared/src/main/kotlin/app/simplecloud/plugin/command/shared/commands/ServerInfoCommand.kt b/command-shared/src/main/kotlin/app/simplecloud/plugin/command/shared/commands/ServerInfoCommand.kt new file mode 100644 index 0000000..95786c9 --- /dev/null +++ b/command-shared/src/main/kotlin/app/simplecloud/plugin/command/shared/commands/ServerInfoCommand.kt @@ -0,0 +1,164 @@ +package app.simplecloud.plugin.command.shared.commands + +import app.simplecloud.api.CloudApi +import app.simplecloud.plugin.command.shared.CloudSender +import app.simplecloud.plugin.command.shared.CommandPlugin +import org.incendo.cloud.CommandManager +import org.incendo.cloud.context.CommandContext +import org.incendo.cloud.parser.standard.LongParser.longParser +import org.incendo.cloud.parser.standard.StringParser.stringParser +import org.incendo.cloud.permission.Permission +import org.incendo.cloud.suggestion.Suggestion +import org.incendo.cloud.suggestion.SuggestionProvider +import kotlin.text.get + +class ServerInfoCommand( + private val cloudApi: CloudApi, + private val commandPlugin: CommandPlugin +) { + + fun register(commandManager: CommandManager) { + commandManager.command( + commandManager.commandBuilder("cloud") + .literal("info", "get") + .literal("servers", "server") + .optional("group", stringParser(), SuggestionProvider { _, _ -> + cloudApi.group().allGroups.thenApply { groups -> + groups.map { group -> Suggestion.suggestion(group.name) } + } + }) + .optional("id", longParser(), SuggestionProvider { _, _ -> + cloudApi.server().allServers.thenApply { servers -> + servers.map { server -> Suggestion.suggestion(server.numericalId.toString()) } + } + }) + .handler { context: CommandContext -> + val groupName = context.getOrDefault("group", null as String?) + val id = context.getOrDefault("id", null as Long?) + + when { + groupName != null && id != null -> { + /* TODO: get server by numerical + controllerApi.getServers().getServerByNumerical(groupName, id).thenAccept { server -> + + cloudApi.group().getGroupByName(groupName).thenAccept { group -> + context.sender().sendMessage( + MiniMessage.miniMessage() + .deserialize( + commandPlugin.messageConfiguration.serverInfoTitle, + Placeholder.component("servergroup", Component.text(server.group)), + Placeholder.component( + "serveramount", + Component.text( + controllerApi.getServers().getServersByGroup(groupName) + .get().size.toString() + ) + ), + ) + ) + context.sender().sendMessage( + MiniMessage.miniMessage() + .deserialize( + commandPlugin.messageConfiguration.serverInfoType, + Placeholder.component("grouptype", Component.text(server.type.name)) + ) + ) + context.sender().sendMessage( + MiniMessage.miniMessage() + .deserialize( + commandPlugin.messageConfiguration.serverInfoSoftware, + Placeholder.component( + "groupsoftware", + Component.text(group.properties["server-software"].toString()) + ) + ) + ) + context.sender().sendMessage( + MiniMessage.miniMessage() + .deserialize( + commandPlugin.messageConfiguration.serverInfoMemory, + Placeholder.component("groupmemory", Component.text(server.maxMemory)) + ) + ) + context.sender().sendMessage( + MiniMessage.miniMessage() + .deserialize( + commandPlugin.messageConfiguration.serverInfoPlayers, + Placeholder.component( + "groupplayers", + Component.text(server.playerCount) + ) + ) + ) + } + } + } + + groupName != null -> { + controllerApi.getServers().getServersByGroup(groupName).thenAccept { servers -> + context.sender().sendMessage( + MiniMessage.miniMessage().deserialize( + commandPlugin.messageConfiguration.groupServerListTitle, + Placeholder.component("servergroup", Component.text(groupName)) + ) + ) + servers.forEach { server -> + context.sender().sendMessage( + MiniMessage.miniMessage().deserialize( + commandPlugin.messageConfiguration.groupServerListEntry, + Placeholder.component("servergroup", Component.text(server.group)), + Placeholder.component( + "numericalid", + Component.text(server.numericalId.toString()) + ), + Placeholder.component( + "onlineplayers", + Component.text(server.playerCount) + ), + Placeholder.component("maxplayers", Component.text(server.maxPlayers)), + Placeholder.component("minmemory", Component.text(server.minMemory)), + Placeholder.component("maxmemory", Component.text(server.maxMemory)), + Placeholder.component("state", Component.text(server.state.name)), + ) + ) + } + } + } + + else -> { + controllerApi.getServers().getAllServers().thenAccept { servers -> + context.sender().sendMessage( + MiniMessage.miniMessage().deserialize( + commandPlugin.messageConfiguration.serverListTitle, + ) + ) + servers.forEach { server -> + context.sender().sendMessage( + MiniMessage.miniMessage().deserialize( + commandPlugin.messageConfiguration.serverListEntry, + Placeholder.component("servergroup", Component.text(server.group)), + Placeholder.component( + "numericalid", + Component.text(server.numericalId.toString()) + ), + Placeholder.component( + "onlineplayers", + Component.text(server.playerCount) + ), + Placeholder.component("maxplayers", Component.text(server.maxPlayers)), + Placeholder.component("minmemory", Component.text(server.minMemory)), + Placeholder.component("maxmemory", Component.text(server.maxMemory)), + Placeholder.component("state", Component.text(server.state.name)), + ) + ) + } + } + } + } */ + } + .permission(Permission.permission("simplecloud.command.cloud.get.servers")) + .build() + ) + } +} + diff --git a/command-shared/src/main/kotlin/app/simplecloud/plugin/command/shared/commands/StartCommand.kt b/command-shared/src/main/kotlin/app/simplecloud/plugin/command/shared/commands/StartCommand.kt new file mode 100644 index 0000000..d0ea65d --- /dev/null +++ b/command-shared/src/main/kotlin/app/simplecloud/plugin/command/shared/commands/StartCommand.kt @@ -0,0 +1,59 @@ +package app.simplecloud.plugin.command.shared.commands + +import app.simplecloud.api.CloudApi +import app.simplecloud.api.server.StartServerRequest +import app.simplecloud.plugin.command.shared.CloudSender +import app.simplecloud.plugin.command.shared.CommandPlugin +import net.kyori.adventure.text.Component +import net.kyori.adventure.text.minimessage.MiniMessage +import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder +import org.incendo.cloud.CommandManager +import org.incendo.cloud.context.CommandContext +import org.incendo.cloud.parser.standard.StringParser.stringParser +import org.incendo.cloud.permission.Permission +import org.incendo.cloud.suggestion.Suggestion +import org.incendo.cloud.suggestion.SuggestionProvider + +class StartCommand( + private val cloudApi: CloudApi, + private val commandPlugin: CommandPlugin +) { + + fun register(commandManager: CommandManager) { + commandManager.command( + commandManager.commandBuilder("cloud") + .literal("start") + .required( + "group", + stringParser(), + SuggestionProvider { _, _ -> + cloudApi.group().allGroups.thenApply { groups -> + groups.map { group -> Suggestion.suggestion(group.name) } + } + } + ) + .handler { context: CommandContext -> + val group = context.get("group") + + cloudApi.group().getGroupByName(group).thenAccept { group -> + val request = StartServerRequest(group.serverGroupId, group.name) + + cloudApi.server().startServer(request).thenAccept { server -> + val message = MiniMessage.miniMessage().deserialize( + commandPlugin.messageConfiguration.serverStarting, + Placeholder.component("group", Component.text(group.name)), + // TODO: server returns a Void + Placeholder.component("id", Component.text(server)) + ) + + context.sender().sendMessage(message) + } + } + + } + .permission(Permission.permission("simplecloud.command.cloud.start")) + .build() + ) + } +} + diff --git a/command-shared/src/main/kotlin/app/simplecloud/plugin/command/shared/commands/StopCommand.kt b/command-shared/src/main/kotlin/app/simplecloud/plugin/command/shared/commands/StopCommand.kt new file mode 100644 index 0000000..ca1f331 --- /dev/null +++ b/command-shared/src/main/kotlin/app/simplecloud/plugin/command/shared/commands/StopCommand.kt @@ -0,0 +1,75 @@ +package app.simplecloud.plugin.command.shared.commands + +import app.simplecloud.api.CloudApi +import app.simplecloud.api.server.ServerQuery +import app.simplecloud.plugin.command.shared.CloudSender +import app.simplecloud.plugin.command.shared.CommandPlugin +import net.kyori.adventure.text.Component +import net.kyori.adventure.text.minimessage.MiniMessage +import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder +import org.incendo.cloud.CommandManager +import org.incendo.cloud.context.CommandContext +import org.incendo.cloud.parser.standard.LongParser.longParser +import org.incendo.cloud.parser.standard.StringParser.stringParser +import org.incendo.cloud.permission.Permission +import org.incendo.cloud.suggestion.Suggestion +import org.incendo.cloud.suggestion.SuggestionProvider + +class StopCommand( + private val cloudApi: CloudApi, + private val commandPlugin: CommandPlugin +) { + + fun register(commandManager: CommandManager) { + commandManager.command( + commandManager.commandBuilder("cloud") + .literal("stop") + .required("group", stringParser(), SuggestionProvider { _, _ -> + cloudApi.group().allGroups.thenApply { groups -> + groups.map { group -> Suggestion.suggestion(group.name) } + } + }) + .optional("id", longParser(), SuggestionProvider { _, _ -> + cloudApi.server().allServers.thenApply { servers -> + servers.map { server -> Suggestion.suggestion(server.numericalId.toString()) } + } + }) + .handler { context: CommandContext -> + val group = context.get("group") + val id = context.getOrDefault("id", null as Long?) + + if (id == null) { + val message = MiniMessage.miniMessage().deserialize( + commandPlugin.messageConfiguration.groupServerStopped, + Placeholder.component("group", Component.text(group)), + ) + + // TODO: get server by group + + cloudApi.server().getAllServers(ServerQuery.create().filterByServerGroupName(group)) + .thenApply { servers -> + servers.forEach { server -> + cloudApi.server().stopServer(server.serverId) + } + } + + context.sender().sendMessage(message) + } else { + val message = MiniMessage.miniMessage().deserialize( + commandPlugin.messageConfiguration.serverStopped, + Placeholder.component("group", Component.text(group)), + Placeholder.component("id", Component.text(id.toString())) + ) + + // TODO: stop server by numerical + + // controllerApi.getServers().stopServer(group, id) + context.sender().sendMessage(message) + } + } + .permission(Permission.permission("simplecloud.command.cloud.stop")) + .build() + ) + } +} + diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 2a4b503..1190cad 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -2,7 +2,7 @@ kotlin = "2.0.20" shadow = "8.3.3" kapt = "2.0.20" -simplecloud-controller = "0.0.30-SNAPSHOT.2660ec8" +simplecloud-api = "0.1.0-platform.1-dev.1763294516035-de96444" cloud-core = "2.0.0" cloud-velocity = "2.0.0-beta.10" cloud-bungeecord = "2.0.0-beta.10" @@ -19,7 +19,7 @@ configurate-kotlin = "4.1.2" [libraries] kotlin-jvm = { module = "org.jetbrains.kotlin:kotlin-stdlib", version.ref = "kotlin" } kotlin-test = { module = "org.jetbrains.kotlin:kotlin-test", version.ref = "kotlin" } -simplecloud-controller = { module = "app.simplecloud.controller:controller-api", version.ref = "simplecloud-controller"} +simplecloud-api = { module = "app.simplecloud.api:api", version.ref = "simplecloud-api" } cloud-core = { module = "org.incendo:cloud-core", version.ref = "cloud-core" } cloud-velocity = { module = "org.incendo:cloud-velocity", version.ref = "cloud-velocity" } cloud-bungeecord = { module = "org.incendo:cloud-bungee", version.ref = "cloud-bungeecord" }