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

Commit c0b6474

Browse files
authored
Migrate commands to Cloud v2 (#50)
1 parent 52ccda9 commit c0b6474

File tree

10 files changed

+131
-212
lines changed

10 files changed

+131
-212
lines changed

build.gradle.kts

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,9 @@ repositories {
2424
maven("https://oss.sonatype.org/content/repositories/snapshots")
2525
}
2626

27-
val cloudVersion: String by project
2827
val luaKTVersion: String by project
28+
val cloudMinecraftVersion: String by project
29+
val cloudAnnotationsVersion: String by project
2930

3031
dependencies {
3132
testImplementation(kotlin("test"))
@@ -40,9 +41,9 @@ dependencies {
4041
api("com.github.only52607.luakt:luakt-core:$luaKTVersion")
4142
api("com.github.only52607.luakt:luakt-extension:$luaKTVersion")
4243
api("com.github.only52607.luakt:luakt-luaj:$luaKTVersion")
43-
library("cloud.commandframework:cloud-paper:$cloudVersion")
44-
library("cloud.commandframework:cloud-brigadier:$cloudVersion")
45-
library("cloud.commandframework:cloud-annotations:$cloudVersion")
44+
library("org.incendo:cloud-paper:$cloudMinecraftVersion")
45+
library("org.incendo:cloud-brigadier:$cloudMinecraftVersion")
46+
library("org.incendo:cloud-annotations:$cloudAnnotationsVersion")
4647
}
4748

4849
paper {
@@ -128,10 +129,15 @@ publishing {
128129

129130
tasks.test { useJUnitPlatform() }
130131

131-
tasks.withType<KotlinCompile> { kotlinOptions.jvmTarget = "17" }
132+
tasks.withType<KotlinCompile> {
133+
kotlinOptions.jvmTarget = "17"
134+
kotlinOptions.javaParameters = true
135+
}
136+
132137
kotlin {
133138
jvmToolchain {
134139
languageVersion.set(JavaLanguageVersion.of(17))
135140
}
136141
}
142+
137143
application { mainClass.set("MainKt") }

gradle.properties

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
kotlin.code.style=official
22

3-
cloudVersion=1.8.4
4-
luaKTVersion=2.6.1
3+
luaKTVersion=2.6.1
4+
cloudMinecraftVersion=2.0.0-beta.9
5+
cloudAnnotationsVersion=2.0.0-rc.2
Lines changed: 29 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -1,97 +1,52 @@
11
package xyz.galaxyy.lualink
22

3-
import cloud.commandframework.annotations.AnnotationParser
4-
import cloud.commandframework.arguments.parser.ParserParameters
5-
import cloud.commandframework.arguments.parser.StandardParameters
6-
import cloud.commandframework.bukkit.CloudBukkitCapabilities
7-
import cloud.commandframework.execution.CommandExecutionCoordinator
8-
import cloud.commandframework.execution.FilteringCommandSuggestionProcessor
9-
import cloud.commandframework.meta.CommandMeta
10-
import cloud.commandframework.paper.PaperCommandManager
11-
import io.leangen.geantyref.TypeToken
123
import org.bukkit.command.CommandSender
134
import org.bukkit.plugin.java.JavaPlugin
14-
import xyz.galaxyy.lualink.commands.AvailableScriptParser
15-
import xyz.galaxyy.lualink.commands.LoadedScriptParser
5+
import org.incendo.cloud.annotations.AnnotationParser
6+
import org.incendo.cloud.bukkit.CloudBukkitCapabilities
7+
import org.incendo.cloud.exception.ArgumentParseException
8+
import org.incendo.cloud.exception.handling.ExceptionHandler.unwrappingHandler
9+
import org.incendo.cloud.execution.ExecutionCoordinator
10+
import org.incendo.cloud.paper.LegacyPaperCommandManager
11+
import xyz.galaxyy.lualink.commands.arguments.AvailableScriptParser
12+
import xyz.galaxyy.lualink.commands.arguments.LoadedScriptParser
1613
import xyz.galaxyy.lualink.commands.LuaLinkCommands
14+
import xyz.galaxyy.lualink.commands.exceptions.ReplyingParseException
1715
import xyz.galaxyy.lualink.listeners.ServerLoadListener
18-
import xyz.galaxyy.lualink.lua.LuaScript
1916
import xyz.galaxyy.lualink.lua.LuaScriptManager
20-
import java.io.File
21-
import java.util.function.Function
2217

2318
class LuaLink : JavaPlugin() {
24-
private lateinit var manager: PaperCommandManager<CommandSender>
19+
private lateinit var manager: LegacyPaperCommandManager<CommandSender>
2520
private lateinit var annotationParser: AnnotationParser<CommandSender>
2621
private val scriptManager: LuaScriptManager = LuaScriptManager(this)
22+
2723
override fun onEnable() {
2824
this.server.pluginManager.registerEvents(ServerLoadListener(this.scriptManager), this)
29-
this.setupCloud()
30-
this.registerCommands()
25+
this.setupCommands()
3126
}
3227

3328
override fun onDisable() {
3429
val scripts = this.scriptManager.getLoadedScripts()
3530
scripts.forEach(this.scriptManager::unLoadScript)
3631
}
37-
private fun registerCommands() {
32+
33+
private fun setupCommands() {
34+
// Creating basic LegacyPaperCommandManager instance. We're not using PaperCommandManager here because it only supports 1.20.6 and higher.
35+
this.manager = LegacyPaperCommandManager.createNative(this, ExecutionCoordinator.simpleCoordinator())
36+
// Registering Brigadier integration if capable, or asynchronous completions otherwise. It's not recommended to have both capabilities registered.
37+
if (this.manager.hasCapability(CloudBukkitCapabilities.BRIGADIER))
38+
this.manager.registerBrigadier()
39+
else this.manager.hasCapability(CloudBukkitCapabilities.ASYNCHRONOUS_COMPLETION)
40+
// Creating AnnotationParser instance.
41+
this.annotationParser = AnnotationParser(this.manager, CommandSender::class.java)
42+
// Registering handler(s)...
43+
this.manager.exceptionController().registerHandler(ArgumentParseException::class.java, unwrappingHandler(ReplyingParseException::class.java))
44+
this.manager.exceptionController().registerHandler(ReplyingParseException::class.java) { it.exception().runnable.run() }
45+
// Registering parser(s)...
46+
this.annotationParser.parse(AvailableScriptParser(this, this.scriptManager))
47+
this.annotationParser.parse(LoadedScriptParser(this.scriptManager))
48+
// Registering command(s)...
3849
this.annotationParser.parse(LuaLinkCommands(this, this.scriptManager))
3950
}
40-
private fun setupCloud() {
41-
42-
val executionCoordinatorFunction = CommandExecutionCoordinator.simpleCoordinator<CommandSender>()
43-
44-
val mapperFunction: Function<CommandSender, CommandSender> = Function.identity()
45-
try {
46-
this.manager = PaperCommandManager( /* Owning plugin */
47-
this, /* Coordinator function */
48-
executionCoordinatorFunction, /* Command Sender -> C */
49-
mapperFunction, /* C -> Command Sender */
50-
mapperFunction
51-
)
52-
} catch (e: Exception) {
53-
logger.severe("Failed to initialize the command this.manager")
54-
/* Disable the plugin */server.pluginManager.disablePlugin(this)
55-
return
56-
}
57-
58-
// Use contains to filter suggestions instead of default startsWith
59-
60-
// Use contains to filter suggestions instead of default startsWith
61-
manager.commandSuggestionProcessor(
62-
FilteringCommandSuggestionProcessor(
63-
FilteringCommandSuggestionProcessor.Filter.contains<CommandSender>(true).andTrimBeforeLastSpace()
64-
)
65-
)
66-
67-
if (this.manager.hasCapability(CloudBukkitCapabilities.BRIGADIER)) {
68-
this.manager.registerBrigadier()
69-
}
7051

71-
if (this.manager.hasCapability(CloudBukkitCapabilities.ASYNCHRONOUS_COMPLETION)) {
72-
this.manager.registerAsynchronousCompletions()
73-
}
74-
75-
76-
77-
val commandMetaFunction: Function<ParserParameters, CommandMeta> =
78-
Function<ParserParameters, CommandMeta> { p ->
79-
CommandMeta.simple() // This will allow you to decorate commands with descriptions
80-
.with(CommandMeta.DESCRIPTION, p.get(StandardParameters.DESCRIPTION, "No description"))
81-
.build()
82-
}
83-
this.annotationParser = AnnotationParser( /* Manager */
84-
this.manager, /* Command sender type */
85-
CommandSender::class.java, /* Mapper for command meta instances */
86-
commandMetaFunction
87-
)
88-
89-
this.manager.parserRegistry().registerParserSupplier(
90-
TypeToken.get(LuaScript::class.java)
91-
) { LoadedScriptParser(this.scriptManager) }
92-
93-
this.manager.parserRegistry().registerParserSupplier(
94-
TypeToken.get(File::class.java)
95-
) { AvailableScriptParser(this, this.scriptManager) }
96-
}
9752
}

src/main/kotlin/xyz/galaxyy/lualink/commands/AvailableScriptParser.kt

Lines changed: 0 additions & 46 deletions
This file was deleted.

src/main/kotlin/xyz/galaxyy/lualink/commands/LoadedScriptParser.kt

Lines changed: 0 additions & 39 deletions
This file was deleted.
Lines changed: 23 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,10 @@
11
package xyz.galaxyy.lualink.commands
22

3-
import cloud.commandframework.annotations.Argument
4-
import cloud.commandframework.annotations.CommandDescription
5-
import cloud.commandframework.annotations.CommandMethod
6-
import cloud.commandframework.annotations.CommandPermission
7-
import cloud.commandframework.annotations.specifier.Greedy
8-
import cloud.commandframework.annotations.suggestions.Suggestions
9-
import cloud.commandframework.context.CommandContext
103
import org.bukkit.command.CommandSender
11-
import org.bukkit.entity.Player
4+
import org.incendo.cloud.annotation.specifier.Greedy
5+
import org.incendo.cloud.annotations.Command
6+
import org.incendo.cloud.annotations.CommandDescription
7+
import org.incendo.cloud.annotations.Permission
128
import org.luaj.vm2.lib.jse.JsePlatform
139
import xyz.galaxyy.lualink.LuaLink
1410
import xyz.galaxyy.lualink.lua.LuaScript
@@ -17,65 +13,53 @@ import java.io.File
1713

1814
@Suppress("unused")
1915
class LuaLinkCommands(private val plugin: LuaLink, private val scriptManager: LuaScriptManager) {
16+
17+
@Command("lualink reload <script>")
18+
@Permission("lualink.scripts.reload")
2019
@CommandDescription("Reload a Lua script")
21-
@CommandMethod("lualink reload <script>")
22-
@CommandPermission("lualink.scripts.reload")
23-
fun reloadScript(sender: CommandSender, @Argument("script") script: LuaScript) {
20+
fun reloadScript(sender: CommandSender, script: LuaScript) {
2421
val fileName = script.file.name
2522
this.scriptManager.unLoadScript(script)
2623
this.scriptManager.loadScript(File(this.plugin.dataFolder, "scripts/$fileName"))
2724
sender.sendRichMessage("<green>Reloaded script <yellow>$fileName<green>.")
2825
}
2926

3027
@CommandDescription("Unload a Lua script")
31-
@CommandMethod("lualink unload <script>")
32-
@CommandPermission("lualink.scripts.unload")
33-
fun unloadScript(sender: CommandSender, @Argument("script") script: LuaScript) {
28+
@Command("lualink unload <script>")
29+
@Permission("lualink.scripts.unload")
30+
fun unloadScript(sender: CommandSender, script: LuaScript) {
3431
this.scriptManager.unLoadScript(script)
3532
sender.sendRichMessage("<green>Unloaded script <yellow>${script.file.name}<green>.")
3633
}
3734

3835
@CommandDescription("Load a Lua script")
39-
@CommandMethod("lualink load <script>")
40-
@CommandPermission("lualink.scripts.load")
41-
fun loadScript(sender: CommandSender, @Argument("script") script: File) {
36+
@Command("lualink load <script>")
37+
@Permission("lualink.scripts.load")
38+
fun loadScript(sender: CommandSender, script: File) {
4239
this.scriptManager.loadScript(script)
4340
sender.sendRichMessage("<green>Loaded script <yellow>${script.name}<green>.")
4441
}
4542

4643
@CommandDescription("Disable a Lua script")
47-
@CommandMethod("lualink disable <script>")
48-
@CommandPermission("lualink.scripts.disable")
49-
fun disableScript(sender: CommandSender, @Argument("script") script: LuaScript) {
44+
@Command("lualink disable <script>")
45+
@Permission("lualink.scripts.disable")
46+
fun disableScript(sender: CommandSender, script: LuaScript) {
5047
scriptManager.disableScript(script)
5148
sender.sendRichMessage("<green>Disabled and unloaded script <yellow>${script.file.name}<green>.")
5249
}
5350

54-
@Suggestions("disabledScripts")
55-
@Suppress("unused")
56-
fun disabledScriptsSuggestions(sender: CommandContext<Player?>, input: String): List<String> {
57-
val suggestions = mutableListOf<String>()
58-
val scriptsFolder = File(this.plugin.dataFolder, "scripts")
59-
scriptsFolder.listFiles()?.forEach { file ->
60-
if (file.name.endsWith(".d") && file.name.startsWith(input)) {
61-
suggestions.add(file.name)
62-
}
63-
}
64-
return suggestions
65-
}
66-
51+
@Command("lualink enable <script>")
52+
@Permission("lualink.scripts.enable")
6753
@CommandDescription("Enable a Lua script")
68-
@CommandMethod("lualink enable <script>")
69-
@CommandPermission("lualink.scripts.enable")
70-
fun enableScript(sender: CommandSender, @Argument("script", suggestions = "disabledScripts") script: File) {
54+
fun enableScript(sender: CommandSender, script: File) {
7155
scriptManager.enableScript(script)
7256
sender.sendRichMessage("<green>Enabled and loaded script <yellow>${script.name}<green>.")
7357
}
7458

59+
@Command("lualink run <code>")
60+
@Permission("lualink.scripts.run")
7561
@CommandDescription("Run Lua code")
76-
@CommandMethod("lualink run <code>")
77-
@CommandPermission("lualink.scripts.run")
78-
fun runCode(sender: CommandSender, @Argument("code") @Greedy code: String) {
62+
fun runCode(sender: CommandSender, @Greedy code: String) {
7963
JsePlatform.standardGlobals().load(code).eval()
8064
}
8165
}

src/main/kotlin/xyz/galaxyy/lualink/commands/ScriptParserException.kt

Lines changed: 0 additions & 7 deletions
This file was deleted.

0 commit comments

Comments
 (0)