Skip to content

Commit b4047a3

Browse files
implement: basic commands
1 parent 507a2c2 commit b4047a3

File tree

12 files changed

+317
-13
lines changed

12 files changed

+317
-13
lines changed

gradle/libs.versions.toml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,19 @@ configurate-yaml = "4.0.0"
1111
configurate-kotlin = "4.1.2"
1212
simplecloud-event-wrapper = "0.0.1-dev.950792a"
1313
simplecloud-controller = "0.0.30-dev.bf5da83"
14+
command-cloud-core = "2.0.0"
15+
command-cloud-velocity = "2.0.0-beta.10"
16+
command-cloud-bungeecord = "2.0.0-beta.10"
1417

1518
[libraries]
1619
kotlin-jvm = { module = "org.jetbrains.kotlin:kotlin-stdlib-jdk8", version.ref = "kotlin" }
1720
kotlin-test = { module = "org.jetbrains.kotlin:kotlin-test", version.ref = "kotlin" }
1821
kotlin-coroutines = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "kotlin-coroutines" }
1922

23+
command-cloud-core = { module = "org.incendo:cloud-core", version.ref = "command-cloud-core" }
24+
command-cloud-velocity = { module = "org.incendo:cloud-velocity", version.ref = "command-cloud-velocity" }
25+
command-cloud-bungeecord = { module = "org.incendo:cloud-bungee", version.ref = "command-cloud-bungeecord" }
26+
2027
velocity = { module = "com.velocitypowered:velocity-api", version.ref = "velocity" }
2128
bungeecord = { module = "net.md-5:bungeecord-api", version.ref = "bungeecord" }
2229
adventure-legacy-serializer = { module = "net.kyori:adventure-text-serializer-legacy", version.ref = "adventure" }

proxy-shared/build.gradle.kts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,6 @@ dependencies {
77
implementation(rootProject.libs.configurate.kotlin)
88

99
compileOnly(rootProject.libs.simplecloud.controller)
10+
11+
compileOnly(rootProject.libs.command.cloud.core)
1012
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package app.simplecloud.plugin.proxy.shared.config.message
2+
3+
import org.spongepowered.configurate.objectmapping.ConfigSerializable
4+
5+
@ConfigSerializable
6+
data class CommandMessageConfig(
7+
val toggleMaintenance: String = "<red>You have toggled the maintenance mode.",
8+
val activateMaintenance: String = "<red>You have activated the maintenance mode.",
9+
val maintenanceAlreadyActivated: String = "<red>The maintenance mode is already activated.",
10+
val deactivateMaintenance: String = "<red>You have deactivated the maintenance mode.",
11+
val maintenanceAlreadyDeactivated: String = "<red>The maintenance mode is already deactivated.",
12+
val layoutNotFound: String = "<red>The layout could not be found.",
13+
val layoutMaintenanceAlreadySet: String = "<red>The layout is already set for maintenance.",
14+
val layoutMaintenanceSet: String = "<red>The layout has been set for maintenance.",
15+
val layoutNonMaintenanceAlreadySet: String = "<red>The layout is already set for non-maintenance.",
16+
val layoutNonMaintenanceSet: String = "<red>The layout has been set for non-maintenance."
17+
)

proxy-shared/src/main/kotlin/app/simplecloud/plugin/proxy/shared/config/message/MessageConfig.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,5 @@ import org.spongepowered.configurate.objectmapping.ConfigSerializable
55
@ConfigSerializable
66
data class MessageConfig(
77
var kickMessage: KickMessageConfig = KickMessageConfig(),
8+
var commandMessage: CommandMessageConfig = CommandMessageConfig()
89
)

proxy-shared/src/main/kotlin/app/simplecloud/plugin/proxy/shared/handler/CloudControllerHandler.kt

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,19 @@ class CloudControllerHandler {
6262
}
6363
}
6464

65+
suspend fun setServicePropertiesOnAllGroupServices(key: String, value: String) {
66+
groupName?.let { name ->
67+
try {
68+
controllerApi.getServers().getServersByGroup(name).forEach { server ->
69+
controllerApi.getServers().updateServerProperty(server.uniqueId, key, value)
70+
}
71+
logger.info("Service property '$key' updated to '$value' on all services in group '$name'")
72+
} catch (e: Exception) {
73+
logger.severe("Error updating service properties on all group services: ${e.message}")
74+
}
75+
} ?: logger.warning("Group name is not initialized.")
76+
}
77+
6578
suspend fun setGroupProperties(key: String, value: String) {
6679
groupName?.let { name ->
6780
try {

proxy-shared/src/main/kotlin/app/simplecloud/plugin/proxy/shared/handler/MotdLayoutHandler.kt

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18,20 +18,17 @@ class MotdLayoutHandler(
1818

1919
companion object {
2020
private const val RANDOM_MOTD_KEY = "random-motd-layouts"
21-
private const val CURRENT_LAYOUT_KEY = "current-motd-layout"
22-
private const val CURRENT_MAINTENANCE_LAYOUT_KEY = "current-maintenance-layout"
23-
private const val DEFAULT_LAYOUT_NAME = "default-motd"
24-
private const val DEFAULT_MAINTENANCE_LAYOUT_NAME = "default-maintenance-motd"
21+
var CURRENT_LAYOUT_KEY = "current-motd-layout"
22+
var CURRENT_MAINTENANCE_LAYOUT_KEY = "current-maintenance-layout"
23+
const val DEFAULT_LAYOUT_NAME = "default-motd"
24+
const val DEFAULT_MAINTENANCE_LAYOUT_NAME = "default-maintenance-motd"
2525
}
2626

2727
fun loadMotdLayouts() {
2828
loadedMotdLayouts.clear()
2929
initializeLayoutDirectory()
30-
3130
loadLayoutsFromDirectory()
32-
3331
createDefaultLayoutsIfEmpty()
34-
3532
initializeCloudProperties()
3633
}
3734

@@ -55,7 +52,6 @@ class MotdLayoutHandler(
5552
if (getAllNoneMaintenanceLayouts().isEmpty()) {
5653
createAndSaveDefaultLayout(DEFAULT_LAYOUT_NAME)
5754
}
58-
5955
if (getAllMaintenanceLayouts().isEmpty()) {
6056
createAndSaveDefaultLayout(DEFAULT_MAINTENANCE_LAYOUT_NAME)
6157
}
@@ -73,21 +69,18 @@ class MotdLayoutHandler(
7369
if (getServiceProperties(RANDOM_MOTD_KEY).isEmpty()) {
7470
setServiceProperties(RANDOM_MOTD_KEY, "false")
7571
setGroupProperties(RANDOM_MOTD_KEY, "false")
76-
7772
logger.info("No random MOTD layout key found in service properties, setting to false.")
7873
}
7974

8075
if (getServiceProperties(CURRENT_LAYOUT_KEY).isEmpty()) {
8176
setServiceProperties(CURRENT_LAYOUT_KEY, getAllNoneMaintenanceLayouts().first())
8277
setGroupProperties(CURRENT_LAYOUT_KEY, getAllNoneMaintenanceLayouts().first())
83-
8478
logger.info("No current MOTD layout key found in service properties, setting to first layout.")
8579
}
8680

8781
if (getServiceProperties(CURRENT_MAINTENANCE_LAYOUT_KEY).isEmpty()) {
8882
setServiceProperties(CURRENT_MAINTENANCE_LAYOUT_KEY, getAllMaintenanceLayouts().first())
8983
setGroupProperties(CURRENT_MAINTENANCE_LAYOUT_KEY, getAllMaintenanceLayouts().first())
90-
9184
logger.info("No current maintenance MOTD layout key found in service properties, setting to first layout.")
9285
}
9386
}
@@ -96,6 +89,22 @@ class MotdLayoutHandler(
9689
fun getMotdLayout(name: String): MotdLayoutConfiguration =
9790
loadedMotdLayouts[name] ?: MotdLayoutConfiguration()
9891

92+
suspend fun getMaintenanceLayout(): MotdLayoutConfiguration {
93+
val maintenanceLayoutName = cloudControllerHandler.getServiceProperties(CURRENT_MAINTENANCE_LAYOUT_KEY).ifEmpty {
94+
logger.warning("No current maintenance layout found, using default maintenance layout as fallback.")
95+
DEFAULT_MAINTENANCE_LAYOUT_NAME
96+
}
97+
return getMotdLayout(maintenanceLayoutName)
98+
}
99+
100+
suspend fun getNonMaintenanceLayout(): MotdLayoutConfiguration {
101+
val nonMaintenanceLayoutName = cloudControllerHandler.getServiceProperties(CURRENT_LAYOUT_KEY).ifEmpty {
102+
logger.warning("No current non-maintenance layout found, using default layout as fallback.")
103+
DEFAULT_LAYOUT_NAME
104+
}
105+
return getMotdLayout(nonMaintenanceLayoutName)
106+
}
107+
99108
suspend fun getCurrentMotdLayout(): MotdLayoutConfiguration {
100109
val layouts = if (proxyPlugin.maintenance) getAllMaintenanceLayouts() else getAllNoneMaintenanceLayouts()
101110
val useRandomLayouts = cloudControllerHandler.getServiceProperties(RANDOM_MOTD_KEY).toBoolean()
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package app.simplecloud.plugin.proxy.shared.handler.command
2+
3+
interface CommandSender {
4+
5+
fun sendMessage(message: String)
6+
}
Lines changed: 164 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,164 @@
1+
package app.simplecloud.plugin.proxy.shared.handler.command
2+
3+
import app.simplecloud.plugin.proxy.shared.ProxyPlugin
4+
import app.simplecloud.plugin.proxy.shared.handler.MotdLayoutHandler
5+
import kotlinx.coroutines.runBlocking
6+
import org.incendo.cloud.CommandManager
7+
import org.incendo.cloud.context.CommandContext
8+
import org.incendo.cloud.parser.standard.StringParser.stringParser
9+
import org.incendo.cloud.suggestion.Suggestion
10+
import org.incendo.cloud.suggestion.SuggestionProvider
11+
import java.util.concurrent.CompletableFuture
12+
13+
class ProxyCommandHandler<C : CommandSender>(
14+
val commandManager: CommandManager<C>,
15+
val proxyPlugin: ProxyPlugin
16+
) {
17+
18+
fun loadCommands() {
19+
loadToggleMaintenanceCommand()
20+
loadActivateMaintenanceCommand()
21+
loadDeactivateMaintenanceCommand()
22+
23+
loadLayoutMaintenanceSetCommand()
24+
loadLayoutNonMaintenanceSetCommand()
25+
}
26+
27+
private fun loadToggleMaintenanceCommand() {
28+
commandManager.command(
29+
commandManager.commandBuilder("proxy")
30+
.literal("maintenance")
31+
.literal("toggle")
32+
.permission("simplecloud.command.proxy.maintenance.toggle")
33+
.handler { context: CommandContext<C> ->
34+
runBlocking {
35+
val mode = !proxyPlugin.cloudControllerHandler.getGroupProperties("maintenance").toBoolean()
36+
setProxyMaintenanceMode(mode)
37+
context.sender().sendMessage(proxyPlugin.messagesConfiguration.commandMessage.toggleMaintenance)
38+
}
39+
}
40+
.build()
41+
)
42+
}
43+
44+
private fun loadActivateMaintenanceCommand() {
45+
commandManager.command(
46+
commandManager.commandBuilder("proxy")
47+
.literal("maintenance")
48+
.literal("activate")
49+
.permission("simplecloud.command.proxy.maintenance.activate")
50+
.handler { context: CommandContext<C> ->
51+
runBlocking {
52+
if (!proxyPlugin.cloudControllerHandler.getGroupProperties("maintenance").toBoolean()) {
53+
setProxyMaintenanceMode(true)
54+
context.sender().sendMessage(proxyPlugin.messagesConfiguration.commandMessage.activateMaintenance)
55+
} else {
56+
context.sender().sendMessage(proxyPlugin.messagesConfiguration.commandMessage.maintenanceAlreadyActivated)
57+
}
58+
}
59+
}
60+
.build()
61+
)
62+
}
63+
64+
private fun loadDeactivateMaintenanceCommand() {
65+
commandManager.command(
66+
commandManager.commandBuilder("proxy")
67+
.literal("maintenance")
68+
.literal("deactivate")
69+
.permission("simplecloud.command.proxy.maintenance.deactivate")
70+
.handler { context: CommandContext<C> ->
71+
runBlocking {
72+
if (proxyPlugin.cloudControllerHandler.getGroupProperties("maintenance").toBoolean()) {
73+
setProxyMaintenanceMode(false)
74+
context.sender().sendMessage(proxyPlugin.messagesConfiguration.commandMessage.deactivateMaintenance)
75+
} else {
76+
context.sender().sendMessage(proxyPlugin.messagesConfiguration.commandMessage.maintenanceAlreadyDeactivated)
77+
}
78+
}
79+
}
80+
.build()
81+
)
82+
}
83+
84+
private fun loadLayoutMaintenanceSetCommand() {
85+
commandManager.command(
86+
commandManager.commandBuilder("proxy")
87+
.literal("layout")
88+
.literal("maintenance")
89+
.literal("set")
90+
.required(
91+
"layout",
92+
stringParser()
93+
) { _, _ ->
94+
val suggestionList = proxyPlugin.motdLayoutHandler.getAllMaintenanceLayouts().map { Suggestion.suggestion(it) }
95+
CompletableFuture.completedFuture(suggestionList)
96+
}
97+
.permission("simplecloud.command.proxy.layout.maintenance.set")
98+
.handler { context: CommandContext<C> ->
99+
val layout = context.get<String>("layout")
100+
101+
if (!proxyPlugin.motdLayoutHandler.getAllMaintenanceLayouts().contains(layout)) {
102+
context.sender().sendMessage(proxyPlugin.messagesConfiguration.commandMessage.layoutNotFound)
103+
return@handler
104+
}
105+
106+
if (MotdLayoutHandler.CURRENT_MAINTENANCE_LAYOUT_KEY == layout) {
107+
context.sender().sendMessage(proxyPlugin.messagesConfiguration.commandMessage.layoutMaintenanceAlreadySet)
108+
return@handler
109+
}
110+
111+
runBlocking {
112+
proxyPlugin.cloudControllerHandler.setServicePropertiesOnAllGroupServices(MotdLayoutHandler.CURRENT_MAINTENANCE_LAYOUT_KEY, layout)
113+
proxyPlugin.cloudControllerHandler.setGroupProperties(MotdLayoutHandler.CURRENT_MAINTENANCE_LAYOUT_KEY, layout)
114+
115+
context.sender().sendMessage(proxyPlugin.messagesConfiguration.commandMessage.layoutMaintenanceSet)
116+
}
117+
}
118+
.build()
119+
)
120+
}
121+
122+
private fun loadLayoutNonMaintenanceSetCommand() {
123+
commandManager.command(
124+
commandManager.commandBuilder("proxy")
125+
.literal("layout")
126+
.literal("nonmaintenance")
127+
.literal("set")
128+
.required(
129+
"layout",
130+
stringParser()
131+
) { _, _ ->
132+
val suggestionList = proxyPlugin.motdLayoutHandler.getAllNoneMaintenanceLayouts().map { Suggestion.suggestion(it) }
133+
CompletableFuture.completedFuture(suggestionList)
134+
}
135+
.permission("simplecloud.command.proxy.layout.nonmaintenance.set")
136+
.handler { context: CommandContext<C> ->
137+
val layout = context.get<String>("layout")
138+
139+
if (!proxyPlugin.motdLayoutHandler.getAllNoneMaintenanceLayouts().contains(layout)) {
140+
context.sender().sendMessage(proxyPlugin.messagesConfiguration.commandMessage.layoutNotFound)
141+
return@handler
142+
}
143+
144+
if (MotdLayoutHandler.CURRENT_LAYOUT_KEY == layout) {
145+
context.sender().sendMessage(proxyPlugin.messagesConfiguration.commandMessage.layoutNonMaintenanceAlreadySet)
146+
return@handler
147+
}
148+
149+
runBlocking {
150+
proxyPlugin.cloudControllerHandler.setServicePropertiesOnAllGroupServices(MotdLayoutHandler.CURRENT_LAYOUT_KEY, layout)
151+
proxyPlugin.cloudControllerHandler.setGroupProperties(MotdLayoutHandler.CURRENT_LAYOUT_KEY, layout)
152+
153+
context.sender().sendMessage(proxyPlugin.messagesConfiguration.commandMessage.layoutNonMaintenanceSet)
154+
}
155+
}
156+
.build()
157+
)
158+
}
159+
160+
private suspend fun setProxyMaintenanceMode(mode: Boolean) {
161+
this.proxyPlugin.cloudControllerHandler.setGroupProperties("maintenance", mode.toString())
162+
this.proxyPlugin.cloudControllerHandler.setServicePropertiesOnAllGroupServices("maintenance", mode.toString())
163+
}
164+
}

proxy-velocity/build.gradle.kts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,7 @@ dependencies {
1010

1111
compileOnly(rootProject.libs.simplecloud.event.wrapper.velocity)
1212
compileOnly(rootProject.libs.simplecloud.controller)
13+
14+
implementation(rootProject.libs.command.cloud.core)
15+
implementation(rootProject.libs.command.cloud.velocity)
1316
}

0 commit comments

Comments
 (0)